Challenge 4

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 4

Mesaj gönderen G.Arkas »

@thelvacı hocam boşver güven bana şimdilik 3 kişiyiz. Iştah artacaktır. Farkındaysan bir yandan da eğleniyoruz. Çok keyifli oluyor. :)

@esistem hoşbulduk hocam. Araştırdığın konular doğru. Örnek olarak process hunter diye bir delphi uygulaması vardı onu bulursak işin %90 ı biter. O uygulamada svchost vs haberleşme örneği vardı. JwApi.pas ile. Ama bulamadım bir türlü.
Resim
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

Enteresan, eğer doğru anladıysam araştırdığımız bu konu ile alakalı ve ayrıca @G.Arkas ın son söylediği process hunter ile ilgili yaptığım ufak bir aramada, bu tip kodlar ile hem rootkit, hooking gibi olaylar yapılabiliyor hemde mesela diyelim sisteme bir virüs bulaştı, siz bu exe yi sil dediğinizde şu şu sebepten dolayı silinemiyor gibi bir hata verir genelde, zira sistemde bir kaç dll ile ortak çalışmaktadır mesela onun için silemiyorsunuzdur, yada dll yi sil dersiniz exe dosya onu kullandığı için silinemez vs.vs. fakat anladığım, bu yöntemleri kullanılarak exe yada dll nin diğer herşeyle bağlantısı kesilip, sonlandırlılıp silinebilir hale de getirilebiliyor.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 4

Mesaj gönderen G.Arkas »

esistem yazdı:Enteresan, eğer doğru anladıysam araştırdığımız bu konu ile alakalı ve ayrıca @G.Arkas ın son söylediği process hunter ile ilgili yaptığım ufak bir aramada, bu tip kodlar ile hem rootkit, hooking gibi olaylar yapılabiliyor hemde mesela diyelim sisteme bir virüs bulaştı, siz bu exe yi sil dediğinizde şu şu sebepten dolayı silinemiyor gibi bir hata verir genelde, zira sistemde bir kaç dll ile ortak çalışmaktadır mesela onun için silemiyorsunuzdur, yada dll yi sil dersiniz exe dosya onu kullandığı için silinemez vs.vs. fakat anladığım, bu yöntemleri kullanılarak exe yada dll nin diğer herşeyle bağlantısı kesilip, sonlandırlılıp silinebilir hale de getirilebiliyor.
Yani Antivirüs uygulamalarının kullandığı unHooker metodu gibi. Aynı zamanda TerminateProcessA ve TerminateProcessW apilerini hook ederek sonlandırmayı engelleyebilirsin. RootKit yazılımlarının işi tüm Process yada belirli dll dosyalarına injection yapmak ve RunPE ile Memory Execute çalışmak. Tuğrul abinin bu kaynağını bende Crew'de kullanacağım ama önce öğrenmem gerek. :D @thelvacı hocam bu challengelar sonunda hepimiz Trojancı olacaz haberin ola :lol: :lol:

Şurada bir kaynak var

http://www.grahamwideman.com/gw/tech/De ... rtTest.htm
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

Günaydın arkadaşlar, sizlere küçük bir ipucu verecek bağlantıya buradan ulaşabilirsiniz. Aynı zamanda, küçük bir örneği de buradan indirebilirsiniz.

Bu örneğe binaen, Delphi'de küçük bir örnek hazırlamanız daha kolay olacaktır sanıyorum ;)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

esistem yazdı:Günaydın,
@G.Arkas hoşgeldin :)
Dün öğleden sonra nerdeyse akşama kadar araştırdım 1 tane eli yüzü düzgün örnek bulamadım. Tuğrul beyin dediği gibi Jedi JWA kütüphanesinde apiler var, doğru şeyimi araştırdım bilmiyorum ama NtCreatePort, NtCreateProcess vs.vs apileri ile cebelleşip durdum. Fakat bir sonuca ulaşamadım :(
NtCreatePort doğru api, ama NtCreateProcess değil. NtCreateProcess, CreateProcess API'sinin low level hali. Verdiğim link üzerinden hangi API'ler ile ilgilenmeniz gerektiğini gözlemleyebilirsiniz. ;)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

