我一直在网上寻找,在逆向工程方面,我所看到的只是一堆愚蠢的crackme教程。我想更好地将代码从汇编转换为C或C ++。我感觉到我将不得不及时挑选所有东西,或者制作一堆小程序并将它们分开。我想在此基础上继续发展。我已经精通自己的工作,只是想变得更好。

例如:

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


十六进制射线翻译这是

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 楼

这些建议可能会有所帮助。成为更好的反向工程师的一种肯定方法是成为更好的“正向工程师”!这是我的建议:检查各种编译器的程序集输出。





编写越来越复杂的测试程序,并检查汇编语言输出,以便您了解编译器对任何给定的高级构造所做的工作。

尝试通过反编译器运行二进制文件。这将使您了解工具如何解释这些相同的程序,并让您开始查看工具所造成的各种错误。如今,为各种事物找到源代码并不难。选择一个您不熟悉的开源项目,在不查看代码的情况下对其进行编译,然后尝试对其进行完全反向工程。或者,尝试对某些特定的例程或方面进行逆向工程(这是更常见的做法)。

尝试编写代码来欺骗反编译器。开源项目通常不采取任何反汇编措施,但其他类型的软件(例如恶意软件)通常会采取反拆卸措施。向前学习这些技术,然后使用反向工程工具查看结果。您将了解哪些技术成功以及为什么成功。

希望有所帮助。