Could someone helps me in porting this C++ function into Delphi?
sys
is a class named TSystem
.
SharedMem
is a class named 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);
}
};
};
thank you
This is my attempt to convert the above code :
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;
Something like this (DWORD
and PDWORD
are defined in the Windows
unit):
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;
Edit: I fixed the condition in the line (DWORD(Names[I].Name + FileHandler) and $80000000) = 0
.