前言
前文说到使用基于LIEF的InlineHook实现 ,在这里我们再借助 keystone 和 capstone 来完善一下这个想法,解决一些比较枯燥且容易出错的事,比如 地址偏移的计算,指令备份还原 ...
简介
- 合并代码的操作和前文基本一致,不过这里我们导出四个函数
这四个函数都是全部使用asm(nop)填充的空白函数,并放置于.inject节区,合并的时候只合并该节
- GLOBAL_TABLE 用于存放我们需要初始化的一些值,可以理解我们自己写代码的.bss/.data ...等等的集合(由于这里的这个.inject 段属于代码段,没有写权限,建议需要写直接修改elf将整个loadable Segment 改为 rwx)
- STR_TABLE 由于用到字符串比较多,然后我就单独列出来了一个字符串表
- trampolines 跳板代码存放位置(1.环境的保存 2.跳转到textCodes 3.textCodes返回时跳转回原代码)
- textCodes 真实执行的代码位置 (hook代码存放位置)
- ins.addPtr(100) 是在往 GLOBAL_TABLE 添加一项
- ins.getStr("this is a test string!") 是再往 STR_TABLE 添加一项,同时也会添加到 GLOBAL_TABLE
- ins.addHook hook指定的地址并将上下文的状态保存好(trampolines),跳转到 textCodes 同时 setPC 到这个位置,这个位置我们就可以写自己的汇编代码逻辑
- ins.endHook() 结束一个hook,主要是从 textCodes 跳回到 trampolines
- ins.android_log_print(msg="called this function") 编写的汇编代码调用 log 的 demo ,这里后续可以去拓展到 strcmp strcat 再或者是一些我们常用到的一些其他函数
我这么描述可能还是不直观,直接上IDA看看我们效果
hook之后使用三条指令跳转到 trampolines
总结
- 继(基于LIEF的InlineHook实现)的想法落实。当时是还觉得没啥用,毕竟手动去计算偏移修改容易出错,没有效率就没有生产力
- 虽然目前这个版本只是个初版,一个简单的想法的实现,但是在满足工作需求的情况下一定程度的脱离 Dobby 的使用
- 还有很多需要完善的,比如dobby最核心的指令修复(现在就只能选点不需要修复的指令来hook emmmmm....)
- 如果要写文件记得手动去010修改一下loadable段属性
- 欢迎大家一起完善,争取搞一个类似动态hook框架的 静态hook框架
[手动狗头].png