入坑逆向已经快小半个月了,不得不说入门逆向工程真的难,总结一下小收获。
一 IDA中的伪代码
在解答reversing.kr中的easykengen的逆向时,IDA反汇编中有一段语句如下:
sprintf(&v13,aS02x,&v13,*(&input + v3++) ^ *(&v6 + i));
代码中二个点:
C指针查缺补漏:
1.printf细节:
printf("a=%d",a);其中,a=%d是格式控制,后面的a是输出列表。%d是格式说明,其中%是引导符,d是格式字符。
逆向反汇编常用格式字符为o:无符号八进制u,X/x十六进制,u无符号十进制,d带符号十进制(正数不输出符号),s:字符串,c:以字符形式输出,只输出一个字符。
格式控制中格式字符的个数与输出列表个数相等,且位置一一对应。
2.指针:
计算机对所有存储单元进行统一编号,每个存储单元都有一个唯一的编号,称为该存储单元的地址编码。 ,计算机内存地址编码是线性的。
一个数据占据的若干存储单元中的第一个单元地址称为该数据的地址。同时程序运行时所占用的存储单元是排他性的,一旦被占用则不润许在存储其他内容,程序运行结束释放空间。
&是取地址符号,适用于任何类型的变量,返回值是一个地址,常用十六进制数表示。
*是指针运算符。(int *p = &x;) == (int *p; p = &x;), p是指针变量。
&*p == p(地址) 而*&a == a(任何变量)
第一个数组元素的地址称为首地址,数组名被定义为&数组名[0]。对于数组a,a+i就是&a[i],所以a[i]可以用*(a+i)表示。
- sprintf(*char *str, const char *format,)发送格式化输出到指针str所指向的字符串。
- 伪代码中的aS02x等价于%s%02x,将长度为2的十六进制发送到&v13,即将字符的ASCII送入v13,长度不够用0填充,如果时%2x的话就是长度不够用空格填充。
二 OD
OD常用快捷键:
F2:设置断点。(ctrl)F7:单步步入。(ctrl)F8:单步步过。 F4:运行到光标。 F9:运行到断点。Ctrl+F9:从F7步入的代码段中返回之前的代码段。