目前我正在尝试通过 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),并且根本没有帮助。
任何帮助都会很棒,即使是一个简单的想法,例如提示下一步要做什么、在哪里断点、在哪里查看或任何你能想到的,都会有很大帮助。