Dll inject problemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Dll inject problemi

Mesaj gönderen carsoft »

Yazmış olduğum dll 32 ve 64 bit sorunsuz çalışmaktadır. Bu dll'yi -inject etmek istiyorum ama hata olmamasına rağmen bir türlü olmuyor.

Çıktı şu şekilde :

https://ibb.co/k8XrFR

pTargetMemory: True
pLoadLibraryA: True
writtenBytes: 291
TID : 5460
Exit Code : 53608448
Last Error : 0
LastErrorMsg: The operation completed successfully.

Hiç hata yok ama dll inject olmuyor.

Kullandığım inject fonksiyonu

Kod: Tümünü seç

Function InjectDll(Process: dword; ModulePath: PChar): boolean;
var
  Memory:pointer;
  Code: dword;
  BytesWritten: dword;
  ThreadId: dword;
  hThread: dword;
  hKernel32: dword;
  Inject: packed record
           PushCommand:byte;
           PushArgument:DWORD;
           CallCommand:WORD;
           CallAddr:DWORD;
           PushExitThread:byte;
           ExitThreadArg:dword;
           CallExitThread:word;
           CallExitThreadAddr:DWord;
           AddrLoadLibrary:pointer;
           AddrExitThread:pointer;
           LibraryName:array[0..MAX_PATH] of char;
          end;
begin
  Result := false;
  Memory := VirtualAllocEx(Process, nil, sizeof(Inject),
                           MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if Memory = nil then Exit;

  Code := dword(Memory);

  Inject.PushCommand    := $68;
  inject.PushArgument   := code + $1E;
  inject.CallCommand    := $15FF;
  inject.CallAddr       := code + $16;
  inject.PushExitThread := $68;
  inject.ExitThreadArg  := 0;
  inject.CallExitThread := $15FF;
  inject.CallExitThreadAddr := code + $1A;
  hKernel32 := GetModuleHandle('kernel32.dll');
  inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
  lstrcpy(@inject.LibraryName, ModulePath);

  WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten);
  hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
  if hThread = 0 then Exit;
  CloseHandle(hThread);
  Result := True;


  // Debug- Bilgisi
    ShowMessage('pTargetMemory: ' + BoolToStr(Memory<>nil, true) + sLineBreak +
                'pLoadLibraryA: ' + BoolToStr(ModulePath<>nil, true) + sLineBreak +
                'writtenBytes: ' + IntToStr(BytesWritten) + sLineBreak +
                'TID: ' + IntToStr(ThreadId) + sLineBreak +
                'Exit Code: ' + IntToStr(Code) + sLineBreak +
                'LastError: ' + IntToStr(GetLastError) + sLineBreak +
                'LastErrorMsg: ' + SysErrorMessage(GetLastError)
               );
end;

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
begin
  PDosya := GetProcessId('Project1.exe');
  PDosya :=OpenProcess(PROCESS_ALL_ACCESS,False,PDosya);
  InjectDll(PDosya, PAnsiChar(MyPath+'kontol.dll'));
end;
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Dll inject problemi

Mesaj gönderen ertank »

Merhaba,

Yapmak istediğiniz kernel32.dll içindeki LoadLibraryA fonksiyonu yerine sizin kendi DLL'iniz içindeki aynı fonksiyonun kullanılmasını sağlamak mı? Biraz daha detay bilgi verebilir misiniz?
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Dll inject problemi

Mesaj gönderen carsoft »

Merhaba ertan abi.

Bir Hook unitim var. ben explorer.exe veya windowsun başka bir uygulamasına notepad.exe ' de olabilir kendi dll'mi inject ederek kanca atmak istiyorum. ama olmuyor.Windowsun process id sini aldığım bir uygulamaya inject etmek istiyorum.
Mesela :

Kod: Tümünü seç

PDosya := GetProcessId('explorer.exe');
içine

Kod: Tümünü seç

InjectDll(PDosya, PAnsiChar(MyPath+'kontol.dll'));
dll'mi inject etmek istiyorum.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Dll inject problemi

Mesaj gönderen ertank »

Yapmak istediğinizi yine belirtmediniz. Hook() işlemini belli bir işlem için yaparsınız. Örneğin;

A uygulaması kernel32.dll içindeki GetModuleFileNameA() fonksiyonunu kullandığını biliyorsunuz. Bu fonksiyona giden parametreyi değiştirmek için hook işlemi uygulayabilirsiniz. Hook işlemi GetModuleFileNAmeA() fonksiyonu A uygulaması tarafından çağırılmadan önce yapılmış olması gerekiyor.

Bu örneğe benzer olarak sizin verdiğiniz bilgi ile ne yapmak istediğinizden emin olamadım. Amacınız herhangi bir EXE uygulamanın öncelikle sizin DLL'iniz içindeki belirli bir fonsiyonu çalıştırması mı?
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Dll inject problemi

