例如:
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 楼
这些建议可能会有所帮助。成为更好的反向工程师的一种肯定方法是成为更好的“正向工程师”!这是我的建议:检查各种编译器的程序集输出。编写越来越复杂的测试程序,并检查汇编语言输出,以便您了解编译器对任何给定的高级构造所做的工作。
尝试通过反编译器运行二进制文件。这将使您了解工具如何解释这些相同的程序,并让您开始查看工具所造成的各种错误。如今,为各种事物找到源代码并不难。选择一个您不熟悉的开源项目,在不查看代码的情况下对其进行编译,然后尝试对其进行完全反向工程。或者,尝试对某些特定的例程或方面进行逆向工程(这是更常见的做法)。
尝试编写代码来欺骗反编译器。开源项目通常不采取任何反汇编措施,但其他类型的软件(例如恶意软件)通常会采取反拆卸措施。向前学习这些技术,然后使用反向工程工具查看结果。您将了解哪些技术成功以及为什么成功。
希望有所帮助。