绕过 Enigma 加载器

逆向工程 调试 开箱 快手
2021-06-22 06:59:38

目前我正在尝试通过 Enigma 的加载程序,它会要求您提供名称和密钥,作为练习。

我的进步很小,因为我没有和包装工一起工作太多。

我所做的是在 上断点CreateWindowExA,然后将随机数据放在键/名称上,然后单击Register,这实际上在CreateWindowExA.

从那里,我可以检查堆栈并返回一些调用,但我真的迷路了,因为有很多膨胀代码(带有 x87 指令的短函数),我不知道从哪里继续。

我也知道检查串行的例程是虚拟化的,所以我应该修补检查检查串行的函数而不是函数本身的返回的地方,但是再一次,我在查看堆栈时迷路了。

这是我到目前为止的进展:

上的断点CreateWindowExA,当您输入无效的序列号时会调用 该断点在此处输入图片说明

调用它的函数:http : //screenshotuploader.com/i/1502/t_q0c.png

而那个函数,在调用之前和之后CreateWindowExA,调用了这两个奇怪的 x87 函数:

在此处输入图片说明

上一张截图中标注的功能

在此处输入图片说明

这个在几条指令后被调用 CreateWindowExA

再返回一个函数后,我看到:

在此处输入图片说明

该函数的问题在于它使用了一些技巧来更改返回地址(我猜),如下所示:

在此处输入图片说明

这会导致奇怪的代码,该代码期望函数edx返回一个函数指针,该函数正在取消引用指向 a word(2 个字节)的指针

这是调用返回函数指针的函数的代码: 在此处输入图片说明

这是返回指针的函数edx在此处输入图片说明

这真的很奇怪,因为它 1)取消引用word(2 个字节,对于函数指针来说还不够!),以及 2)FLDCW加载一个 x87 FPU 控制字......这里发生了什么?!

此外,这是我在堆栈中看到的最后一个返回值,因为其余值都被清零,并且没有分支在这个深度检查串行,所以我不知道在哪里继续查看。


如果还不够的话,每次我输入一个无效的序列时程序都会关闭,这会让它变得更难,因为下一次偏移量完全不同而且我找不到代码所以我之前断点,所以我真的丢失!

在运行时转储可执行文件绝对没有任何作用,因为它仍然像以前一样打包,它只会使它大 4 倍(50MB -> 200MB),并且根本没有帮助。

任何帮助都会很棒,即使是一个简单的想法,例如提示下一步要做什么、在哪里断点、在哪里查看或任何你能想到的,都会有很大帮助。

0个回答
没有发现任何回复~