快捷键没啥重要百度收集会有一些,关键是三个入口,还有一点用处吧,希望可以帮到一些人吧。把三个入口用,再加上改改源码,调试和改源码同时进行对于脱壳还是有一点效果的,以下纯属小白自娱自乐大神勿喷!啦啦,大王叫我来巡山,我把人间转一圈
一.ida快捷键
1.F2下断点
2.F7,f8单步步入
3.N重名
4.g跳到地址和函数名
5.u取消把函数汇编变成机器码
6.c就是把机器码变成汇编
7.F5
8.p分析函数,把机器码那些东西翻译成函数
9.ctrl+s看见系统所有的模块
10.ctrl+f搜索
11.单步调试注意右上角,寄存器变蓝色表示被改了
12.otions->number of opcode bytes可以查看机器码,填入4一行看4个机器码
13.在hex view-1按F2可以修改机器码,再次按F2确定修改
14.alt+g看是thumb还是arm指令
15.在函数名上按X可以看见上层调用
16.在f5伪c/c++代码的情况下,注释是/,汇编情况下注释是;
17.f4移动到光标处
18.在寄存器窗口按E可以修改寄存器的值
19.在内存窗口f2可以修改内存的值
二、三个入口
1.进入so的第一行代码
so的第一行 linker.cpp里面有一个callonfuncto()会执行.init , .init_array,
CallFunction("DT_INIT", init_func);
CallArray("DT_INIT_ARRAY", init_array, init_array_count, false);
void soinfo::CallFunction(const char* function_name UNUSED, linker_function_t function) {
if (function == NULL || reinterpret_cast<uintptr_t>(function) == static_cast<uintptr_t>(-1)) {
return;
}
TRACE("[ Calling %s @ %p for '%s' ]", function_name, function, name);
function(); //从这里进入so的init_array里面的函数
TRACE("[ Done calling %s @ %p for '%s' ]", function_name, function, name);
// The function may have called dlopen(3) or dlclose(3), so we need to ensure our data structures
// are still writable. This happens with our debug malloc (see http://b/7941716).
set_soinfo_pool_protection(PROT_READ | PROT_WRITE);
}
2.从libdvm.so进入JNI_Onload
dvmLoadNativeCode(const char* pathName,Object* classLoader,char* detail)
bool dvmLoadNativeCode(const char* pathName, Object* classLoader,char** detail){
{
handle = dlopen(pathName, RTLD_LAZY);
.....
vonLoad = dlsym(handle, "JNI_OnLoad");
OnLoadFunc func = (OnLoadFunc)vonLoad; //从这里进入JNI_OnLoad
version = (*func)(gDvmJni.jniVm, NULL); //这里就是libdvm.so执行到JNI_OnLoad的入口了
}
3.从libdvm.so进入so的的jni函数
void dvmPlatformInvoke(void* pEnv, ClassObject* clazz, int argInfo, int argc,const u4* argv, const char* shorty, void* func, JValue* pReturn)
{
................................
v17 = *v8;
result = a7(); //这里a7就进入了so层的jni函数了
if ( v10 )
v20 = a8;
if ( v10 )
................................
}
[培训]科锐逆向工程师培训第53期2025年7月8日开班!