静态InlineHook的简单实现
静态InlineHook的简单实现

静态InlineHook的简单实现

Tags
Published
Sub-item
Parent item
Author
AI summary
本文介绍了静态InlineHook的实现,利用LIEF、keystone和capstone库简化地址偏移计算和指令备份还原的过程。实现包括导出四个函数,管理代码段、字符串表和跳板代码,支持hook功能并调用日志。尽管当前版本仍需完善,但已在一定程度上脱离了Dobby的使用,未来可望发展为类似动态hook框架的静态hook框架

前言

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

简介

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

总结

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