![unidbg逆向工程:原理与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/74/51906074/b_51906074.jpg)
3.4 unidbg的Hook
unidbg支持多种Hook框架,如HookZz、Dobby、xHook、whale等。此处我们使用HookZz来完成对32位so程序的Hook。
首先修改build/native-lib.cpp文件,如下所示,添加add函数来完成绝对值相加的操作。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-59.jpg?sign=1739435540-X8XIDwVYjnMrt0uMsYlCESFewzagXd0F-0-1d6c1d504265126390fb7392b9194c40)
接着重新编写MainActivity.java代码,并模拟执行add()方法,如图3-17所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-60.jpg?sign=1739435540-hJTCm7stMFeIMs0sXK2cV7IzyyeiezB8-0-c1c5cee02400a9a769b0518c907079ea)
图3-17 模拟执行add()方法
成功模拟执行add()方法后,接下来在MainActivity.java中编写hook()方法,如图3-18所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-61.jpg?sign=1739435540-iu1AMM73iT7BUR4psTz6lhDSrA7I5qCK-0-85bcb05ed3c9b8662fd046a0cf881f50)
图3-18 hook()方法
首先通过HookZz.getInstance()方法获取到HookZz实例,然后调用它的replace()方法。
replace()方法的第一个参数是需要被Hook的函数的首地址,可以通过IDA来查看,如图3-19所示。由于这里使用thumb指令集,因此需要对地址进行+1操作。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-62.jpg?sign=1739435540-kK7wiYDSISHlLpEKU6KHAwpOo0dAGn42-0-aeb77b1a635d739d57cd8c084aa22db2)
图3-19 IDA查看add函数地址
第二个参数是ReplaceCallback回调类,通过新建一个匿名内部类来传入。ReplaceCallback类有三个方法可供重写,其中两个onCall()方法是在函数执行之前执行,postCall()方法是在函数执行结束之后执行。postCall()方法默认是不执行的,需要配置第三个参数enablePostCall为true来启用。
onCall()有两个可重写的方法,区别在于是否带有参数context,该参数可用于读写寄存器相关内容。
在main()方法的“mainActivity.callAdd();”前调用该hook方法进行Hook,运行,可以观察到相应函数的Hook的执行流程,如图3-20所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-63.jpg?sign=1739435540-70S3FaULvjyMrlbHQiN011yeSPMHlJ8r-0-fde7482687c8d03724b119cc7c809073)
图3-20 Hook的执行流程
对于onCall()方法,可以在函数执行前获取和修改函数的参数,如图3-21所示。
对于postCall()方法,可以借助后端工厂来进行寄存器的写入操作,以达到修改返回值的目的,如图3-22所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-64.jpg?sign=1739435540-DwRmrs8N2HyKBPufU2IAiRNrYlF26tmP-0-d10f9d169edfed209f06b2580b98710b)
图3-21 调用onCall()方法获取和修改函数的参数
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-65.jpg?sign=1739435540-hxbNOlkfU0AJcwImviQjoExJXUdJsZG7-0-a3b899a5f565c152394282c2fb4d2824)
图3-22 调用postCall()方法修改返回值