所谓InlineHook
就是直接修改目标函数的头部代码。让它跳转到我们自定义的函数里面执行我们的代码,从而达到Hook的目的。这种Hook技术一般用在静态语言
的HOOK上面。fishhook和dobby都是inlinehook。
一、Dobby简介
HookZz的升级版,Dobby 通过 mmap 把整个 Mach-O 文件映射到用户的内存空间,写入完成保存本地。所以 Dobby 并不是在原 Mach-O 上进行操作,而是重新生成并替换。
二、 编译Dobby
由于Dobby是跨平台的,所以项目并不是一个Xcode工程,要使用cmake将这个工程编译成为Xcode工程。
#depth用于指定克隆深度,为1即表示只克隆最近一次commit.
git clone https://github.com/jmpews/Dobby.git --depth=1
#编译xcode
cd Dobby && mkdir build_for_ios_arm64 && cd build_for_ios_arm64
cmake .. -G Xcode \
-DCMAKE_TOOLCHAIN_FILE=cmake/ios.toolchain.cmake \
-DPLATFORM=OS64 -DARCHS="arm64" -DCMAKE_SYSTEM_PROCESSOR=arm64 \
-DENABLE_BITCODE=0 -DENABLE_ARC=0 -DENABLE_VISIBILITY=1 -DDEPLOYMENT_TARGET=9.3 \
-DDynamicBinaryInstrument=ON -DNearBranch=ON -DPlugin.SymbolResolver=ON -DPlugin.Darwin.HideLibrary=ON -DPlugin.Darwin.ObjectiveC=ON
三、 DobbyDemo
核心方法:
// replace instruction
MemoryOperationError CodePatch(void *address, uint8_t *buffer, uint32_t buffer_size);
// replace function
int DobbyHook(void *address, void *replace_call, void **origin_call);
// hook addrsss
int DobbyInstrument(void *address, DBICallTy dbi_call);
demo:
参考:
iOS-逆向-InlineHook
iOS Hook 原理 - InlinehHook (Dobby)