Mesaj gönderen carsoft »

evet benim dll içindeki bir bir fonksiyonu çalıştırmak istiyorum. yönetici olarak çalıştırıyorum xp de ve win7 sp1 de CreateProcess üzerinde çalışıyor. ama diger win7 versiyonlarında çalışmıyor.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Dll inject problemi

Mesaj gönderen ertank »

Ekteki iki uygulamayı inceleyin. Windows 10 64bit ile yönetici izini olmadan çalışıyorlar.

Örnek direk kullanılır iken dikkat etmeniz gereken enjekte edilecek EXE uygulamanın 32bit olması. Eğer işletim sisteminiz 64bit ise çalıştırdığınız notepad.exe uygulaması da yüksek ihtimal ile 64bit olarak çalışıyor olur ve bu işlemin çalışmaması için yeterlidir.

Eğer ekteki örnek uygulamayı 64bit olarak derler iseniz bu defa DLL dosyasını da 64bit olarak derlemeniz gerekir. Aynı şekilde enjekte edilecek EXE uygulamanında yine 64bit olması gerekir.
Dosya ekleri
dll.7z
enjekte edilecek dll uygulaması
(5.52 KiB) 102 kere indirildi
testdllinjection.7z
enjekte işlemini yapan uygulama
(6.79 KiB) 106 kere indirildi
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Dll inject problemi

Mesaj gönderen carsoft »

çok teşekkür ederim abi örnek için ama ben delphi 7 kullanıyorum ve bu satırda hata alıyorum.

Kod: Tümünü seç

WriteProcessMemory(hProcess, BaseAddress, PAnsiChar(DLLFileName), Length(DLLFileName) + 1, Size);
Types of actual and formal var parameters must be identical
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Dll inject problemi

Mesaj gönderen ertank »

Soru sorar iken kullandığınız Delphi sürümünü paylaşmanızda fayda var.

Eğer derleyici hata verdiğinde belirli bir değişken üzerinde duruyor ise ilgili değişkenin veri türünü CTRL+Boşluk karakteri ile gelecek "hint" içinde inceleyin. Eğer derleyici hangi parametre olduğu konusunda yardımcı olmuyor ise bütün parametrelerin veri türünü inceleyip sizin fonksiyon içinde gönderdiğiniz parametre değişkenlerinin veri türleri ile karşılaştırmanız gerekecektir.

Yüksek ihtimal "Size" parametresinin veri türünü farklı istiyor. Ancak farklı bir parametre için de hata veriyor olabilir.

Eğer hata "Size" değişkeni veri türü için ise *tahminen* aşağıdaki şekilde çalışması gerekir diye düşünüyorum:

Kod: Tümünü seç

var
  Size: Cardinal;
begin
Size değişkeni veri türü değiştiği zaman aşağıdaki type cast veri türünü de uygun şekilde değiştirmelisiniz

Kod: Tümünü seç

       if Cardinal(Length(DLLFileName) + 1) = Size then
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Dll inject problemi

Mesaj gönderen carsoft »

haklısın ertan abi ama debugView ile baktığım zaman inject olmadığını görüyorum windowsun her hangi bir uygulamasına explorer.exe neden acaba benim dll de çalışmadı seninkide injection complete yazıyor, logda yazıyor ama inject olmuyor gerçekte
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Dll inject problemi

Mesaj gönderen ertank »

DLL dosyası kodunu incelediniz mi? DLL çalıştığı zaman yapması gereken işlemi yapıyor ise injection çalışıyor demektir. Örnek uygulamada injection çalışmasının anlamı Log dosyasına injection zamanının kaydedilmesi oluyor. DLL bu şekilde çalışıyor. Ancak C sürücüsünde log dosyasının kayıt edileceği dizinin önceden oluşturulmuş olması gerekli.

Injection kullanılır iken kullanıcı ile etkileşimli (GUI) işlemler yapılması hiç tavsiye edilmez.
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Dll inject problemi

Mesaj gönderen carsoft »

zaten Temp dosyasını kendim oluşturdum abi
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Dll inject problemi

Mesaj gönderen ertank »

Eğer "C:\temp\dll_inject.txt" dosyası var ise ve içinde aşağıdaki gibi satırlar var ise işlem başarılı bir şekilde çalışıyor demektir.

Kod: Tümünü seç

2017-12-14 18:38:25.975    Dll main execution block run.
Eğer çalışmıyor ise enjekte ettiğiniz EXE uygulamasının 32bit olduğundan tekrar emin olun. Mümkün ise Calc.exe ve notepad.exe dışında uygulamalar ile deneyin. Windows 10 işletim sisteminde bu uygulamalar faklı bir şekilde çalıştırılmaktadırlar.

Ben Notepad++ uygulaması ile denediğim zaman örnek uygulama çalışıyor.
Cevapla