| 
| Autor | Beitrag |  
| viper3001 Hält's aus hier
 Beiträge: 15
 
 
 
 
 | 
Verfasst: Fr 08.06.12 19:23 
 
Hi leute, 
 habe jetzt shcon ne weile gegoogelt und nix direktes zu meinem Problem gefunden. Undzwar hatte ich mir mit delphi 7 noch einen injector geschrieben, der unter XE2 nun nicht mehr geht. Habe als test versucht eine 64x bit dll in notepad zu laden aber irgendwie klappt das nicht(habe natürlich den injector mit XE2 auf 64bit geschrieben und alles angepasst). Vermute stark das createremoteprocess einfach nicht richtig will, oder ich mache einen anderen fehler. Hier mal das was ich so geschrieben hab:
 												| 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:
 
 | procedure TForm1.Button1Click(Sender: TObject);begin
 if (not FileExists(ExtractFilePath(ParamStr(0)) + 'Project1.dll')) then
 begin
 showmessage('die datei ist nicht vorhanden');
 end
 else
 InjectDLL(ExtractFilePath(ParamStr(0)) + 'Project1.dll',
 strtoint(Edit1.Text));
 end;
 
 function GetDebugPrivilege: boolean; stdcall;
 var
 hToken: THandle;
 rel: Cardinal;
 tkp: TOKEN_PRIVILEGES;
 luid: int64;
 begin
 result := false;
 if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
 TOKEN_QUERY, hToken) then
 begin
 if LookupPrivilegeValue(nil, 'SeDebugPrivilege', luid) then
 begin
 tkp.PrivilegeCount := 1;
 tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 tkp.Privileges[0].luid := luid;
 result := AdjustTokenPrivileges(hToken, false, tkp, sizeof(tkp),
 nil, rel);
 end;
 CloseHandle(hToken);
 end;
 end;
 
 procedure TForm1.FormCreate(Sender: TObject);
 begin
 if (not GetDebugPrivilege) then
 raise Exception.Create('Keine debugprivilegien');
 end;
 
 procedure TForm1.InjectDLL(const ADLLName: String; targetproc: Cardinal);
 var
 dllname: String;
 pDLLname, pStartAddr: Pointer;
 bw, hProzess, hRemoteThread: THandle;
 TID: Cardinal;
 begin
 hRemoteThread := 0;
 bw := 0;
 pDLLname := nil;
 dllname := '';
 dllname := ADLLName;
 hProzess := 0;
 pStartAddr := nil;
 
 hProzess := OpenProcess(PROCESS_ALL_ACCESS, false, targetproc);
 pDLLname := VirtualAllocEx(hProzess, 0, length(dllname),
 MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
 
 WriteProcessMemory(hProzess, pDLLname, PChar(dllname), length(dllname), bw);
 
 pStartAddr := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA');
 hRemoteThread := CreateRemoteThread(hProzess, nil, 0, pStartAddr,
 pDLLname, 0, TID);
 WaitForSingleObject(TID, INFINITE);
 showmessage('Fehler ' + IntToStr(GetLastError) + ': ' +
 SysErrorMessage(GetLastError));
 CloseHandle(hProzess);
 end;
 |  die dll:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 
 | usesWindows;
 
 {$R *.res}
 
 var
 s: String;
 
 begin
 s := ParamStr(0);
 MessageBox(HWND_DESKTOP, PChar('Ja es klappt!' + #13 + s),
 'Injection Message', MB_ICONINFORMATION);
 
 end.
 |  eigentlich ein recht simples beispiel aber irgendwie hänge ich da schon ne woche fest-.-
 Wäre echt super falls ihr mir da auf die sprünge helfen könntet.
 MfG
 hier die procedure die bei mir mit delphi 7 immernoch geht:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 
 | procedure InjectDll(PID: dword;  DLL: pChar);      var
 BytesWritten, hProcess, hThread, TID: Cardinal;
 Parameters: pointer;
 pThreadStartRoutine: Pointer;
 begin
 hProcess := OpenProcess(PROCESS_ALL_ACCESS,  False,  PID);
 Parameters := VirtualAllocEx( hProcess, nil, Length(DLL)+1, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
 WriteProcessMemory(hProcess,Parameters,Pointer(DLL),Length(DLL)+1,BytesWritten);
 pThreadStartRoutine := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'LoadLibraryA');
 hThread := CreateRemoteThread(hProcess,  nil,  0,  pThreadStartRoutine,  Parameters,  0,  TID);
 CloseHandle(hProcess);
 end;
 |  falls es wen interessiert Lösung:
stackoverflow.com/qu...lphi-7-to-delphi-xe2 |  |  |  
| AndyB 
          Beiträge: 1173
 Erhaltene Danke: 14
 
 
 RAD Studio XE2
 
 | 
Verfasst: So 10.06.12 08:33 
 
	  | Zitat: |  	  | WriteProcessMemory(hProzess, pDLLname, PChar(dllname), length(dllname), bw); | 
 dllname ist ein UnicodeString (2 Byte pro Zeichen), den du versuchst in einen für AnsiString (1 Byte pro Zeichen) reservierten Block zu quetschen. Somit sieht "LoadLibraryA" nur den ersten Buchstaben (wenn ASCII-Zeichen) und das Nullzeichen, was natürlich kein gültiger Dateiname ist.
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 
 | varAnsiDllName: AnsiString;
 begin
 AnsiDllName := AnsiString(dllName);   pDLLname := VirtualAllocEx(hProzess, 0, Length(AnsiDllName) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);   WriteProcessMemory(hProzess, pDLLname, PChar(AnsiDllName), Length(AnsiDllName) + 1, bw);   end;
 |  Der "Injector" muss auch 64-Bit sein, wenn du ein 64-Bit Programm manipulieren willst, sonst liefert OpenProcess einen Fehler._________________ Ist Zeit wirklich Geld?
 |  |  |  
| viper3001  Hält's aus hier
 Beiträge: 15
 
 
 
 
 | 
Verfasst: Di 12.06.12 07:11 
 
Der injector war 64bit es lag aber wie du auch festgestellt hast am unicode. Habe mich nun dazu entschieden bei unicode zu bleibene und
GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryW');
 
 zu machen damit funktioniert es dann. Danke für die antwort^^
 |  |  |  |