之前我们的例子还没有分析完成,由于 算法分析部分会单独成一个系列,所以就不继续了,该系列的核心还是在于IDA的使用。
本篇再介绍一些其他的IDA使用技巧,有些技巧在特定的地方会很好用。
数据转换
我们在文本视图里面,经常会看到这样的东西:
有没有好奇过,这个 db 是什么意思呢?
byte / char / uint8 / int8 -> db 1个字节
word / short / uint16 / int16 -> dw 2个字节
dword / int / uint … -> dd 4个字节 (32位指针)
qword / int64 … -> dq 8个字节 (64位指针)
大部分情况下,整数以小端序存储在内存,比如 0xA1B2C3D4 存储到内存的顺序为 D4 C3 B2 A1。
我们看上图中的字符串,它们其实储存的方式也是一个一个的字节,只不过 ida 帮我们显示的漂亮了,可以算一下两个字符串之间的地址距离。
我们在字符串那一行,按一下 D 键,效果如下:
可以看到,每个字符都拆成了一个一个的字节,每个字节都是其 ASCII 码。
我们继续按 D,可以将该处的字节解释为 双字节/四字节/八字节/单字节 等,这个在动态调试的时候用处很大,因为对于C这种可以一个指针大天下的语言来说,你不动态调一下,根本不知道那个变量里面放的是什么东西,所以掌握D键非常的重要。
花指令处理
https://ctf-wiki.org/reverse/obfuscate/junk-code/
花指令(junk code)是一种专门用来迷惑反编译器的指令片段,这些指令片段不会影响程序的原有功能,但会使得反汇编器的结果出现偏差,从而使破解者分析失败。比较经典的花指令技巧有利用 jmp
、call
、ret
指令改变执行流,从而使得反汇编器解析出与运行时不相符的错误代码。
一般情况下,我们正常写程序是不会出现花指令的,但是有心人就不一样了,比如,我们可以在 C 代码里面写汇编:
//源码
#include<stdio.h>
#include<windows.h>
int main(int argc, char* argv[])
{
int a = Messag