2015-06-27 2 views
1

Мне нужно преобразовать этот C-код в Delphi-Code и потому, что мой Delphi-Knowledge недостаточно хорош Мне нужна ваша помощь!Преобразуйте этот C-код в Delphi-Code

Моя основная проблема заключается в том, что я не знаю, как отличать указатели/вычислять с помощью указателей в 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); 
    } 
    } 

И конвертированный в Делифед:

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() - Литая и т.д. Мне очень жаль, но я не знаю, как правильно бросить его.

Заранее благодарен! С уважением

ответ

2

Это должно сделать:

dwOffset := DWORD(lpFunc) - hLoaded; 

lpFunc уже указатель и все, что вы хотите, это адрес, hLoaded уже NativeUint.

и

Result := Ptr(hPayloadBase + dwOffset); 
+0

Спасибо, это решило мою проблему! – nemoest

1

Я вижу несколько проблем. LPCWSTR и LPCSTR - это не то же самое. Первый переводится в PWideChar, а второй, наконец, переводится в PAnsiChar (или MarshaledAString, что то же самое).

Кроме того, если вы используете Delphi 2009 или выше, вы не должны использовать PChar для приведения в соответствие с указателем. Используйте либо PByte, либо PAnsiChar, так как это однобайтовые типы.

Однако следует отметить, что в Delphi, ручки являются неотъемлемым типом уже, так что нет никакой необходимости, чтобы бросить их на всех:

dwOffset := NativeUInt(lpFunc) - hLoaded; 

А потом:

Result := Pointer(hPayloadBase + dwOffset); 

Обратите внимание, что я нахожу код, который пытается прочитать смещение, вычитая дескриптор из указателя (а затем использует это смещение, чтобы добавить к другому дескриптору), скорее, подозрительно. Это может сработать, но для меня это выглядит ужасно.

+0

Это не подозрительно. Он явно документирован, чем HMODULE является базовым адресом модуля. –

+0

Ручки должны быть непрозрачными. Если (это задокументировано), вы можете обращаться с дескриптором как указатель, он больше не является дескриптором. –

+0

Это наивный вид. «HMODULE» является базовым адресом. Это начало и конец.Он однозначно идентифицирует модуль, потому что два модуля не могут существовать по одному адресу. –

Смежные вопросы