如何在纯汇编


0

此建立一个32位的DLL是我已经设法到目前为止建立实施DLLSkeleton.dll代码: http://archive.org/download/lowlevelDLL32_try0000/x86_WinAPI_ASM_PE_EXE_Skeleton32--v2017-07-26.zip

我试图做一个DLL纯粹的组装。到目前为止,我已经能够创建导出表和一个带有序号01的函数来导出TestHello函数。

由usedll.exe加载时,DLL运行正常,但仅在函数不包含任何内容时才运行。当我给MessageBoxA添加一个调用时,程序会自动崩溃,但我不知道如何。

我已经从DLL中导入了所有标准的WinAPI函数。当我从零开始创建EXE时(例如http://devel.archefire.org/downfile.php?path=/PRJ/clockcount/&filename=2017-10-22--ClockCount.zip),它的工作原理没有问题,但是当我从DLL调用类似MessageBox的东西时,它不起作用。

我已经在第一个ZIP中包含了测试DLL在纯汇编中的当前代码。导出和导入表格工作正常,当函数仅包含RET指令时,DLL被正确加载(对于DllMain,RET 12不做任何事)。那么在从使用导入表导入USER32.dll和其他DLL的DLL中调用WinAPI函数时会出现什么错误呢?

+1

关于软件开发的问题在这里是无关紧要的,但可以在[Stack Overflow](https://stackoverflow.com/questions/ask)上提问。 07 11月. 172017-11-07 14:16:13

  0

它可能不会被堆栈溢出回答,因为这个问题是直接在NASM程序集中实现一个32位的PE DLL,而不涉及任何链接器,使工具或导入库对象,只有程序集,我目前当从DLL中使用WinAPI时发生崩溃,尽管如果只使用我自己的例程,它似乎工作得很好。 07 11月. 172017-11-07 14:44:26

+2

为什么不使用调试器进入调用并查看它失败的位置? 07 11月. 172017-11-07 15:19:54

1

我设法实现了一个DLL的第一次尝试,一个名为WinAPI32.dll的DLL旨在从Windows 9x将整个标准WinAPI和MSVC库导入到Windows 10,然后导出任何自定义函数和更新的数据。

这只会从一个简单的程序加载,由于缺陷/弱点,纯粹在汇编中同样产生,我还没有找到。另一种可能性是教程7和17中的Iczelion测试程序(帮助我理解DLL函数导出表)在运行时导入库时不健壮,而我正在使用导入表导入我的DLL函数作品。可能很多测试程序及其DLL(和一些程序)在加载它们在运行时导入的DLL函数时执行不力。在这种情况下,可能我在汇编时使用导入库的第一次尝试更加健壮,但我需要想出更好的DLL版本并加载EXE。

见二进制如果你想执行结果的快速预览: http://sourceforge.net/projects/x86winapiasmpedllskeleton32/files/2017-11-07--Pure_ASM_PE_EXE_DLL_32_bin.zip/download

镜(复印件EXE文件,并在同一目录下的DLL): http://sourceforge.net/projects/x86winapiasmpedllskeleton32/files/2017-11-07--Pure_ASM_PE_EXE_DLL_32_src.zip/download

它的全部源代码为DLL和DLL加载程序。到目前为止,我只能使用此程序加载生成的DLL,但不能与其他标准程序(如Iczelion中的程序)一起加载,可能是因为它们加载了LoadLibrary/GetProcAddress,并且我加载了静态导入表,并且可能Iczelion测试程序不是'足够健壮,但我将不得不实施更好的版本。

至少这已经是一个在汇编代码中实现了100%的DLL,而不需要链接器或导入库对象,但是我必须使用来自wheaty.net的PEDUMP.EXE来从DLL和包含HTML5工具来生成导出表的汇编代码。

  0

这并不回答为什么第一次尝试不起作用的问题。你想更新你的问题来解决评论?然后使用编辑按钮。 08 11月. 172017-11-08 12:42:02

  0

第一条消息只包含初始但是不可用的代码。第二条消息包含至少可用的代码,当通过导入表导入包含的DLL函数而不是使用LoadLibrary/GetProcAddress时,该代码至少可以工作。 08 11月. 172017-11-08 18:51:53