Assembly 如何猜测在动态内存程序集中执行的下一条指令

Assembly 如何猜测在动态内存程序集中执行的下一条指令,assembly,x86,dynamic-memory-allocation,cracking,ollydbg,Assembly,X86,Dynamic Memory Allocation,Cracking,Ollydbg,我的一个朋友向我挑战,要我破解他编写的一个小程序。基本上,它是一个显示图像的exe文件,但要做到这一点,您需要一个带有密码的密钥文件 我开始用ollydgb对其进行反向工程,我发现需要存在一个名为key.txt的文件并包含密码。我意识到的另一件事是,我的朋友使用密码来计算内存地址并调用它。因此,如果您的密码错误,应用程序将崩溃,因为它将跳转到随机地址,可能导致违反 他基本上在EBX中存储de密码。他设定了一个固定值EAX。然后他添加EAX,EBX,最后调用EAX 所以,知道了所有这些,如果我知道

我的一个朋友向我挑战,要我破解他编写的一个小程序。基本上,它是一个显示图像的exe文件,但要做到这一点,您需要一个带有密码的密钥文件

我开始用ollydgb对其进行反向工程,我发现需要存在一个名为key.txt的文件并包含密码。我意识到的另一件事是,我的朋友使用密码来计算内存地址并调用它。因此,如果您的密码错误,应用程序将崩溃,因为它将跳转到随机地址,可能导致违反

他基本上在EBX中存储de密码。他设定了一个固定值EAX。然后他添加EAX,EBX,最后调用EAX

所以,知道了所有这些,如果我知道下一步执行哪个地址,我可以从存储在EAX中的固定值中减去地址,然后得到对应于密码的十六进制值

我的问题是,我怎么知道下一个要执行的地址是哪个?我对破解相当陌生

我试着在电话后指向下一个地址,但它不起作用。我还检查了它正在使用的库,我当然看到了opengl32,但我不确定是否必须以某种方式跳转到该库


我的问题是,我怎样才能知道下一个要执行的地址是哪个?

除非程序很小(我的意思是只有几KB的代码),否则您无法轻松地找出它,需要执行一些代码分析,做出假设,并通过试验和不可避免的错误来确认或否定它们

我想到的第一件事是找到代码中存在的函数,但没有调用/跳转指令将控制权转移给它们。您可以通过首先识别为绘制图片而必须调用的函数(调用相关OpenGL/DirectX/GDI函数的函数)来缩小搜索范围。然后你就可以从那里向后工作了

查看可执行文件的数据部分中是否有任何函数指针/地址也可能有用,原因是编译器可能会删除未被任何其他函数或指针引用的函数,因此感兴趣的函数仍然存在于已编译的可执行文件中,必须在某个地方有一些引用(当然,除非代码是在关闭所有优化的情况下编译的)

不管是哪种方式,我担心,您将不得不费力地阅读大量代码


另一个要看的是可执行文件本身及其部分(例如它们的名称、大小、位置或内容)的属性。这可能会给您一些线索。

X86指令集的一个属性是,尽管长度可变(指令使用可变字节数编码),但指令序列会很快收敛。这意味着,如果您随机选择一个位置作为函数的开始,并从该点开始分解,您将不会太糟糕。您反汇编的一些指令将是错误的,但最终(相当快)您将得到真正的指令

这意味着您可以在可执行文件中选择随机地址,并开始寻找通用模式,如函数的序言和尾声。这些可以给你提示代码在哪里

但是,这假定您的朋友不是手工编写程序集或以其他方式混淆代码

但是,无论他做什么,他都会对导入地址表中的方法或系统调用指令进行一些调用。它们要么运行代码来绘制图像,要么修改进程的页表,以便消除模糊代码。这些模式将更加可靠。因此,一个好的开始是转储iat(导入地址表),并寻找对感兴趣的函数的调用。如果这不起作用,请尝试寻找系统调用模式。具体查找什么取决于您所使用的特定操作系统

需要记住的几件事:

  • 如果您的朋友没有关闭ASLR(地址空间布局随机化),那么即使您拥有正确的密码,代码也可能无法始终工作

  • 我对olydbg不太熟悉,但我假设它使用递归下降反汇编。如果是这样,它可能不会在反汇编中包含您的目标函数,因为它不会有任何静态可解析的调用

  • 要解决第二个问题,您可能需要自己编写代码进行反汇编,解码指令。最好的开始位置是扫描exe,寻找间接调用指令。然后尝试系统调用

    更新


    还有一件事:如果将exe配置为使exe部分可写或数据部分可执行(或关闭nxbit),则映像中可能没有系统调用。最好先看一看图片中的分区表,看看是否有异常情况,然后再开始检查是否正常。

    我喜欢以“我的朋友…”开头的问题。与论坛网站不同,我们不使用“谢谢”或“感谢任何帮助”或签名。请参阅“.如何向我们展示代码(反汇编)?通过chinese whisper进行的反向工程通常是高报酬的,通常由CIA、NSA或类似组织的客户进行。stackoverflow不收费,因此请简化一点。如果目标函数位于图像的代码/数据部分,并且没有被故意移动/复制,则ASLR不应成为问题(由程序员)在其他地方。如果是这样的话,目标函数与图像基之间的距离是固定的,这一问题通过提及正在添加的常量/固定值来暗示。这一切取决于所用调用指令的特定编码、偏移量的值,以及appr