Autor Beitrag
viper3001
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 08.06.12 20: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:

ausblenden volle Höhe Delphi-Quelltext
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, nil0, pStartAddr,
    pDLLname, 0, TID);
  WaitForSingleObject(TID, INFINITE);
  showmessage('Fehler ' + IntToStr(GetLastError) + ': ' +
    SysErrorMessage(GetLastError));
  CloseHandle(hProzess);
end;



die dll:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
uses
  Windows;

{$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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure InjectDll(PID: dword;  DLL: pChar);      {kompletter pfad benötigt}
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: So 10.06.12 09: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.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  AnsiDllName: AnsiString;
  // ...
begin
  // ...
  AnsiDllName := AnsiString(dllName); // UnicodeString in AnsiString konvertieren
  pDLLname := VirtualAllocEx(hProzess, 0, Length(AnsiDllName) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); // auch Platz für das 0-Zeichen am Ende
  WriteProcessMemory(hProzess, pDLLname, PChar(AnsiDllName), Length(AnsiDllName) + 1, bw); // auch das 0-Zeichen am Ende kopieren
  // ...
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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 12.06.12 08: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^^