处理未记录的汇编语言指令列表有哪些有用的策略?即使作为编写汇编代码的人,我发现有时理解其他人的代码也很有挑战性,因为汇编语言的本质意味着必须在程序中的各个点在精神上跟踪 CPU 状态。我已经看到通过使用记事本和笔并手工完成程序取得了一些成功。还有哪些其他策略?我们以这个函数为例:
; cmp edx,10
; jae internal_error
push ebx ecx
push eax
mov ebx,eax
mov ecx,edx
shld edx,eax,2
sub ebx,edx
sbb ecx,0
mov eax,ebx
mov ebx,1999999Ah
mul ebx
mov eax,ecx
imul eax,ebx
add eax,edx
pop edx
imul ecx,eax,10
sub edx,ecx
cmp edx,10
jb somewhere
sub edx,10
inc eax
pop ecx ebx
retn
由于汇编语言的性质,在高层次上“这段代码实际上做了什么”并不是很明显。对我来说,理解这一点的过程是真正的“逆向工程”,但它不一定适用于从反汇编器读取,它也可能只是其他人的汇编源代码。事实上,有时如果没有 IDA Pro 或 Binary Ninja 的帮助,反汇编用 HLL 编写的二进制文件,用 aassembly 编写的逆向工程汇编会更加困难。