G.Arkas yazdı:
esistem yazdı:Enteresan, eğer doğru anladıysam araştırdığımız bu konu ile alakalı ve ayrıca @G.Arkas ın son söylediği process hunter ile ilgili yaptığım ufak bir aramada, bu tip kodlar ile hem rootkit, hooking gibi olaylar yapılabiliyor hemde mesela diyelim sisteme bir virüs bulaştı, siz bu exe yi sil dediğinizde şu şu sebepten dolayı silinemiyor gibi bir hata verir genelde, zira sistemde bir kaç dll ile ortak çalışmaktadır mesela onun için silemiyorsunuzdur, yada dll yi sil dersiniz exe dosya onu kullandığı için silinemez vs.vs. fakat anladığım, bu yöntemleri kullanılarak exe yada dll nin diğer herşeyle bağlantısı kesilip, sonlandırlılıp silinebilir hale de getirilebiliyor.
Yani Antivirüs uygulamalarının kullandığı unHooker metodu gibi. Aynı zamanda TerminateProcessA ve TerminateProcessW apilerini hook ederek sonlandırmayı engelleyebilirsin. RootKit yazılımlarının işi tüm Process yada belirli dll dosyalarına injection yapmak ve RunPE ile Memory Execute çalışmak. Tuğrul abinin bu kaynağını bende Crew'de kullanacağım ama önce öğrenmem gerek. :D @thelvacı hocam bu challengelar sonunda hepimiz Trojancı olacaz haberin ola :lol: :lol:

Şurada bir kaynak var

http://www.grahamwideman.com/gw/tech/De ... rtTest.htm
Arkadaşlar konudan uzaklaşmayalım :) Rootkitler yada hooking işlemi ile ilgili değil bu konu. Bu sadece, her iki process'i nerede olursa olsun birbirleri ile haberleştirmek için kullanılıyor. İster kernel <--> user land olsun isterse user land <--> user land iletişimin gerçekleşmesi için gereken API'ler ve teknoloji bizim bahsettiğimiz. Dediğim gibi IPC mekanizmalarının en altında dökümante edilmemiş, işletim sisteminin yoğun olarak kullandığı bir iletişim protokolü diyelim biz buna.

Trojan yazmak çok da zor bir şey değil ama rootkit yazmak o kadar da kolay değil. Çünkü; rootkitler %99 oranında kernel tarafında bir device driver olarak yazılırlar ve genelde SSDT hooking yaparlar/dı. Artık bu da koruma mekanizmaları ile engellenmiş durumda. Kısaca; rootkitler işletim sisteminin kullandığı orjinal API'lerin adreslerini elde edip; onların yerine kendi metodlarının adreslerini yazan uygulamalardır. Bu sayede işletim sisteminin orjinal API'sine yapılan her çağrım önce kendi metodları üzerinden geçer ;)

Injection ve hooking ise tamamen farklı hususlar. Injection için pek çok teknik var en basiti DLL injection, hatta bu konu ile ilgili bir makaleyi sitemde uzun zaman önce paylaşmıştım. Hooking olayında ise genelde mantık, tüm çalışan process'lere code injection yapılarak ntdll.dll yada kernel32.dll üzerindeki API'lerin başlangıç adreslerinin değiştirilmesi, ilk bir kaç byte'ına asm jmp instruction'larının konulması yada trampoline denilen işlemlerin yapılması ile olur. Velhasılı derin mevzular ve konumuzdan biraz uzak, o yüzden fokusunuzu kaybetmeyin bu hususlar ile :)

Gerekir ise bilgimiz dahilinde bunları da tartışabiliriz ama, bu konulara da ilginin fazla olacağını sanmam.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

Valla hocam dünden beri o zezula daki lpc örneğini inceliyorum ama C beni aşıyor, ntdll.lib i kulanıyor, hatta bir proje daha bulmuştum dün recon mu refcon mu neydi adı, güzelce açıklamış adamlar ama hepsi C dili ile. mecburen beklicem sizi, bakalım neler çıkıcak :) hem şu C dili nasıl delphi ye çevriliyomuş öğrenirim belki :)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

esistem yazdı:Valla hocam dünden beri o zezula daki lpc örneğini inceliyorum ama C beni aşıyor, ntdll.lib i kulanıyor, hatta bir proje daha bulmuştum dün recon mu refcon mu neydi adı, güzelce açıklamış adamlar ama hepsi C dili ile. mecburen beklicem sizi, bakalım neler çıkıcak :) hem şu C dili nasıl delphi ye çevriliyomuş öğrenirim belki :)
Zor bir yanı yok ki; mevcut API'lerin Delphi syntax'ın da nasıl yazıldıklarını bulmak ve çağrımı yapmak kalıyor. Dediğim gibi o makaledeki kullanılan API'lerin tanımları Delphi için Jedi kaynaklarında(JwaNative.pas) var. Tanımları buradan alıp kendi uygulamanıza yapıştırın ardından da LoadLibrary ile ntdll.dll 'i yükleyin ve GetProcAddress ile ilgili metodu bulun; sonra da sitede gösterildiği gibi uygulayın.

NtAlpc* API'leri ise dediğim gibi Process Hacker açık kaynak kodlu uygulamanın içinde; ntlpcapi.h dosyası içinde tanımlı. Gerekir ise bu dosyayı da bir yerlere upload edip indirmenizi sağlayabilirim.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

Gerekli bütün dosyalar elimde var sanırım (jwanative.pas, ntlpcabi.h daha bir sürü dosya) dünden beri tonla şey indirdim tuğrul hocam, fakat dediğim gibi bu konularda zayıfım :( en basiti anladığım şekilde aşağıda bir örnek kod, doğrumudur değilmididr hiç bir fikrim yok :)

Kod: Tümünü seç

function NtCreatePort(
    PortHandle:dword; //OUT PHANDLE
    ObjectAttributes:string; //IN  POBJECT_ATTRIBUTES
    MaxConnectionInfoLength:integer;//IN  ULONG
    MaxMessageLength:integer;//IN  ULONG ,
    MaxPoolUsage:integer {IN  ULONG}): PHANDLE; stdcall; external 'ntdll.dll';
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 4

Mesaj gönderen G.Arkas »

@thelvacı hocam sakın cevabı söyleme Allah aşkına çalışıyorum üzerinde :)
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

esistem yazdı:Gerekli bütün dosyalar elimde var sanırım (jwanative.pas, ntlpcabi.h daha bir sürü dosya) dünden beri tonla şey indirdim tuğrul hocam, fakat dediğim gibi bu konularda zayıfım :( en basiti anladığım şekilde aşağıda bir örnek kod, doğrumudur değilmididr hiç bir fikrim yok :)

Kod: Tümünü seç

function NtCreatePort(
    PortHandle:dword; //OUT PHANDLE
    ObjectAttributes:string; //IN  POBJECT_ATTRIBUTES
    MaxConnectionInfoLength:integer;//IN  ULONG
    MaxMessageLength:integer;//IN  ULONG ,
    MaxPoolUsage:integer {IN  ULONG}): PHANDLE; stdcall; external 'ntdll.dll';
En basit hali ile aşağıdakine benzer bir kullanım olacaktır:

Kod: Tümünü seç

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  PUNICODE_STRING = ^UNICODE_STRING;
  UNICODE_STRING = record
    Length: USHORT;
    MaximumLength: USHORT;
    Buffer: LPWSTR;
  end;

  POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
  OBJECT_ATTRIBUTES = record
    Length: ULONG;
    RootDirectory: THandle;
    ObjectName: PUNICODE_STRING;
    Attributes: ULONG;
    SecurityDescriptor: PVOID;       // Points to type SECURITY_DESCRIPTOR
    SecurityQualityOfService: PVOID; // Points to type SECURITY_QUALITY_OF_SERVICE
  end;

  TNtCreatePort = function(
                            PortHandle : PHANDLE;
                            ObjectAttributes : POBJECT_ATTRIBUTES;
                            MaxDataSize : ULONG;
                            MaxMessageSize : ULONG;
                            Reserved : ULONG
                          ): ULONG; stdcall;


  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  DLLHandle   : THandle;
  NtCreatePort: TNtCreatePort;
begin
  DLLHandle := LoadLibrary('ntdll.dll');

  if DLLHandle <> 0 then
  begin
    try
      @NtCreatePort := GetProcAddress(DLLHandle, 'NtCreatePort');

      if @NtCreatePort <> nil then
        NtCreatePort(.........);
    finally
      FreeLibrary(DLLHandle);
    end;
  end; // if DLLHandle <> 0 then
end;

end.
En son thelvaci tarafından 04 Kas 2015 11:42 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

G.Arkas yazdı:@thelvacı hocam sakın cevabı söyleme Allah aşkına çalışıyorum üzerinde :)
Tamam, söylemeyeceğim zaten, sadece ufak tefek ipuçları vereceğim ;)
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 4

Mesaj gönderen G.Arkas »

thelvaci yazdı:
G.Arkas yazdı:@thelvacı hocam sakın cevabı söyleme Allah aşkına çalışıyorum üzerinde :)
Tamam, söylemeyeceğim zaten, sadece ufak tefek ipuçları vereceğim ;)
Ben NativeApi.pas kullandım.

Create işlemi aşağıdaki gibidir. Üzerinden devam edebiliriz.

Kod: Tümünü seç

var
  DLLHandle   : THandle;
  zZwCreatePort: ZwCreatePort;
  Attibutes : UNICODE_STRING;
  mSize     : OBJECT_ATTRIBUTES;
  mStatus   : Cardinal;
  xReserved : DWORD;
begin
Attibutes.MaximumLength := SizeOf(UNICODE_STRING);
mSize.Length         := SizeOf(OBJECT_ATTRIBUTES);
DLLHandle := LoadLibrary('ntdll.dll');
  if DLLHandle <> 0 then
  begin
    try
      @zZwCreatePort := GetProcAddress(DLLHandle, 'NtCreatePort');

      if @zZwCreatePort <> nil then
       mStatus:= zZwCreatePort(0, mSize.SecurityDescriptor, mSize.Length, Attibutes.MaximumLength, xReserved); // mStatus dönen koda göre devam edeceğiz. 
    finally
      FreeLibrary(DLLHandle);
    end;
  end;
mStatus Dönecek değerler.

Kod: Tümünü seç

  STATUS_SUCCESS              = NTStatus($00000000);
  STATUS_ACCESS_DENIED        = NTStatus($C0000022);
  STATUS_INFO_LENGTH_MISMATCH = NTStatus($C0000004);
  SEVERITY_ERROR              = NTStatus($C0000000);
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

Ha gayret olacak :) Deneme uygulamanızın birisi Server diğeri Client olsun daha rahat edersiniz. "Yürü be kim tutar seni" mesajını bir taraftan gönderip diğer taraftan alabildiğiniz an işlem tamamlanmıştır :)
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 4

Mesaj gönderen G.Arkas »

NTListenPort apisini dinleyebilmek için öncelikle

Kod: Tümünü seç

  ZwListenPort = Function (PortHandle:THandle;
                      var Msg:PPORT_MESSAGE):NTStatus;
                      stdcall;
Sonra Record tipimizi tanımlıyoruz

Kod: Tümünü seç

  PPORT_MESSAGE = ^_PORT_MESSAGE;
_PORT_MESSAGE = packed record
DataSize,
MessageSize,
MessageType,
VirtualRangesOffset:dword;
ClientId:TClientID;
MessageId,
SectionSize:dword;
Data:array[0..0] of dword;
end;
Sonra çağırma işlemimizi yapıyoruz. Veeeeeeeeeeeeeeeeeeeeeee

Kod: Tümünü seç

var
  DLLHandle    : THandle;
  zZwListenPort: ZwListenPort;
  mStatus   : Cardinal;
  mPortMsg  : _PORT_MESSAGE;
begin
mPortMsg.Data[0]:= sizeOf(PPORT_MESSAGE);
DLLHandle := LoadLibrary('ntdll.dll');
  if DLLHandle <> 0 then
  begin
    try
      @zZwListenPort := GetProcAddress(DLLHandle, 'NtListenPort');

      if @zZwListenPort <> nil then
       mStatus:= zZwListenPort(0, mPortMsg.Data[0]);
    finally
      FreeLibrary(DLLHandle);
    end;
  end;
end;
PATLIYORUZZZZZZZ!!!!. :lol: :lol: :lol: Çalışmıyor yahuuuuuu!! @thelvacı Hocam bir koltuk çık :P
Resim
Cevapla