首页 > 解决方案 > “实用逆向工程”中的勘误表?

问题描述

我刚刚开始阅读 Bruce Dang 等人的《实用逆向工程》一书,并且对第一章末尾的“演练”的一部分感到困惑。这是代码的相关部分:

65: ...
66: loc_10001d16:
67:     mov eax, [ebp-118h]
68:     mov ecx, [ebp-128h]
69:     jmp short loc_10001d2a (line 73)
70: loc_10001d24:
71:     mov eax, [ebp+0ch]
72:     mov ecx, [ebp+0ch]
73: loc_10001d2a:
74:     cmp eax, ecx
75:     pop esi
76:     jnz short loc_10001D38 (line 82)
77:     xor eax, eax
78:     pop edi
79:     mov esp, ebp
80:     pop ebp
81:     retn 0ch
82: ...

以及作者的评论:

"循环退出后,在第 66 行继续执行。第 67-68 行保存匹配PROCESSENTRY32的 's并th32ParentProcessID/th32ProcessID在第EAX/ECX73 行继续执行。注意第 66 行也是第 43 行的跳转目标。第 70-74 行fdwReason读取DllMain( EBP+C) 并检查是否为 0 ( DLL_PROCESS_DETACH)。如果是,则将返回值设置为 0 并返回;否则,转到第 82 行。

这不是我阅读代码时的解释方式;当然,任何跳转到(第 70 行)都会导致函数无条件地loc_10001d24以返回值 0 终止,而不仅仅是当 at 的值为 0 时?(我假设ing into不会影响寄存器,并且第 76 行的跳转条件是第 74 行的结果?)这也与代码中的早期部分一致,如果各种调用的函数返回值,则跳转到表示失败。ebp+0x0cpopesieflagscmp eax, ecxloc_10001d24

此外,我认为从第 66 行开始的部分的要点是,如果PROCESSENTRY32(前面定义的结构,从内存中的位置开始ebp-0x130)具有相等的th32ParentProcessIDebp-0x118在内存中)和th32ProcessIDebp-0x128在内存中)条目,则也返回值 0;它是否正确?作者的评论似乎没有表明这一点。

作为一个更普遍的问题,即使只是本书的第一章,似乎也有相当多的错别字;有谁知道任何地方从书中收集勘误表的网页?

标签: windowsassemblyx86reverse-engineering

解决方案


是的,ECX 和 EAX 都是从同一个内存位置加载的,所以除非其他东西有指向它的指针并且异步更改它,否则cmp x,x/jne将始终不被采用。与浮点不同,任何可能的整数都等于自身。

你是对的,pop不会改变 EFLAGS,根据英特尔的手册:https ://www.felixcloutier.com/x86/pop 。

要检查内存位置是否为零,您可以将其加载到test eax,eax/jnz
cmp dword ptr [ebp + 0xc], 0/的 reg 中jne

(JNE 和 JNZ 是同一条指令,不同的助记符让你根据值本身设置 ZF 来表达相等或直接为零的语义含义。)


第70-74行读取DllMain(EBP+C)的fdwReason参数,检查是否为0(DLL_PROCESS_DETACH)

这是假的。如果这本书充满了这样的东西,那听起来就不是一本好书。

从加载 2 个不同值的cmp eax,ecx路径到达时唯一有意义。(并且不能test用于那个,x & y != 0不会告诉你它们是否相等。)这似乎不太可能是真正的编译器输出。


推荐阅读