首页
论坛
课程
招聘
[原创]Arm汇编层面理解inlinehook
2020-9-5 07:56 4787

[原创]Arm汇编层面理解inlinehook

2020-9-5 07:56
4787
执行hook之前
 

执行hook之前

执行hook之后
 

执行hook之后

  • 明显看到了替换了前面4条thumb指令,共计8字节
  • DF F8 00 F0 这条指令翻译过来就是 ldr.w pc, [pc, #0]
    (三级流水线,也就是说ADD R2, PC指令在取码的时候,刚好我们准备的跳转指令正在译码,而最终执行的代码是我们译码的代码,译码这个时刻我们的pc就是当前跳转的指令位置,具体可以结合下面字符串寻址的思路理解0xCE010E62)
  • 前面被跳转指令替换的四条thrumb指令会被写到我们的自定义新函数开始
  • 在thumb指令集中R7一般用来作为FP

- 怎么进入新函数

函数进入
 

函数进入

新函数分析
 

新函数分析

- 函数调用

  • 新函数源码在此
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    jstring new_Func1(JNIEnv *env, jobject *jobject) {
      LOGD("Called new_Func1");
      jstring ret = (jstring) old_fuc_1(env, jobject);
      const char *str_stc = env->GetStringUTFChars(ret, NULL);
      LOGD("修改前的ret = %s", str_stc);
      jclass jMainAct=env->FindClass("com/lzy/inlinehook/MainActivity");
      jmethodID jm_makeText=env->GetStaticMethodID(jMainAct,"show","()V");
      env->CallStaticVoidMethod(jMainAct,jm_makeText,NULL);
      return env->NewStringUTF("Hook this return value");
    }
  • C函数调用其实和正常的没啥区别,着重看他调用原函数
    (这里我就直接定位0xCE3CE448)

    定位0xCE3CE448

    定位0xCE3CE448

  • 接着进去R2看他做了什么事情
    (简单来说就是修改了进入之前已经压栈的LR,这样老函数退出的时候才能返回新函数调用老函数的下一条指令)

调用原函数
 

调用原函数
这里涉及到的静态值是inlinehook onhook时候做的事情,这个debug区域都是动态生成的,这里这涉及已经形成的代码逻辑分析,怎么算的还请看源码

老函数调用返回位置修改
 

老函数调用返回位置修改

新函数的返回位置
 

新函数返回位置

- 怎么退出新函数的

函数退出
 

函数退出


[2022冬季班]《安卓高级研修班(网课)》月薪两万班招生中~

最后于 2020-10-8 10:17 被唱过阡陌编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (2)
雪    币: 584
活跃值: 活跃值 (11145)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 活跃值 8 2020-9-5 09:52
2
0
图片丢失,麻烦重新帖一下。
雪    币: 1435
活跃值: 活跃值 (3689)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
唱过阡陌 活跃值 1 2020-9-5 10:27
3
0
kanxue 图片丢失,麻烦重新帖一下。
ok ~ 
游客
登录 | 注册 方可回帖
返回