| Autor |
Beitrag |
MCQ
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Mi 08.02.06 19:53
Hey, Ich wolllte mich mal mit CreateRemoteThread beschäftigen. Nun hab ich schon herausgefunden, das man den Code und die dafür notwendigen Daten in den Remot-Prozess kopieren muss um mit CreateRemoteThread einen Thread erstellen zu können. Das hab ich auch getan. Wenn ich es zum testen in den eigenen Prozess injeziere funktioniert es auch tadellos. Sobald ich es aber in in eine andere Anwendung injeziere wird diese "aus Sicherheitsgründen geschlossen". Sie stürzt also ab. Kann mir jemannd sagen woran das liegt und wie ich es ändern kann?
Gruß MCQ
Ich poste hier mal meinen bisherigen Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159:
| unit Unit2;
interface
uses Windows, Sysutils;
implementation
function GetProcSize(proc : Pointer) : Cardinal; begin result := 1; while(true)do begin if(Byte((pointer(Cardinal(proc) + result - 1))^) = $C3)then Break; Inc(result); end; end;
function ExpandFileName(const FileName: string): string; var FName: PChar; Buffer: array[0..MAX_PATH - 1] of Char; begin SetString(Result, Buffer, GetFullPathName(PChar(FileName), SizeOf(Buffer), Buffer, FName)); end;
procedure Thread(param:Pointer);stdcall; var pLoadLibrary,pGetProcAddress:pointer; LoadLibrary : function(libname:PChar):THandle;stdcall; GetProcAddress : function(hModule:THandle;ProcName:PChar):Pointer;stdcall; MsgBox : function (h:THandle;Text,Caption:PChar;typ:integer):integer;stdcall; user32 : PChar; kernel32 : PChar; msg_api : PChar; h:THandle; begin asm {$IFDEF Set_BreakPoint} int 3 {$ENDIF} mov eax,[ebp+8] xor ebx,ebx mov bl, [eax] add eax, ebx inc eax mov ebx, [eax] mov pLoadLibrary,ebx add eax, 4 mov ebx, [eax] mov pGetProcAddress,ebx xor ecx, ecx xor edx, edx mov al,[ebp+8] mov ebx, eax mov cl, [eax] add ebx, ecx add ebx, 9 inc eax mov user32, ebx inc ebx mov dl,[eax] add ebx,edx inc eax mov kernel32, ebx inc ebx mov dl,[eax] add ebx,edx inc eax mov msg_api, ebx end; @LoadLibrary:=pLoadLibrary; @GetProcAddress:=pGetProcAddress; h:=LoadLibrary('user32.dll'); @MsgBox:=GetProcAddress(h,msg_api); MsgBox(0,user32,kernel32,0); end;
var param : pByteArray; p : Pointer; pAPI : Pointer; tmp : DWORD; s : PChar; len : byte; num : byte; hProcess : THandle; ThreadSize: DWORD; procedure AddPtr(var p:Pointer;i:integer); begin p:=ptr(DWORD(p)+i); end; begin ThreadSize:=GetProcSize(@Thread); num:=0; hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID()); param:=VirtualAllocEx(hProcess, nil, 30 + threadsize, MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(hProcess,param,@num,SizeOf(num),tmp); p:=param;
AddPtr(p,1); len:=length('user32.dll'); inc(num); WriteProcessMemory(hProcess,p,@len,SizeOf(len),tmp);
AddPtr(p,1); len:=length('kernel32.dll'); inc(num); WriteProcessMemory(hProcess,p,@len,SizeOf(len),tmp);
AddPtr(p,1); len:=length('MessageBoxA'); inc(num); WriteProcessMemory(hProcess,p,@len,SizeOf(len),tmp);
WriteProcessMemory(hProcess,param,@num,SizeOf(num),tmp);
AddPtr(p,1); pAPI:=GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'); WriteProcessMemory(hProcess,p,@pAPI,SizeOf(pAPI),tmp);
AddPtr(p,SizeOf(pAPI)); pAPI:=GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetProcAddress'); WriteProcessMemory(hProcess,p,@pAPI,SizeOf(pAPI),tmp);
AddPtr(p,SizeOf(pAPI)); s:='user32.dll'; pAPI:=@s; pAPI:=Pointer(DWORD(pAPI^)); WriteProcessMemory(hProcess,p,pAPI,length(s),tmp); AddPtr(p,length(s)+1);
s:='kernel32.dll'; pAPI:=@s; pAPI:=Pointer(DWORD(pAPI^)); WriteProcessMemory(hProcess,p,pAPI,length(s),tmp); AddPtr(p,length(s)+1);
s:='MessageBoxA'; pAPI:=@s; pAPI:=Pointer(DWORD(pAPI^)); WriteProcessMemory(hProcess,p,pAPI,length(s),tmp); AddPtr(p,length(s)+1); writeProcessMemory(hProcess,p,@Thread,1024,tmp); CreateRemoteThread(hProcess,nil,0,p,param,0,tmp); end. |
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mi 08.02.06 20:17
wie soll der das bitte machen?:
h:=LoadLibrary('user32.dll');
und wenn du nen BP hast dann debug es doch.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
MCQ 
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Mi 08.02.06 20:21
naja das probl. is er ruft die funktion nicht auf
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 08.02.06 22:28
Soweit ich den Source richtig verstehe, kann das so nicht funzen ...
Du fragst in deinem Adressraum ab, wo die Kernel32.dll und andere DLLs (sowie deren Funktionen) liegen und nutzt diese Werte für den Zugriff auf diese Funktionen im Remote-Thread. Das kann nicht gutgehen.
Unter Win98 mag das funzen ... Jedes WinNT verhagelt Dir das, da kaum eine DLL in zwei Prozessen an der gleichen Stelle liegt ...
Lese jegliche API-Befehle und deren Adressen im Zielprozess ein.
Weiterhin zu beachten:
1. Nur relative Sprünge
2. keine Absoluten Adressangaben!
Have a nice day!
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
MCQ 
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Mi 08.02.06 22:31
aber wie lese ich die adressen der api's ein ohne welche zu nutzen?
Oder wie lese ich die Adressen der PI's im Remote-Prozess aus?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 08.02.06 22:36
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
MCQ 
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Do 09.02.06 01:53
hmm hab es mir mal angeschaut, aber auch da keine funktion gefunden die mir weiterhilft. Das einzigste Was dabei ist ist eine Funktion die das selbe macht was ich schon programmiert hab, nämlich den Thread injezieren und starten
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Do 09.02.06 10:33
Also so wie du es da hast, funktioniert das doch in der eigenen Anwendung.
Den mainpart solltest du besser in eine Funktion auslagern.
Es wird aber nicht mit einem Fremden Prozess funktionieren, da bei
h:=LoadLibrary('user32.dll');
der PChar natürlich nicht stimmt.
Kernel32.dll ist in jedem Prozess an der gleichen Stelle, vondaher kannst du da ruhig die Adressen nehmen die du per GetPRocAddress aus dem eigenen Prozess holst. Was anderes mach ich bei mir in der Collection auch nicht.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
MCQ 
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Do 09.02.06 10:55
| uall@ogc hat folgendes geschrieben: | h:=LoadLibrary('user32.dll');
der PChar natürlich nicht stimmt. |
ARKS bin ich bekloppt
Hab den Source grade etwas geändert, es muss natürlich heißen
Delphi-Quelltext 1:
| h:=LoadLibrary(user32); |
Da in user32 der PChar "user32.dll" steht, dann sollte es eigentlich funktionieren ... aber es stürzt nach wie vor ab. Stuzig macht mich weiterhin das der Debugger auf meinem BP in der ersten Zeile der Thread-Prozedur nicht reagiert obwohl ich die Auskommentierung des entsprechenden Debugger-Define rückgängig gemacht hab. Ich hab das gefühl Sie wird gar nicht ausgeführt  Es Sieht für mich fast so aus als würde ich an eine falsche stelle im Code verweisen. Sind die Parameter die ich CreateRemoteThread übergeben hab so korrekt?
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Do 09.02.06 13:07
Hab mir zwar die MSDN angeschaut aber wo ist der Zweck/Logik einen Thread an einen anderen Prozess zu binden?
|
|
MCQ 
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Do 09.02.06 13:38
Im Moment will ich es einfach nur lernen weil es etwas isst was ich noch nicht kann. Aber Einsatzgebiete gibt es dafür auch einige. z.B. im Securitybereich. Man kann man eine Funktion in den Eltern-Prozess auslagen, welche im Elternproess APIs hookt die ein Debugger nutzen würde. Die Explorer.exe ist im normalfall dieser Elternprozess, diese wird die Debugging-APIs selbst aber nicht nutzen ... denke ich mal. Wenn die Prozedur merkt das der Prozess (unser kleines tool) beendet wurde macht er die API-Hooks rückgängig und beeendet den Thread. Das ist nur eine Theorie anwendung, in der Praxis konnte ich es noch nicht testen.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 09.02.06 15:52
@uall: Ich dachte da an die uallKernel-Unit, speziell GetKernelHandle und LoadLibraryX  Die kann man mit ein wenig phantasie auch in nem Remote-Thread ausführen lassen *g*
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Do 09.02.06 19:31
MCQ der oben benutzte Quellcode funktioniert bei mir ohne Probleme, das muss dann an dir liegen 
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
MCQ 
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Do 09.02.06 19:35
Hast du dabei auch mal versucht in der Zeile
Delphi-Quelltext 1:
| hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID()); |
eine andere PID einzutragen? im eigenen Prozess funktioniert es nämlich bei mir auch, im fremden nur nicht
Im eigenen Prozess würden mit X wege einfallen die weniger umständlich währen um einen Thread zu erzeugen, aber das ziel ist es ja einen Thread in einem fremden Prozess zu starten.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Do 09.02.06 21:19
Geht bei mir auch mit nem fremden Prozess.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
MCQ 
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Fr 10.02.06 07:52
dann weiss ich echt nicht mehr was ich falsch mache. Ich hab es mit Notepad, dem IE, Thunderbird und dem Explorer versucht und alle sind abgesstürzt 
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 10.02.06 15:36
Ich hab das mal so überarbeitet:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113:
| unit Unit2;
interface
uses Windows, Sysutils, uallProcess;
procedure bla;
implementation
function ExpandFileName(const FileName: string): string; var FName: PChar; Buffer: array[0..MAX_PATH - 1] of Char; begin SetString(Result, Buffer, GetFullPathName(PChar(FileName), SizeOf(Buffer), Buffer, FName)); end;
procedure Thread(param:Pointer); stdcall; var XLoadLibrary : function(libname:PChar):THandle;stdcall; XGetProcAddress : function(hModule:THandle;ProcName:PChar):Pointer;stdcall; XMsgBox : function (h:THandle;Text,Caption:PChar;typ:integer):integer;stdcall; Xuser32 : PChar; Xkernel32 : PChar; Xmsg_api : PChar; h:THandle; incb: PByte; begin incb := Param; Param := Pointer(integer(Param)+1); XUser32 := Param;
Param := Pointer(Integer(Param)+incb^); incb := Param; Param := Pointer(integer(Param)+1); XKernel32 := Param;
Param := Pointer(Integer(Param)+incb^); incb := Param; Param := Pointer(integer(Param)+1); Xmsg_api := Param;
Param := Pointer(Integer(Param)+incb^);
@XLoadLibrary := PPointer(Integer(Param)+0)^; @XGetProcAddress := PPointer(Integer(Param)+4)^;
h := XLoadLibrary(Xuser32); @XMsgBox := XGetProcAddress(h,Xmsg_api); XMsgBox(0,Xuser32,Xkernel32,0); end;
procedure ThreadEnd; asm end;
procedure bla; var param : pByteArray; p : Pointer; pAPI : Pointer; tmp : DWORD; hProcess : THandle; S, T: String; procedure AddPtr(var p:Pointer;i:integer); begin p:=ptr(integer(p)+i); end; begin hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,findProcess('firefox')); param:=VirtualAllocEx(hProcess, nil, 30 + Integer(@ThreadEnd)-Integer(@Thread ), MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
p:=param; t := 'user32.dll'#0; s := Char(Length(t))+t; WriteProcessMemory(hProcess,p,@s[1],Length(s),tmp); AddPtr(p,tmp);
t := 'kernel32.dll'#0; s := Char(Length(t))+t; WriteProcessMemory(hProcess,p,@s[1],Length(s),tmp); AddPtr(p,tmp);
t := 'MessageBoxA'#0; s := Char(Length(t))+t; WriteProcessMemory(hProcess,p,@s[1],Length(s),tmp); AddPtr(p,tmp);
pAPI:=GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'); WriteProcessMemory(hProcess,p,@pAPI,SizeOf(pAPI),tmp); AddPtr(p,tmp);
pAPI:=GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetProcAddress'); WriteProcessMemory(hProcess,p,@pAPI,SizeOf(pAPI),tmp); AddPtr(p,tmp);
WriteProcessMemory(hProcess,p,@Thread,Integer(@ThreadEnd)-Integer(@Thread),tmp); CreateRemoteThread(hProcess,nil,0,p,param,0,tmp); end;
end. |
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
MCQ 
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Fr 10.02.06 16:18
Anscheinend hab ich es nur versucht in den falschen Prozess zu injezieren. Mit firefox funktioniert es, Notepad und der Explorer stürzen aber ab  Hast du ne Idee worn das lieg?
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 10.02.06 17:20
Du machst mir das echt nicht einfach.
Habs kompiliert, doppelklick in die listbox und der injected es in den prozess.
Einloggen, um Attachments anzusehen!
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
MCQ 
      
Beiträge: 75
Windows 95/98/XP
Delphi 7 Etp.
|
Verfasst: Fr 10.02.06 17:25
uall@ogc hat folgendes geschrieben: | | Du machst mir das echt nicht einfach. |
Sorry
uall@ogc hat folgendes geschrieben: | | Habs kompiliert, doppelklick in die listbox und der injected es in den prozess. |
Ich sags ja ungern ... aber beim notepad gibt es bei injecten immernoch einen craah seitens notepad. Auch bei der von dir compileten exe. Ich hoffe es testet außer mir nochjemannd, schließlich ist es ja möglich das es an meinem System liegt. Obwohl das eigendlich frisch installiert ist.
|
|
|