成为更好的逆向工程师

逆向工程 反编译 C++ C
2021-06-24 05:29:36

我一直在网上寻找,当涉及到逆向工程时,我看到的只是一堆愚蠢的破解教程。我想更好地将代码从汇编代码转换为 c 或 c++。我有一种感觉,我将不得不及时选择这些,或者制作一堆小程序并将它们分开。我想建立在可能已经存在的基础上。我已经精通我正在做的事情,只是我想变得更好。

例如:

mov     eax, DDrawPtr
push    8
push    1E0h
push    280h
mov     ecx, [eax]
push    eax
call    dword ptr [ecx+54h]

Hex-rays 将其翻译为

v1 = (*(**DDrawPtr + 0x54))(*DDrawPtr, 640, 480, 8)

没关系....应该是。

HANDLE v1 = DDrawPtr -> SetDisplayMode(640,480,8);

或者有时 IDA 会犯错误并且会说

int __cdecl sub_41B869()

由于此代码不返回任何内容并且应该是无效的....

我在这里找到了一个简洁的问题和答案Stackoverflow 问题/答案我想像这样学习更多,因为我意识到 IDA 会犯错误。我想知道如何识别函数类型,更重要的是手动执行此操作,因为我看到 IDA 犯了错误,我觉得我应该学会更好地识别这些错误,看看我如何在需要时手动将其恢复。

这是一本在某种程度上做到了这一点的书,但它从 C 到汇编,而不是相反。逆向工程.pdf

有什么建议?

1个回答

这些建议可能会有所帮助。成为更好的逆向工程师的一个可靠方法是成为更好的“正向工程师”!这是我的建议:

  1. 检查各种编译器的汇编输出。 编写越来越复杂的测试程序并检查汇编语言输出,以便您了解编译器对任何给定的高级构造所做的工作。
  2. 尝试通过反编译器运行二进制文件。这将允许您查看工具如何解释这些相同的程序,并允许您开始查看工具所产生的错误类型。
  3. 尝试完全逆向工程一个小项目。如今,找到各种事物的源代码并不难。选择一个你熟悉的开源项目,在不看代码的情况下编译它,然后尝试对其进行完全逆向工程。或者,尝试逆向工程一些特定的例程或方面(更常见)。
  4. 尝试编写代码来欺骗反编译器。开源项目通常不采取任何反汇编措施,但其他类型的软件(例如恶意软件)通常会这样做。向前学习这些技术,然后使用逆向工程工具查看结果。您将了解哪些技术是成功的以及为什么成功。

希望有帮助。