IDA PRO 逆向工程要点

1 IDA pro 进行动态分析的流程。
尤其是 启动阶段下断点的方法。 之前网上搜过,但是没记录下来?
1
E:\javaDev\android-sdk\platform-tools>adb push android_server /data/local/tmp/
2
E:\javaDev\android-sdk\platform-tools>adb shell
3 获取root权限
shell@t03gchnduos:/ $ su
4
root@t03gchnduos:/ # cd /data/local/tmp
root@t03gchnduos:/data/local/tmp # chmod 755 android_server
5
root@t03gchnduos:/data/local/tmp # ./android_server

6 再开一个命令行窗口
adb forward tcp:23946 tcp:23946

7 打开IDA 进行进程附加

2 vs 工程是怎么建起来的

3 常用的技巧哪些?
脚本编写是一个
IDA使用技巧:
某些调用函数的地方, 参数个数分析不正确, 尤其是在使用栈传递额外参数的时候,
此时,在调用指令处按F5, 强制再分析一遍, 可能会分析正确!
对于较为复杂的流程结构(浮点相关除外),IDA 的翻译很少出问题。 可以直接使用,但整数指令 的合并较多, 不确定是否全都正确!尤其是涉及到位操作的时候

IDA 对于 栈中 数组和结构体 基本 识别不到,会出问题!
IDA对流程跳转的分析往往比较准确,尤其是用do while和goto处理跳转。
但由浮点数运算导致的 跳转识别不到

2016年5月5日16:16:29
第一遍翻译的时候, 不要合并太多指令成一个表达式, 这样容易出错。
应该大量逐句翻译, 测试完毕, 保证正确后,再进行表达式合并和简化。
2016年5月11日15:15:56
Ida 对于没有子函数调用,没有浮点数, 没有局部数组的函数的翻译是正确的

2016年5月13日09:53:37
碰到连续的浮点数填充, 有可能是在构造数组, 不要逐行翻译!这样是无效的

2016年5月13日17:20:38
一定要化整为零, ! 逐步保证所作的工作 是正确的!
不要一次性搞一大坨!出了错都不知怎么找。。。

2016年5月23日14:08:31
IDA 抠大量数据是使用快捷,在内存区起始地址, Alt+L, 对应菜单的编辑->开始选择
然后在内存区,按G, 输入目标地址, 这时会跳转到目标地址, 使用键盘上的右方向键向右进行选择若干列即可!

2016年6月1日10:29:05
编译器对整除除法会进行优化, IDA能识别到这一点。
比如除以10, 可以先用 UMULL 乘以 0xcccccccd, 再将高32位右移3位,即得到商
4 偏僻的指令有哪些
Uxth,
示例, r10 = 0xfffffffb
uxth r3, r10
后, r3 = 0x0000fffb

Smull 指令, ida 6.6无法翻译此指令
r1 = 0x0000fffb, 低16位当成有符号数即为 -5
smulbb r1, r1, r1
结果为 r1 = 0x00000019, 即 25

对于单精度浮点数的十六进制表示:
IDA PRO 逆向工程要点_第1张图片
UBFX R2, R1, #0x17, #8
可获取 r1 表示的浮点数的指数部分
比如, r1 = 11.0, 如上 r2 = 0x82
5 容易出错的有哪些点
浮点指令里说对结果求反,就是指 取相反数
RSBS R2, R2, #1
MOVCC R2, #0
这种,先运算,并修改标志位, 然后判断。
直接 r2 = 1-r2; 然后 if(1 < r2) 就出错了。必须先用一个变量保存比较信息,再运算

Vs调试时, 某些时候在函数开始时下断点会导致莫名其妙的问题(对SP进行修改的指令更容易出问题?)。 因此,稳妥起见,还是在几条指令后再下断点. 出现这个问题也可能是用的测试机不行

Ida 对某些浮点立即数的解析存在问题, 精度不够高。 VS没有这样的问题。

一些填充数组的代码里面 包含一两条 保存数据或者其他的指令,导致容易发生指令遗漏

注意不要遗漏 函数调用 对 r0 的影响!
读取整数数组的时候, 使用 int 比 unsigned int 安全, 因为读取的数可能是负数,使用无符号数读取,后续运算易出错!

IDA 翻译出的VCVTR 指令,似乎 vs 翻译不出来。。此时,可能出现 两者运行结果不一致的情况。这个要引起注意!

6 重要的知识点
LR 寄存器的主要作用
在使用 隐式函数调用时, 一般会用到 LR寄存器,
还有哪些场合? 使用栈来传递额外参数?

GDB 常用指令
b *(0x5bae48a0-0xf8a0+0xB48B8)
i sh
Delete breakpoints 删除所有断点
Disable n 利用序号禁用某个断点

2016年5月28日17:27:45
使用 AWK 翻译全部代码,注意事项有哪些?
1 判断和跳转
CMP 和跳转语句一起翻译,使用 goto 翻译

2 函数开头结尾、
3 一些指令 好像是先从 内存读取浮点数的十六进制到整数寄存器,再从整数寄存器转到浮点寄存器? 这种情况就容易出错
VLDR S15, [R2]
VMOV R10, S15
STR R10, [R8,R3]
上面是一种典型的情况, 把浮点数十六进制存到整数寄存器中,然后存入内存
如果 int r10 = s15; 这就会导致舍入。 该怎么翻译!
uint32 r10 = (uint 32)&s15;

2016年5月29日16:53:17
关键帧还是 各种跳转指令翻译起来比较麻烦。。 大概目前碰到过12 中跳转指令!
还好不是几十种!
还有浮点数的跳转, 这个需要引起注意!
MOV LDR STR 是绝大部分用到的指令!

2016年5月29日17:04:15
CMP 和跳转往往并不相邻! 这个要引起注意!
需要想个办法!

2016年5月30日09:09:07
碰到 CMP ,使用两个变量 记录 两个操作数!

2016年6月1日10:32:52
逐行翻译, 实际上是给 ARM 汇编写一个解释器!
解释器本身用AWK实现, 用C++代码进行解释! 是这样的!
2016年6月1日20:18:17
刚才翻译了 CMP, B , BNE,
看到如下这几条指令, 翻译要小心啊!
LDMIA R4, {R0-R2}
LDMIB R12, {R10,LR}
STMIA R4, {R3,R10,LR}
STMIA R12, {R0-R2}

R0 = (uint32)(r4);
r4 += 4;
R1 = (uint32)(r4)

2016年6月1日20:24:20
一个关键的问题是, 从内存中读出的整数, 是赋给int 还是赋给 unsigned ??
好像目前碰到负数的情况不多?
弄成 int 在多数时候比较保险! 在比较指令的时候如果是无符号数比较,则进行强行转换

碰到这种要返回:
.text:00045854 ADD SP, SP, #0x64
.text:00045858 VPOP {D8-D13}
.text:0004585C LDMFD SP!, {R4-R11,PC}

BL 这种再处理下,好像就OK 了!

2016年6月6日11:57:04
如果对IDA 翻译结果基础之上 进行处理, 那么,
浮点指令,相对寻址获取值, 寄存器需要人工定位,
更大的问题是, 浮点数引起的 条件判断, 以及栈中浮点数组的处理!

你可能感兴趣的:(C++)