首页
社区
课程
招聘
[原创]ida调试常用快捷键和三个重要入口
发表于: 2016-12-13 08:14 8002

[原创]ida调试常用快捷键和三个重要入口

2016-12-13 08:14
8002
快捷键没啥重要百度收集会有一些,关键是三个入口,还有一点用处吧,希望可以帮到一些人吧。把三个入口用,再加上改改源码,调试和改源码同时进行对于脱壳还是有一点效果的,以下纯属小白自娱自乐大神勿喷!啦啦,大王叫我来巡山,我把人间转一圈
一.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日开班!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 3974
活跃值: (2307)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
2
不错啊,有几个还不知道
2016-12-13 09:12
0
雪    币: 148
活跃值: (298)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大王叫我来巡山,我把人间转一圈
2016-12-13 09:16
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
4
这很ida,最关键的部分你没写idc,idapython用法
2016-12-13 09:51
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2017-3-1 10:24
0
雪    币: 39341
活跃值: (7510)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
esc返回上一级
2020-4-14 18:53
0
游客
登录 | 注册 方可回帖
返回