首页
社区
课程
招聘
[原创]ARM反汇编笔记贴
2011-2-7 15:25 31527

[原创]ARM反汇编笔记贴

2011-2-7 15:25
31527
占个位置,记录反汇编的学习笔记.
--------------------------- 第一条 ---------------------------
最快的学习,莫过于对着代码找,那么,从google上下载了os_monitor的apk和源代码
把apk改zip解压,然后到\lib\armeabi找到libosmonitor.so,用IDA打开呗.
打开源代码的jni文件夹,随便找一个函数,我找的是JNI_OnUnload:

void JNI_OnUnload(JavaVM* vm, void* reserved)
{
	JNIEnv *env;
	jclass cls;

	if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_4))
		return;

	cls = (*env)->FindClass(env, classPathName);
	(*env)->UnregisterNatives(env, cls);

	return;
}


到IDA里翻出这个函数:
> JNI_OnUnload; var_C = -0xC <
PUSH   {R4,LR}
LDR     R3, [R0]
LDR     R4, =loc_8E66
SUB     SP, SP, #8
LDR     R3, [R3,#0x18]
ADD     R1, SP, #0x10+var_C
LDR     R2, =0x10004
ADD     R4, PC
BLX     R3
CMP     R0, #0
BNE     loc_4858
LDR     R0, [SP,#0x10+var_C]
LDR     R2, =0xFFFFFF34
LDR     R3, [R0]
LDR     R1, [R4,R2]
LDR     R3, [R3,#0x18]
BLX     R3
ADDS    R1, R0, #0
LDR     R0, [SP,#0x10+var_C]
MOVLS   R3, 0x360
LDR     R2, [R0]
LDR     R3, [R2,R3]
BLX     R3
loc_4858:
ADD     SP, SP, #8
POP     {R4,PC}
 ; End of function JNI_OnUnload


1. PUSH   {R4,LR} 这句肯定是保护现场的

2. LDR     R3, [R0]
上来就是寄存器操作,参数哪去了呢?于是看了几个函数,对比一下比较容易得到是寄存器传参数的.
R0为第一个参数,R1为第二个,依次类推...
这里就是R3=*R0;

3. R4, =loc_8E66 (未知,可能是某部分全局变量块的偏移)

4. SUB     SP, SP, #8
类似于C里申明局部变量的方法,四字节对齐,那就是两个变量啦...
JNIEnv *env;
jclass cls;

5. LDR     R3, [R3,#0x18]
这个自然让人想到C++里对class的反汇编,R3->0x18,R3=*R0,R0是第一个参数vm
对照后,有R3现在为(*vm)->GetEnv(...)

6. ADD     R1, SP, #0x10+var_C
R1=SP+0x10-0x0c=SP+4
取第一个局部变量的地址,应该是&env

7. LDR     R2, =0x10004 一个常数,JNI_VERSION咯

8. ADD     R4, PC (未知,应该是计算出某全局变量块的绝对偏移)

7. BLX     R3
这里就是call了,R3现在指着(*vm)->GetEnv(...)呢...
参数是什么呢?R0现在是vm,R1现在是&env,R2现在是0x10004,R4现在是[pointer]
对照一下上面的代码,应该是运行
(*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_4)
得到的值返回给R0

8. CMP     R0, #0
    BNE     loc_4858
如果R0≠0,那么跳转到loc_4858

9. LDR     R0, [SP,#0x10+var_C] ; R0=env
    LDR     R2, =0xFFFFFF34 ; R2 = 0xFFFFFF34; 应该看成个负数
    LDR     R3, [R0] ; R3=*env;
    LDR     R1, [R4,R2] ; R1=*(R4+R2); 得到了一个全局变量的值,对应classPathName
    LDR     R3, [R3,#0x18] ; R3=(*env)->FindClass(...)
    BLX     R3 ; R0 = (*env)->FindClass([R0]env, [R1]classPathName)
    ADDS    R1, R0, #0 ; [R1]cls = R0;

10. LDR     R0, [SP,#0x10+var_C]; R0 = env;
      MOVLS   R3, 0x360 ; if(R1<=0) R3=0x360;
(LS标志) LS - C clear or Z set (unsigned lower or same) 带符号的小或相等
      LDR     R2, [R0] ; R2=*env;
      LDR     R3, [R2,R3] ; R3=(*env)->UnregisterNatives(...)
      BLX     R3 ; R0 = (*env)->UnregisterNatives([R0]env,[R1]cls);
loc_4858:
11. ADD     SP, SP, #8 平衡堆栈
      POP     {R4,PC} 还原, return;

这样简单的函数就可以很容易按这种方法分析了;
后面的笔记再慢慢补充吧...
欢迎大家也分享笔记^_^

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 7
打赏
分享
最新回复 (10)
雪    币: 335
活跃值: (253)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
peterchen 2011-4-18 16:48
2
0
实例这样*.so都好像是arm汇编,如果有反汇编过windows mobile or wince之类都好像没有多大变化。而且可以有更详细逆向教程可以参考...
雪    币: 338
活跃值: (103)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
kkmylove 2 2011-5-16 08:44
3
0
顶一个 需要这杨的文章
雪    币: 37
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
枫叶飘 2011-5-17 12:57
4
0
很简洁,很明确,不错!
雪    币: 413
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lxwchm 2011-5-21 17:59
5
0
正在学汇编,学习一下~~~~~~~~~~
雪    币: 8409
活跃值: (2920)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tydzjing 2011-6-4 23:00
6
0
现在越来越流行arm了 确实需要多学习一下
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kuteng 2013-3-14 11:27
7
0
好文,易懂。谢谢指点
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
giveyou 2013-8-8 15:52
8
0
好文,易懂。谢谢指点
雪    币: 341
活跃值: (1763)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
sungy 1 2013-8-11 00:23
9
0
ios下都是arm的,可以搞苹果的软件分析了
雪    币: 86
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
threewind 2013-11-8 16:55
10
0
MOVLS   R3, 0x360 ; if(R1<=0) R3=0x360;

怎么看出是if(R1<=0)呢
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
sierra 1 2013-11-8 19:55
11
0
虽然对你另一帖涉嫌挖坟的无意义顶帖行为感到怎么说呢,不过这一帖还是可以的。
movls是条件传送指令。
游客
登录 | 注册 方可回帖
返回