
@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ü.
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.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.
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.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
Arkadaşlar konudan uzaklaşmayalımG.Arkas yazdı: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.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.@thelvacı hocam bu challengelar sonunda hepimiz Trojancı olacaz haberin ola
![]()
Şurada bir kaynak var
http://www.grahamwideman.com/gw/tech/De ... rtTest.htm
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.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ıcakhem şu C dili nasıl delphi ye çevriliyomuş öğrenirim belki
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: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ımen 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';
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.
Tamam, söylemeyeceğim zaten, sadece ufak tefek ipuçları vereceğimG.Arkas yazdı:@thelvacı hocam sakın cevabı söyleme Allah aşkına çalışıyorum üzerinde
Ben NativeApi.pas kullandım.thelvaci yazdı:Tamam, söylemeyeceğim zaten, sadece ufak tefek ipuçları vereceğimG.Arkas yazdı:@thelvacı hocam sakın cevabı söyleme Allah aşkına çalışıyorum üzerinde
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;
Kod: Tümünü seç
STATUS_SUCCESS = NTStatus($00000000);
STATUS_ACCESS_DENIED = NTStatus($C0000022);
STATUS_INFO_LENGTH_MISMATCH = NTStatus($C0000004);
SEVERITY_ERROR = NTStatus($C0000000);
Kod: Tümünü seç
ZwListenPort = Function (PortHandle:THandle;
var Msg:PPORT_MESSAGE):NTStatus;
stdcall;
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;
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;