修改可执行文件二进制
前言
由于许多程序代码里面包含有一些关键的C函数,大部分C函数的符号都去掉了,随着软件更新,这函数的名称可能发生变化,之前hook这部分函数用的都是动态的方法,就是查找这个函数的模块地址,动态修改二进制。有的时候,上面这种方法就显得比较麻烦了。可能直接静态的修改可执行文件的二进制还要方便快捷
例子
1 |
|
上面这个函数利用isBrandNew
判断是不是第一次见面,第一次见面就打印Nice to meet you!
,否则就打印How about you?
编译执行cc main.c -o main
查看并修改二进制
用 Hopper 查看汇编代码
仔细看看这段汇编后的代码
黄框里面对应的是i==0
为真的逻辑,红框的逻辑其实就是返回值存w0
退栈
修改二进制,去掉第一次见面逻辑
这个很简单,把图中loc_100003edc
里面的mov w8, #0x1
修改为mov w8, #0x0
鼠标点击这一行代码,让编辑光标定位到这一行,然后点击菜单栏的Modify -> Assemble Instruction
输入mov w8, #0x0
,然后点击Assemble and Go Next
最后通过菜单栏File -> Produce New Executable
即可,不过这个功能需要许可证,我没有许可证,我们可以看看最后改了哪些16进制
可以看到修改后的地方用红框标出来了
我们按快捷键撤销修改,看看修改前的16进制
选中其中20字节,不能选中这一行,因为Hopper显示的是22列,而arm定长指令为4字节,拷贝20字节方便修改
同样的方法拷贝修改后的20字节
1 | # 修改前 |
用Vim来替换16进制
1 | vim -b main # -b表示2进制方式打开 |
输入%!xxd -g 1 -c 22 -u
显示效果匹配Hopper
- -g 控制每组的字节数
- -c 控制显示列数
- -u 用大写显示
显示效果如下
搜索定位到了
发现只匹配了一行,下面用vim的替换功能
1 | :%s#40 B9 A8 00 00 35 01 00 00 14 28 00 80 52 E8 0F 00 B9 03 00 00 14#40 B9 A8 00 00 35 01 00 00 14 08 00 80 52 E8 0F 00 B9 03 00 00 14# |
关键的部分修改成功了,但右边对应的ASCII码还没变,用%!xxd -r
写回16进制
但执行不了了,哈哈哈哈😄
- 本文链接: https://ourfor.top/article/binary-code-modify/
- 版权声明: 本博客所有文章除特别声明外,均采用 ©BY-NC-SA 许可协议。转载请注明出处!