静态InlineHook的简单实现

前言

前文说到使用基于LIEF的InlineHook实现 ,在这里我们再借助 keystone 和 capstone 来完善一下这个想法,解决一些比较枯燥且容易出错的事,比如 地址偏移的计算,指令备份还原 ...

简介
  1. 合并代码的操作和前文基本一致,不过这里我们导出四个函数
    这四个函数都是全部使用asm(nop)填充的空白函数,并放置于.inject节区,合并的时候只合并该节
记录下用到的四个表,以及要hook的函数
  • GLOBAL_TABLE 用于存放我们需要初始化的一些值,可以理解我们自己写代码的.bss/.data ...等等的集合(由于这里的这个.inject 段属于代码段,没有写权限,建议需要写直接修改elf将整个loadable Segment 改为 rwx)
  • STR_TABLE 由于用到字符串比较多,然后我就单独列出来了一个字符串表
  • trampolines 跳板代码存放位置(1.环境的保存 2.跳转到textCodes 3.textCodes返回时跳转回原代码)
  • textCodes 真实执行的代码位置 (hook代码存放位置)
hook操作
  1. ins.addPtr(100) 是在往 GLOBAL_TABLE 添加一项
  2. ins.getStr("this is a test string!") 是再往 STR_TABLE 添加一项,同时也会添加到 GLOBAL_TABLE
  3. ins.addHook hook指定的地址并将上下文的状态保存好(trampolines),跳转到 textCodes 同时 setPC 到这个位置,这个位置我们就可以写自己的汇编代码逻辑
  4. ins.endHook() 结束一个hook,主要是从 textCodes 跳回到 trampolines
  5. ins.android_log_print(msg="called this function") 编写的汇编代码调用 log 的 demo ,这里后续可以去拓展到 strcmp strcat 再或者是一些我们常用到的一些其他函数

我这么描述可能还是不直观,直接上IDA看看我们效果

原来的样子

hook之后使用三条指令跳转到 trampolines

hook之后
进入到trampolines
进入到textCodes
GLOBAL_TABLE
STR_TABLE
总结
  1. 继(基于LIEF的InlineHook实现)的想法落实。当时是还觉得没啥用,毕竟手动去计算偏移修改容易出错,没有效率就没有生产力
  2. 虽然目前这个版本只是个初版,一个简单的想法的实现,但是在满足工作需求的情况下一定程度的脱离 Dobby 的使用
  3. 还有很多需要完善的,比如dobby最核心的指令修复(现在就只能选点不需要修复的指令来hook emmmmm....)
  4. 如果要写文件记得手动去010修改一下loadable段属性
  5. 欢迎大家一起完善,争取搞一个类似动态hook框架的 静态hook框架

[手动狗头].png

你可能感兴趣的:(静态InlineHook的简单实现)