1,编译参数能够设置类名和其成员函数名能被逆向出来,简单的是设为debug模式.release下也可以,具体设置回头总结。
2,代码里即便是类的静态成员函数,其参数甚至函数本身,都可能会被编译器优化掉,填充一些会计算到所有参数的较复杂代码,能解决设个问题。填充下游函数还需要一些技巧。
3,汇编对类型很敏感,int到float的强转什么的,要注意编译器的理解。
4,构造函数不和new出现在一起,而是出现在其他成员函数里面,提示是结构体的构造函数。
5,结构体参数,结构体成员可以占用r1,r2寄存器。
6,short*动态创建short数组,数组的size为int类型,编译器会生成这样的代码v9 = 2 * a3;
if ( __CFADD__(a3, a3) )
v9 = -1;。因为c代码里的数组字面尺寸还没有乘以元素尺寸。
7,返回值为结构体的类成员函数,r0会保留为返回值,r1为this,r2以后为参数,导出符号只有r2以后的类型作为后缀。
8,调用下游函数,要注意下游函数的编译是否正确,成员函数如果没有使用this指针的地方,编译器会忽略掉把this指针传递进去。
9,orr是按位或,网上有说没有被操作数处理到的位置0,是不对的。所有位按位或。
10,ida调试IT指令有坑?:
libHero.so:765004FC PUSH {R7,LR}
libHero.so:765004FE ORR.W LR, R3, R2
libHero.so:76500502 MOVW R12, #0xFFFF
libHero.so:76500506 CMP.W LR, #0
libHero.so:7650050A ITTT GE
libHero.so:7650050C ADDGE.W R0, R0, R1,LSL#2
libHero.so:76500510 LDRGE R1, [R0,#0x44]
libHero.so:76500512 CMPGE R1, R3
libHero.so:76500514 BGT loc_7650051C
libHero.so:76500516
libHero.so:76500516 loc_76500516 ; CODE XREF: libHero.so:76500530↓j
libHero.so:76500516 UXTH.W R0, R12
libHero.so:7650051A POP {R7,PC}
地址位数506处的cmp.w lr,#0 当lr>=0时后面单步步入到50c以后,如果510 512不下断点,那么从50c再次单步执行就直接到516了。甚至把51c接的好几条指令都略过了!
11,如果循环判断一个bool值,那么会有while(x<<24)这样的编译结果。