我有以下情况:
我有一个delphi应用程序{$APPTYPE GUI}
。 (APP1
)
如果APP1
启动,则会在其间运行代码
<{1}}和begin
,就像它应该的那样。
稍后,end.
将转换为DLL(另一个应用程序将执行此操作 - APP1
)。
APP2
将APP2
标记添加到IMAGE_FILE_DLL
Characteristics
NTFileHeader
中{/ 1}}。
然后APP1
尝试使用APP2
(或其他一些COM命令加载DLL)加载DLL(APP1
),但它返回错误:
Windows初始化COM时遇到内部错误 库。
我已经使用LoadLibrary
项目完成了所有这些并使用了C
函数。但是它似乎在Delphi中不起作用(WinMain
没有作为DLL启动)。如何将APP1
转换为可用的DLL?
编辑:
我正在尝试将此代码从APP1
移植到Delphi:http://level-23.info/forum/showthread.php?14721-UAC-Bypass-for-Windows-7-RTM-SP1-Windows-8-DP&p=31749
我已正确移植它并且一切正常但C
(CRYPTBASE.dll
)无法启动。 (见上面的错误)
简而言之:
创建delphi应用程序,在文件头中添加APP1
特征。将其重命名为IMAGE_FILE_DLL
并将其复制到C:\ Windows \ System32 \ sysprep。然后开始CRYPTBASE.dll
INFOS HERE: http://www.pretentiousname.com/misc/W7E_Source/win7_uac_poc_details.html
答案 0 :(得分:5)
WinMain只是一个名称,用作可执行文件的入口点。 DLL的约定是使用名称DllMain。 Windows加载程序不搜索WinMain,LoadLibrary不搜索DllMain,它只调用pe头中的入口点。
Delphi也没有使用,导入点的导出名称是start。
WinMain签名与DllMain不同(WinMain需要四个参数),我的建议是声明一个函数DllMain并将其导出到你的exe中:
function DllMain(hinstDLL: THandle; fdwReason: DWORD; lpvReserverd: Pointer): BOOL; stdcall;
begin
// do something
end;
exports
DllMain;
修改你的exe(在我设想的mem中)为dll的代码应该将入口点设置为DllMain(通过走EAT获取它的地址)。
另外:确保重定位表没有被剥离(在发布模式下),因为DLL在重新定位时需要它。
答案 1 :(得分:1)
我认为你根本不应该这样做。在构建EXE和DLL时,代码是根据不同的假设编译的,如果只是翻转标志并更改扩展名,它将无法工作。
尝试这样的东西是尝试和学习东西的好方法,但这对于制作来说是个坏主意。
告诉我们您要实现的目标,比“以EXE运行我的DLL”更具体。 为什么您需要将您的DLL作为EXE运行吗?
例如,您可以构建DLL,然后使用rundll32加载并调用它。如果你需要这个COM,你可以构建一个COM主机exe并依靠COM的自动编组来实现“好像我的代码在同一个进程中”的效果。它已经存在于COM中。