将此C代码转换为Delphi代码

时间:2015-06-27 03:00:42

标签: c delphi pointers casting

我需要将这个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等。很抱歉,我不知道如何正确地投射它。

提前致谢! 此致

2 个答案:

答案 0 :(得分:2)

这应该做:

dwOffset := DWORD(lpFunc) - hLoaded;

lpFunc已经是一个指针,你想要的只是地址,hLoaded已经是一个NativeUint了。

Result := Ptr(hPayloadBase + dwOffset);

答案 1 :(得分:1)

我看到一些问题。 LPCWSTRLPCSTR不一样。第一个转换为PWideChar,而第二个转换为PAnsiChar(或MarshaledAString,这是相同的。)

此外,如果您使用的是Delphi 2009或更高版本,则不应使用PChar来转换指针数学。使用PBytePAnsiChar,因为它们是单字节类型。

但请注意,在Delphi中,句柄已经是整数类型,因此根本不需要转换它们:

dwOffset := NativeUInt(lpFunc) - hLoaded;

后来:

Result := Pointer(hPayloadBase + dwOffset);

请注意,我发现尝试通过从指针中减去句柄来读取偏移量的代码(然后使用该偏移量添加到另一个句柄)是相当可疑的。它可能会起作用,但对我来说这看起来很可怕。