Re: Importierte API Funktionen erweitern...
Zitat:
|
Re: Importierte API Funktionen erweitern...
http://www.arschvoll.net/gpa.txt
für variante 2. ich weiß net ob GetModuleHanlde für 9x ganz richtig ist, ist net von mir und beim exception handler solltest besser über den param $C (excpeption record) und dann -> ESP wieder ESP zurücksetzen und nicht so wie in dem bsp über EBP +4 weils vorher gespeichert wurde für die anderen vairnten muss ich noch source suchen (@oli das war auch nur damit er vill in der zeit wo ich was suche selbst mal nach schaun kann) |
Re: Importierte API Funktionen erweitern...
Zitat:
|
Re: Importierte API Funktionen erweitern...
1. variante
Delphi-Quellcode:
es wird GetModuleHandleA und Loadlibrary, falls es eine API ist die weitergeleitet wird (forwarded) das kannst du getrost bei normalen APIs wie CreateFileA etc. rausnehmen dann ist der teil auch ohne andere delphi funktionen (copy etc) ausführbar
function GetProcAddressX(module: integer; procname: pchar): pointer; stdcall;
var DataDirectory: TImageDataDirectory; P1: ^integer; P2: ^Word; Base, NumberOfNames, AddressOfFunctions, AddressOfNames, AddressOfNameOrdinals, i, Ordinal: integer; TempStr1, TempStr2: string; begin Result := nil; DataDirectory := PImageNtHeaders(Cardinal(module) + Cardinal(PImageDosHeader(module)^._lfanew))^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; P1 := Pointer(module + integer(DataDirectory.VirtualAddress) + 16); Base := P1^; P1 := Pointer(module + integer(DataDirectory.VirtualAddress) + 24); NumberOfNames := P1^; P1 := Pointer(module + integer(DataDirectory.VirtualAddress) + 28); AddressOfFunctions := P1^; P1 := Pointer(module + integer(DataDirectory.VirtualAddress) + 32); AddressOfNames := P1^; P1 := Pointer(module + integer(DataDirectory.VirtualAddress) + 36); AddressOfNameOrdinals := P1^; Ordinal := 0; if Cardinal(procname) > $0000FFFF then begin TempStr1 := PChar(procname); for i := 1 to NumberOfNames do begin P1 := Pointer(module + AddressOfNames + (i - 1) * 4); TempStr2 := PChar(module + P1^); if TempStr1 = TempStr2 then begin P2 := Pointer(module + AddressOfNameOrdinals + (i - 1) * 2); Ordinal := P2^; Break; end; end; end else Ordinal := integer(procname) - Base; if Ordinal <> 0 then begin P1 := Pointer(module + AddressOfFunctions + Ordinal * 4); if (P1^ >= integer(DataDirectory.VirtualAddress)) and (P1^ <= integer(DataDirectory.VirtualAddress + DataDirectory.Size)) then begin TempStr1 := PChar(module + P1^); TempStr2 := TempStr1; while Pos('.', TempStr2) > 0 do TempStr2 := Copy(TempStr2, Pos('.', TempStr2) + 1, Length(TempStr2) - Pos('.', TempStr2)); TempStr1 := Copy(TempStr1, 1, Length(TempStr1) - Length(TempStr2) - 1); Base := GetModuleHandleA(PChar(TempStr1)); if Base = 0 then Base := LoadLibrary(PChar(TempStr1)); if Base > 0 then Result := GetProcAddressX(Base, PChar(TempStr2)); end else Result := Pointer(module + P1^); end; end; |
Re: Importierte API Funktionen erweitern...
vielleicht dazu noch erklären wie die import tabelle erstellt wird (meine version, das GetProcAddressX ist von jemand anderem, wo ich aber paar sache geändert habe)
Delphi-Quellcode:
das ist von mir -> importp ist der pointer zur importtabelle, dazu kannste den ersten teil von GetProcAddressX benutzen
procedure CreateImportTable(dllbasep, importp: pointer); stdcall;
type timportblock = record Characteristics: cardinal; TimeDateStamp: cardinal; ForwarderChain: cardinal; Name: pchar; FirstThunk: pointer; end; pimportblock = ^timportblock; var myimport: pimportblock; thunksread, thunkswrite: ^pointer; dllname: pchar; dllh: thandle; old: cardinal; begin myimport := importp; while (myimport^.FirstThunk <> nil) and (myimport^.Name <> nil) do begin dllname := pointer(integer(dllbasep)+integer(myimport^.name)); dllh := LoadLibrary(dllname); thunksread := pointer(integer(myimport^.FirstThunk)+integer(dllbasep)); thunkswrite := thunksread; if integer(myimport^.TimeDateStamp) = -1 then thunksread := pointer(integer(myimport^.Characteristics)+integer(dllbasep)); while (thunksread^ <> nil) do begin if VirtualProtect(thunkswrite,4,PAGE_EXECUTE_READWRITE,old) then begin if (cardinal(thunksread^) and $80000000 <> 0) then thunkswrite^ := GetProcAddress(dllh,pchar(cardinal(thunksread^) and $FFFF)) else thunkswrite^ := GetProcAddress(dllh,pchar(integer(dllbasep)+integer(thunksread^)+2)); VirtualProtect(thunkswrite,4,old,old); end; inc(thunksread,1); inc(thunkswrite,1); end; myimport := pointer(integer(myimport)+sizeof(timportblock)); end; end; variante 4. muss ich woh nicht erklären zu variante 3. (dem hinzufügen von funktionen zur importtabelle) müsste ich gleich eben selbst noch ein beispiel machen |
Re: Importierte API Funktionen erweitern...
Hi,
der ganze Delphi Code is nett gemeint und ich bin mir auch sicher das es laufen würde... bringt mir aber nur relativ wenig bis gar nix (weil geht nur asm)... Wie füllt das Programm eingentlich zur laufzeit die Speicheradressen wo die entsprechenden Pointer drin stehen? (ziehmlich wage umschrieben aber ich hoffe ihr wisst was ich meine) das muss doch irgendwie rekonstruierbar sein. Danke trotzdem... evtl kann ich das noch in ner andern Problemstellung verwenden was du da gepostet hast @@brechi Greetz Boombuler |
Re: Importierte API Funktionen erweitern...
ganz simple erklärt, das macht die kernel32.dll mit hilfe der import tabelle einer exe/dll
(etwa so wie in meinem letzten post) du kannst die sources einfach kompilieren und dann den bytecode rauskopieren und überall einsetzen (dafür ist das gedacht gewesen) jedenfalls methode 1 und 2 (1 mussu halt noch den teil von den weitergeleitenden imports löschen EDIT: für dich vielleicht ganz erfreulich WICHTIG! schau dir einfach mal LordPE (Royal TS) von yoda an der kann funktionen und dlls zu der importtabelle hinzufügen WICHTIG! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz