Dll inject problemi

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

Dll inject problemi

Mesaj gönderen carsoft » 13 Ara 2017 12:14

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
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

Re: Dll inject problemi

Mesaj gönderen ertank » 14 Ara 2017 03:20

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: 135
Kayıt: 01 Ağu 2014 11:27

Re: Dll inject problemi

Mesaj gönderen carsoft » 14 Ara 2017 03:45

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
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

Re: Dll inject problemi

Mesaj gönderen ertank » 14 Ara 2017 03:54

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: 135
Kayıt: 01 Ağu 2014 11:27

Re: Dll inject problemi

Mesaj gönderen carsoft » 14 Ara 2017 03:56

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
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

Re: Dll inject problemi

Mesaj gönderen ertank » 14 Ara 2017 05:47

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.54 KiB) 8 kere indirildi
testdllinjection.7z
enjekte işlemini yapan uygulama
(6.81 KiB) 8 kere indirildi

carsoft
Üye
Mesajlar: 135
Kayıt: 01 Ağu 2014 11:27

Re: Dll inject problemi

Mesaj gönderen carsoft » 15 Ara 2017 09:55

ç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
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

Re: Dll inject problemi

Mesaj gönderen ertank » 15 Ara 2017 10:37

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: 135
Kayıt: 01 Ağu 2014 11:27

Re: Dll inject problemi

Mesaj gönderen carsoft » 15 Ara 2017 11:13

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
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

Re: Dll inject problemi

Mesaj gönderen ertank » 15 Ara 2017 11:42

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: 135
Kayıt: 01 Ağu 2014 11:27

Re: Dll inject problemi

Mesaj gönderen carsoft » 15 Ara 2017 11:51

zaten Temp dosyasını kendim oluşturdum abi

ertank
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

Re: Dll inject problemi

Mesaj gönderen ertank » 15 Ara 2017 06:50

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