Mik*_*ord 0 delphi 64-bit assembly
正如标题所说我在使用包含ASM代码的x64编译器编译Delphi XE2项目时遇到了问题.当我尝试编译它时,我收到错误"不支持的语言功能:'ASM'".
我试图从包含ASM代码的过程中删除delphi代码然后我得到"操作码和操作数的无效组合".
这是代码的一部分..
type
TDllLoadInfo = record
Module: pointer;
EntryPoint: pointer;
end;
TGetProcAddrExInfo = record
pExitThread: pointer;
pGetProcAddress: pointer;
pGetModuleHandle: pointer;
lpModuleName: pointer;
lpProcName: pointer;
end;
TInjectLibraryInfo = record
pLoadLibrary: pointer;
lpModuleName: pointer;
pSleep: pointer;
end;
procedure DllEntryPoint(lpParameter: pointer); stdcall;
var
LoadInfo: TDllLoadInfo;
begin
LoadInfo := TDllLoadInfo(lpParameter^);
asm
xor eax, eax
push eax
push DLL_PROCESS_ATTACH
push LoadInfo.Module
call LoadInfo.EntryPoint
end;
end;
procedure GetProcAddrExThread(lpParameter: pointer); stdcall;
var
GetProcAddrExInfo: TGetProcAddrExInfo;
begin
GetProcAddrExInfo := TGetProcAddrExInfo(lpParameter^);
asm
push GetProcAddrExInfo.lpModuleName
call GetProcAddrExInfo.pGetModuleHandle
push GetProcAddrExInfo.lpProcName
push eax
call GetProcAddrExInfo.pGetProcAddress
push eax
call GetProcAddrExInfo.pExitThread
end;
end;
procedure InjectLibraryThread(lpParameter: pointer); stdcall;
var
InjectLibraryInfo: TInjectLibraryInfo;
begin
InjectLibraryInfo := TInjectLibraryInfo(lpParameter^);
asm
push InjectLibraryInfo.lpModuleName
call InjectLibraryInfo.pLoadLibrary
@noret:
mov eax, $FFFFFFFF
push eax
call InjectLibraryInfo.pSleep
jmp @noret
end;
end;
Run Code Online (Sandbox Code Playgroud)
有没有办法编译这个项目而不会出现任何错误或将asm代码转换为delphi/pascal?谢谢你的时间.顺便说一句,我不知道ASM.
您不能在64位的非汇编过程中使用内联汇编,只能在32位中使用.Embarcadero的文档中明确说明了这一点:
将32位Delphi应用程序转换为64位Windows | 内联汇编代码
如果您的应用程序包含内联汇编(ASM)代码,则需要检查ASM代码并进行以下更改:
- 64位应用程序不支持将汇编语句与Pascal代码混合使用.使用Pascal代码或完全用汇编编写的函数替换汇编语句.
...
在您的示例中,没有理由使用内联汇编.您可以(并且应该)使用纯Pascal代码来支持32位和64位:
type
TDllEntryPointFunc = function(hinstDLL: HINSTANCE; fdwReason: DWORD; lpvReserved: Pointer): BOOL; stdcall;
TGetModuleHandleFunc = function(const lpModuleName: PChar): HMODULE; stdcall;
TGetProcAddressFunc = function(hModule: HMODULE; lpProcName: PAnsiChar): Pointer; stdcall;
TExitThreadFunc = procedure(dwExitCode: DWORD); stdcall;
TLoadLibraryFunc = function(const lpFileName: PChar): HMODULE; stdcall;
TSleepFunc = procedure(dwMilliseconds: DWORD); stdcall;
procedure DllEntryPoint(lpParameter: Pointer); stdcall;
var
LoadInfo: TDllLoadInfo;
pEntryPoint: TDllEntryPointFunc;
begin
LoadInfo := TDllLoadInfo(lpParameter^);
@pEntryPoint := LoadInfo.EntryPoint;
pEntryPoint(LoadInfo.Module, DLL_PROCESS_ATTACH, nil);
end;
procedure GetProcAddrExThread(lpParameter: Pointer); stdcall;
var
GetProcAddrExInfo: TGetProcAddrExInfo;
pGetModuleHandle: TGetModuleHandleFunc;
pGetProcAddress: TGetProcAddressFunc;
pExitThread: TExitThreadFunc;
Module: HMODULE;
Proc: Pointer;
begin
GetProcAddrExInfo := TGetProcAddrExInfo(lpParameter^);
@pGetModuleHandle := GetProcAddrExInfo.pGetModuleHandle;
@pGetProcAddress := GetProcAddrExInfo.pGetProcAddress;
@pExitThread := GetProcAddrExInfo.pExitThread;
Module := pGetModuleHandle(PChar(GetProcAddrExInfo.lpModuleName));
Proc := pGetProcAddress(Module, PAnsiChar(GetProcAddrExInfo.lpProcName));
pExitThread(DWORD(Proc));
end;
procedure InjectLibraryThread(lpParameter: Pointer); stdcall;
var
InjectLibraryInfo: TInjectLibraryInfo;
pLoadLibrary: TLoadLibraryFunc;
pSleep: TSleepFunc;
begin
InjectLibraryInfo := TInjectLibraryInfo(lpParameter^);
@pLoadLibrary := InjectLibraryInfo.pLoadLibrary;
@pSleep := InjectLibraryInfo.pSleep;
pLoadLibrary(PChar(InjectLibraryInfo.lpModuleName));
repeat
pSleep(-1);
until False;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1329 次 |
| 最近记录: |