分享者才是学习中最大的受益者!
前言
这是系列文章的第七篇 我们继续
我们继续
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
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!