我需要将这个C-Code转换为Delphi-Code,因为我的Delphi-Knowledge不够好我需要你的帮助!
我的主要问题是,我不知道如何在Delphi中使用指针转换指针/计算。
当然我试图转换它,对于熟悉这两种语言的人来说,这很容易做到:)
原始代码(C):
void* GetPayloadExportAddr( LPCWSTR lpPath, HMODULE hPayloadBase, LPCSTR lpFunctionName ) {
// Load payload in our own virtual address space
HMODULE hLoaded = LoadLibrary( lpPath );
if( hLoaded == NULL ) {
return NULL;
} else {
void* lpFunc = GetProcAddress( hLoaded, lpFunctionName );
DWORD dwOffset = (char*)lpFunc - (char*)hLoaded;
FreeLibrary( hLoaded );
return (DWORD)hPayloadBase + dwOffset;
}
}
和
BOOL InitPayload( HANDLE hProcess, LPCWSTR lpPath, HMODULE hPayloadBase, HWND hwndDlg ) {
void* lpInit = GetPayloadExportAddr( lpPath, hPayloadBase, "Init" );
if( lpInit == NULL ) {
return FALSE;
} else {
HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0,
lpInit, hwndDlg, 0, NULL );
if( hThread == NULL ) {
return FALSE;
} else {
CloseHandle( hThread );
}
}
部分转换的Delphicode:
function GetPayloadExportAddr( lpPath: LPCWSTR; hPayloadBase: HMODULE; lpFunctionName: LPCWSTR) : Pointer;
var
hLoaded: HMODULE;
lpFunc: pointer;
dwOffset: DWORD;
begin
hLoaded := LoadLibrary( lpPath );
if( hLoaded = 0 ) then
begin
Result := 0;
end
else
begin
lpFunc := GetProcAddress( hLoaded, lpFunctionName );
dwOffset := DWORD(PCHAR(lpFunc) - PCHAR(hLoaded));
FreeLibrary( hLoaded );
Result := PDWORD(DWORD(hPayloadBase) + dwOffset);
end;
end;
和
procedure CallStopHack( hProcess: THandle; lpPath: LPCWSTR; hPayloadBase: HMODULE);
var
lpInit : Pointer;
hThread: THandle;
bla:Cardinal;
begin
lpInit := GetPayloadExportAddr(lpPath, hPayloadBase, 'StopSpeedhack');
if( lpInit = nil ) then
begin
Exit;
end
else
begin
hThread := CreateRemoteThread( hProcess, nil, 0,
lpInit, 0, 0, bla);
if( hThread = 0 ) then
begin
Exit;
end
else
begin
CloseHandle( hThread );
end;
end;
end;
我认为我搞砸了PDWORD() - Cast等。很抱歉,我不知道如何正确地投射它。
提前致谢! 此致
答案 0 :(得分:2)
这应该做:
dwOffset := DWORD(lpFunc) - hLoaded;
lpFunc已经是一个指针,你想要的只是地址,hLoaded已经是一个NativeUint了。
和
Result := Ptr(hPayloadBase + dwOffset);
答案 1 :(得分:1)
我看到一些问题。 LPCWSTR
和LPCSTR
不一样。第一个转换为PWideChar
,而第二个转换为PAnsiChar
(或MarshaledAString
,这是相同的。)
此外,如果您使用的是Delphi 2009或更高版本,则不应使用PChar
来转换指针数学。使用PByte
或PAnsiChar
,因为它们是单字节类型。
但请注意,在Delphi中,句柄已经是整数类型,因此根本不需要转换它们:
dwOffset := NativeUInt(lpFunc) - hLoaded;
后来:
Result := Pointer(hPayloadBase + dwOffset);
请注意,我发现尝试通过从指针中减去句柄来读取偏移量的代码(然后使用该偏移量添加到另一个句柄)是相当可疑的。它可能会起作用,但对我来说这看起来很可怕。