首页
社区
课程
招聘
[旧帖] [原创]Android下的ARM机器码修改简述 0.00雪花
发表于: 2013-1-18 16:51 3042

[旧帖] [原创]Android下的ARM机器码修改简述 0.00雪花

2013-1-18 16:51
3042
先来看一段IDA反汇编出来的代码:
BL              _ZN18NativeToJavaBridge11GetInstanceEv ; NativeToJavaBridge::GetInstance(void)
LDR             R1, =(aError - 0x60590)
LDR             R2, =(aThisApplicatio - 0x60598)
MOV             R3, R7
ADD             R1, PC, R1 ; "Error"
STR             R7, [SP,#0x2C8+var_2C8]
ADD             R2, PC, R2 ; "This application encountered a Lua erro"...
STR             R7, [SP,#0x2C8+var_2C4]
BL          _ZN18NativeToJavaBridge15ShowNativeAlertEPKcS1_PS1_iPN3Rtt11LuaResourceE ;


然后说一下这段代码的意思:

第一个指令BL,意思是带链接的跳转,本例意思是执行后面那个函数;
第二个LDR是装载和存储单一字节或字的数据从/到内存,本例的意思是将后面地址的数据载入到R1寄存器上;
第三个类似第二个;
第四个MOV在8086中很常见,本例的意思如果不求甚解的话可以理解为R3=R7;
第五个ADD意思是将把两个操作数加起来,把结果放置到目的寄存器中;
第六个STR在本例的意思是将R7的内容存储到“#0x2C8+var_2C4”合成的地址,其中var_2C4在程序起始处有定义;

如果我们要让BL _ZN18NativeToJavaBridge15ShowNativeAlertEPKcS1_PS1_iPN3Rtt11LuaResourceE  这个语句不执行,可以使用这个方法,将其修改为:
MOV R0,R0


这个语句相当于做一次无用功,也就相当于实现了NOP。    

接下去就是怎么修改机器码的部分。先查询手册,查到MOV的机器码是0xE1A0(此处可能不同,主要看自己IDA反汇编出来的机器码是多少),然后用十六进制编辑器定位到最后一个BL的机器码,可直接用IDA查看HEX VIEW-A。偏移位为:0x00060598,然后再用十六进制编辑器跳到该位置,将其十六进制改为00 00 A0 E1。(有人可能会问,为什么机器码明明是0xE1A0,改的时候却要变成0xA0E1,原因在于高八位和低八位在文件中是倒置的)。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持下。。。。。。
2013-1-19 13:09
0
游客
登录 | 注册 方可回帖
返回
//