分享者才是学习中最大的受益者!
前言
这是系列文章的第七篇 我们继续
我们继续
ARM指令集


条件码表

三级流水线

环境搭建
连接真机

上传IDA中的android_server
我之前上传过了 就不上传了

切换root权限

运行程序


端口转发
adb forward tcp:23946 tcp:23946

安装APK到安卓机上
这次使用的是install
之前安装过了 就不搞了
adb install C:\javandk1.apk
打开ddms
挂起程序
adb shell am start -D -n com.example.javandk1/.MainActivity

ddms查看
变红色的了

IDA Debugger连接



搜索我们的android程序 双击进入即可

熟悉的页面 就来了

增加设置


F9运行一下
动态调试
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600


加载so库

然后运行一下 重新搜索
出现so库

双击进入 即可
继续搜索

IDA窗口了解

寄存器窗口

栈顶

栈底

hex
一个字节八位,四个字节是32位
一个十六进制数表示四位,两个十六进制数表示一个字节
这里的数据都是三十二位的,三十二位系统意思是可以处理2的32次方就是4G内存!

关闭的窗口
在这里打开

ndk动态调试实操
下断点
下断点

Yes即可
PC就是往下走
分析每一条指令
第一条指令解析
第一条指令是LDR指令
R0:F54BC000,R3:00000001


小箭头进来


ESC返回

F7单步步入
第二条指令解析
R2的值变成 00000004 进行了覆盖写入

F7单步步入
第三条指令解析

STR是栈顶指针 将寄存器的数据存储到存储器
SP 的值是FFEE2B60

点击箭头进来

内存里从右往左读就是小端,左往右读就是大端
小端存放
在前面 可以看到var_4 是被定义的-4的意思

是把LR的值给SP
继续单步步入

之前的栈顶是FFEE2B60
现在的栈顶是FFEE2B5C
60是十六进制的计算=6×16+0=96
然后在通过var_4就是-4=92
然后92在/16=5余12
商为5对应十六进制5
余数12对应十六进制C
所以这里就是FFEE2B60转换为FFEE2B5C
查看hex dump


从右往左存储
第四条指令解析
可看到第四条指令中,SP的值是FFEE2B5C,EC指向栈顶值F5240BA9

SUB 是减
SP减去0C,C是12
SP=5C=5×16+12-12=48/16=5余0->50
继续F7步入
栈顶 就变成了50

第五条指令解析
R1:00000000
SP:FFEE2B50
R2:00000004
ADD是加的意思
R1=SP+R2=5×16+0+0×16+4=84/16=5余4->54

继续步入
可以看到R1变成34(FFEE2B54)

第六条指令解析
R3:F5433D20
LDR
把右边中括号里面的值,放到R3中
中括号里面的值=R3+0×18=2×16+0+18=50/16=3余2->32

小箭头查看

20的值是:F50F0111 一样还是倒着看两位
没有就补0
继续步入

第七条指令解析
R2:00000004
MOVT指令
这里的T是高16位,进行进1

单步F7步入查看

第八条指令解析
R3:F50F0111
BLX,B是跳转,L是link链接,Ⅹ是状态
BLX:LR和T,PC会变
BL:LR和PC会变
BX:T和PC会变
理解一下:就是带链接又带状态的跳转!带链接就是会返回!
会跳到下一条指令的地址:F42B4058

F7单步步入观察T标志位:
请注意:这里我卡死了 重启了一下IDA 所以栈地址发生了改变。。

点击小箭头进来


ESC返回
往下看 最后 它是走到了这里

F4 选中

F7 单步步入 进行返回

成功返回
注:要想跳转分析指令
只需要重新在此处下断点,然后F9进去即可
静态so库分析
直接把so文件拖入IDA即可


Test2分析

注:流程图和文本图 空格切换

第一条指令解析

就是将[括号内的RO的值取出放入R12中
第二条指令解析

将R3~R5,LR入栈,满递减堆栈
满减递归
STMFD这个放在后面还会详解
第三、四条指令解析

MOV把R0的值给R4
然后直接把(aAge-0×1288)的偏移值给R2
双击aAge进来


这里自定义的成员变量
aAge表示这个00002C34地址
就是00002C34这个地址-0x1288数据产生的偏移值
然后把这个偏移值放入R2
ESC 返回
第五、六条指令解析

和上面很像
MOV把R1的值给R5
然后直接把(aLjavaLangStrin - 0×128C的偏移值给R3
双击aLjavaLangStrin进来

aLjavaLangStrin表示这个00002C20地址
就是00002C20这个地址·-0×128C·数据产生的偏移值
然后把这个偏移值放入R3
ESC 返回
第七、八条指令解析

ADD加,PC当前要执行的地址 +R2里面的值 的和 放入R2
这时候地址里面的数据就是age
PC当前要执行的地址 +R2里面的值 的和 放入R3
这时候地址里面的数据就是Ljava/lang/String
注:后面动态调试 还会继续说明
第九~十五指令解析

1、BLX执行后,R2存放的地址是下一跳的地址值,0000128C,这里T:0->1
2、R4的值取出放入R3
3、MOV把R5的值给R1赋值
4、把[R3,#0×24]地址里面的数据放入R3寄存器
5、MOV把R0的值给R2赋值
6、一样是BLX
7、MOV把R0的值给R4赋值
第十六~十八指令解析

1、BL:不带状态
只有B带上X才表示即将执行的指令会发生一个指令集的变化即ARM变成tumb或者是thumb变成ARM
那么这里只是BL不带X,所以T是不会变动的,就是单纯的把地址放入LR
2、MOV把R0的值给R2赋值
3、LDMED和 STMFD是对应存在的,会在后面的动态调试进行解释
OK 这次就到这里
- 本文作者: 略略略
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/740
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!