GetProcAddress 与 0 作为 lpProcName

逆向工程 艾达 二元分析 pe32
2021-06-28 02:51:22

我正在逆向一个 32 位二进制文​​件,以应对我在大学实验室遇到的挑战,但我很难理解 asm 代码的意图。

二进制是一个 10 级倒车游戏,您在开始时没有任何信息,并且必须在最后建立标志时弄清楚所有事情。

基本上它使用很多加密技术从整数值派生字符串(据我所知)。我想出了它使用的一些导入,例如LoadLibraryAGetProcAddress(我猜它稍后会以某种方式使用它们)。

我目前遇到的问题是 asm 代码调用GetProcAddress,将kernel32.dllhandle 作为第一个参数,0(或NULL我猜)作为第二个参数。我得到的回报然后用于进行一些整数除法。我的问题是我NULLGetProcAddress电话中获得,然后在点击 时idiv,我得到了一个除以 0 的异常。

这是一张图片: 在此处输入图片说明

0x00401A85 eax0( NULL)。关于如何解决这个问题的任何想法?0( NULL) 作为第二个参数传递背后的想法是什么

谢谢!

2个回答

原来这只是插入代码中的一个技巧来分散我们的注意力。怎么说呢,太成功了哈哈。我最终问了我的老师,他告诉我尽量避免进入代码的那部分,然后我就能看到我的错误。掉进那个陷阱肯定学到了东西

根据Microsoft Docs: GetProcAddress

lpProcName

函数或变量名称,或函数的序数值。如果该参数为序数值,则必须在低位字中;高位字必须为零。

这里的第二个参数是一个序数值这样做可能是为了隐藏程序导入的函数名称。根据维基百科: DLL

DLL 导出的每个函数都由数字序号和可选的名称标识。同样,函数可以按顺序或按名称从 DLL 中导入。序数表示函数地址指针在 DLL 导出地址表中的位置。内部函数通常仅按序导出。对于大多数 Windows API 函数,在不同的 Windows 版本中仅保留名称;序数可能会发生变化

要获取函数名称,请先查看LoadLibrary()或 中的 DLL 文件名LoadLibraryEx()在 IDA 中打开该 DLL。转到“查看菜单”>“打开子视图”>“导出”。或者使用dumpbin /exports mydll.dllcommand 列出所有导出的函数及其对应的序数。有关更多详细信息,请参阅转储参考