Autor Beitrag
lam0r
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 03.07.05 02:57 
Hi!
nachdem mir letztes mal so geholfen wurde, wende ich mich nochmals an euch.
Diesmal habe ich ein anderes Problem:
Ich möchte einen Hook auf VirtualQuery machen, der die normale Arbeit von VirtualQuery verarbeitet.
Sollte jedoch mein kleines Testprogramm nach einer dynamisch geladenen dll fragen, soll eine falsche Speicher-Adresse zurückgeliefert werden. Es geht dabei um ein Exe Verschlüsselungs Projekt im Rahmen meiner Diplom-Arbeit. Nun habe ich den Verschlüsseler fast fertig, teste also eventuelle Gegenmaßnahmen, um diese wiederum abzuwehren. Mein Verschlüsselungsprogramm lädt die verschlüsselte Exe unverschlüsselt in den Speicher, führt diese aus und fängt danach fröhlich und kontinuierlich an, diese zu scannen, um eventuelle *nicht gewünschte* veränderungen aufzudecken. Dabei fragt sie eben über VirtualQuery die dynamisch geladenen DLLs ab, um diese auch zu scannen. Nun meinte ein Kollege, man könnte doch ne memcopy von der ganzen Exe machen, und den Scanner auf diese Kopie mittels eines API Hooks umleiten.

Ich hab allerdings keinen Plan von so heftiger API Programmierung, deher wollte ich euch fragen, ob ihr mir da vielleicht weiterhelfen könnt. :roll:
Danke im Voraus!
lam0r Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 12.07.05 14:11 
Hi. Hat niemand einen Tipp?

Hier die Definition von MSDN:
ausblenden Quelltext
1:
2:
3:
4:
5:
SIZE_T VirtualQuery(
  LPCVOID lpAddress,
  PMEMORY_BASIC_INFORMATION lpBuffer,
  SIZE_T dwLength
);


Hier meine Delphi Hook Funktion:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function myVirtualQuery(oldfunc:pointer;mbi:TMemoryBasicInformation;size:dword):longword;stdcall;
begin
  result:=OldVirtualQuery(oldfunc,mbi,size);
  MessageBox(0,'this is the hook speaking...',PChar(pbowned),0);
  assignfile(f,filename); //assign textfile to handler
  if not fileexists(filename) then rewrite(f) else reset(f); //check if file exists
  append(f); //set marker to eof
  writeln(f,'OldFunc: ',PChar2Str(PChar(oldfunc)),' BaseAddress: ',PChar2Str(PChar(mbi.BaseAddress)),' AllocationBase: ',PChar(mbi.AllocationBase)); //write log data if hook gets activated
  flush(f); //make sure data gets written to file
  close(f); //close file
end;


Vielleicht weiß jemand, wieso ich nur Datenmüll in der Log Datei bekomme
(HexCode Müll). Ich denke, es liegt eine klassischer Type Mismatch vor.

Vielen Dank im Voraus, antwortet bitte auch, falls ihr nur Fragen habt.

@uall: vielleicht kannst du mir ja helfen, du scheinst ja wirklich viel Ahnung davon zu haben :)
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Mo 15.08.05 15:03 
Was bekommst du denn in der Log-Datei für "Müll"? Mach mal n Beispiel :)

Und dann: du kannst bei dem Hook ja nicht garantieren, dass er nicht gleichzeitig öfters ausgeführt wird (wenn z.B. das verschlüsselte Programm Threads benutzt). Somit würd ich noch ne CriticalSection einführen.

Achja, ich geh mal davon aus, dass du deine Hook-Funktion (also die Funktion, die den Hook "aktiviert") getestet ist und funktioniert :)



MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems