Преобразование из C ++ в Delphi - PullRequest
0 голосов
/ 07 января 2012

Может ли кто-нибудь помочь мне перенести эту функцию C ++ в Delphi?

sys - это класс с именем TSystem.

SharedMem - это класс с именем TVirtualMemory.

int Process::FixApi(dword FileHandler,image_import_descriptor* Imports,dword dllbase){
    image_import_by_name** names;                
    dword* pointers;                                                          
    if (Imports->original_first_thunk!=0){
       names=(image_import_by_name**)Imports->original_first_thunk;                                               
    }else{
          names=(image_import_by_name**)Imports->first_thunk;
    };
    names=(image_import_by_name**)((dword)names+FileHandler);
    pointers=(dword*)(Imports->first_thunk + FileHandler);
    if (Imports->first_thunk==0)return 0;                                          
    for (int i=0;i<200;i++){
        if (names[i]==0)break;
        if(!((dword)(names[i]->name+FileHandler) & 0x80000000)){
            dword s=(dword)names[i]->name;
            dword ptr=sys->GetAPI((char*)(s+FileHandler),dllbase);
            dword n=this->SharedMem->get_virtual_pointer(ptr);
            if (n!=0){
               ptr=n;
            }
            memcpy(&pointers[i],&ptr,4);
        }
    };
};

спасибо

Это моя попытка преобразовать вышеуказанный код:

function FixApi(FileHandler: dword;
  Imports: Pimage_import_descriptor; dllbase: dword): Integer;
var
names:^image_import_by_name;
pointers:Pdword;
i:integer;
s,ptr,n:dword;
begin
if Imports^.original_first_thunk<>0 then
names:=Pointer(Imports^.original_first_thunk)
else
names:=Pointer(Imports^.first_thunk);

names:=Pointer(dword(names)+FileHandler);
pointers:=Pdword(Imports^.first_thunk+FileHandler);
if (Imports^.first_thunk=0)then result:=0;

for i:=0 to 200 do
begin
{
// i didn't get it 
if (names[i]==0)break;
if(!((dword)(names[i]->name+FileHandler) & 0x80000000)){
dword s=(dword)names[i]->name;
}
ptr:=sys.GetAPI(PChar(s+FileHandler),dllbase);
n:=SharedMem.get_virtual_pointer(ptr);
if n<>0 then
ptr:=n;

CopyMemory(@pointers[i],@ptr,4);

end;
end;

Ответы [ 2 ]

4 голосов
/ 07 января 2012

Примерно так (DWORD и PDWORD определены в Windows единице):

type
  PImageImportByName  = ^TImageImportByName;
  PPImageImportByName = ^PImageImportByName;

  PImageImportDescriptor = ^TImageImportDescriptor;

// Since the original code has no valuable return code, I changed it to a procedure
procedure FixApi(FileHandler: DWORD; Imports: PImageImportDescriptor; DllBase: DWORD);
var
  Names: PPImageImportByName;
  Pointers: PDWORD;
  S: DWORD;
  Ptr: DWORD;
  N: DWORD;
begin
  if Imports.FirstThunk = 0 then
    Exit;

  if Imports.OriginalFirstThunk <> 0 then
    Names := PPImageImportByName(Imports.OriginalFirstThunk)
  else
    Names := PPImageImportByName(Imports.FirstThunk);

  Names    := PPImageImportByName(DWORD(Names) + FileHandler);
  Pointers := PDWORD(Imports.FirstThunk + FileHandler);

  for I := 0 to 199 do begin
    if Names[I] = nil then
      Break;

    if (DWORD(Names[I].Name + FileHandler) and $80000000) = 0 then begin
      S   := DWORD(Names[I].Name);
      Ptr := Sys.GetApi(PChar(S + FileHandler), DllBase);
      N   := SharedMem.GetVirtualPointer(Ptr);
      if N <> 0 then begin
        Ptr := N;
      end;
      Move(Ptr, Pointers[I], 4); // I'm not sure about this part
    end;
  end;
end;

Редактировать: я исправил условие в строке (DWORD(Names[I].Name + FileHandler) and $80000000) = 0.

0 голосов
/ 08 января 2012

Попробуйте что-то вроде этого:

uses
  ..., Windows;

type
  PPIMAGE_IMPORT_BY_NAME = ^PIMAGE_IMPORT_BY_NAME;

function Process.FixApi(FileHandler: DWORD; Imports: PIMAGE_IMPORT_DESCRIPTOR; dllbase: DWORD): Integer;
var
  names: PPIMAGE_IMPORT_BY_NAME;
  pointers: LPDWORD;
  i: Integer;
  s, ptr, n: DWORD;
begin
  Result := 0;
  if Imports^.original_first_thunk <> 0 then
    names := PPIMAGE_IMPORT_BY_NAME(Imports^.original_first_thunk)
  else
    names := PPIMAGE_IMPORT_BY_NAME(Imports^.first_thunk);
  names := PPIMAGE_IMPORT_BY_NAME(DWORD(names) + FileHandler);
  pointers := LPDWORD(Imports^.first_thunk + FileHandler); 
  if Imports^.first_thunk = 0 then Exit;
  for i := 0 to 199 do
  begin
    if names^ = nil then Break; 
    if (DWORD(names^^.name + FileHandler) and $80000000) = 0 then
    begin
      s := DWORD(names^^.name); 
      ptr := sys.GetAPI(PAnsiChar(s + FileHandler), dllbase); 
      n := Self.SharedMem.get_virtual_pointer(ptr); 
      if n <> 0 then
        ptr := n; 
      pointers^ := ptr;
    end;
    Inc(names);
    Inc(pointers); 
  end; 
end; 
...