Challenge 4
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Challenge 4
Tekrar selam,
hemen hemen hiçbir fikrim olmadan @G.Arkas ve sizin verdiğiniz kodlar üzerinden bişiler yapmaya çalıştım fakat ne yaptığımıda bilmiyorum
aşağıda yazdığım kodlar var, sanırım hiçbi işe yaramıcaktır
hemen hemen hiçbir fikrim olmadan @G.Arkas ve sizin verdiğiniz kodlar üzerinden bişiler yapmaya çalıştım fakat ne yaptığımıda bilmiyorum
aşağıda yazdığım kodlar var, sanırım hiçbi işe yaramıcaktır
Kod: Tümünü seç
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
PUNICODE_STRING = ^UNICODE_STRING;
UNICODE_STRING = record
Length: SHORT;
MaximumLength: SHORT;
Buffer: LPWSTR;
end;
PPORT_MESSAGE = ^_PORT_MESSAGE;
_PORT_MESSAGE = packed record
DataSize,
MessageSize,
MessageType,
VirtualRangesOffset:dword;
ClientId:integer;//TClientID
MessageId,
SectionSize:dword;
Data: array[0..0] of cardinal;
end;
POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
OBJECT_ATTRIBUTES = record
Length: ULONG;
RootDirectory: THandle;
ObjectName: PChar;
Attributes: ULONG;
SecurityDescriptor: POINTER; // Points to type SECURITY_DESCRIPTOR PVOID
SecurityQualityOfService: POINTER; // Points to type SECURITY_QUALITY_OF_SERVICE PVOID
end;
TNtCreatePort = function(
PortHandle : PHANDLE;
ObjectAttributes : POBJECT_ATTRIBUTES;
MaxDataSize : ULONG;
MaxMessageSize : ULONG;
Reserved : ULONG
): ULONG; stdcall;
TNtListenPort = Function (PortHandle:THandle;
Msg:PPORT_MESSAGE):ULONG; stdcall;
TNtRequestPort = Function (PortHandle:THandle;
Msg:PPORT_MESSAGE):ULONG; stdcall;
TNtReplyPort = Function (PortHandle:THandle;
Msg:PPORT_MESSAGE):ULONG; stdcall;
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
stats : cardinal;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
DLLHandle : THandle;
nNtCreatePort: TNtCreatePort;
Attibutes : UNICODE_STRING;
mSize : OBJECT_ATTRIBUTES;
xReserved : DWORD;
begin
Attibutes.MaximumLength := SizeOf(UNICODE_STRING);
mSize.Length := SizeOf(OBJECT_ATTRIBUTES);
DLLHandle := LoadLibrary('ntdll.dll');
if DLLHandle <> 0 then
begin
try
@nNtCreatePort := GetProcAddress(DLLHandle, 'NtCreatePort');
if @nNtCreatePort <> nil then
stats := nNtCreatePort(0,mSize.SecurityDescriptor, mSize.Length, Attibutes.MaximumLength, xReserved);
finally
ListBox1.Items.Add('Port Açık:'+inttostr(stats));
FreeLibrary(DLLHandle);
end;
end; // if DLLHandle <> 0 then
end;
procedure TForm1.Button2Click(Sender: TObject);
var
DLLHandle : THandle;
nNtListenPort: TNtListenPort;
mStatus : cardinal;
mPortMsg : pPORT_MESSAGE;
begin
DLLHandle := LoadLibrary('ntdll.dll');
if DLLHandle <> 0 then
begin
try
@nNtListenPort := GetProcAddress(DLLHandle, 'NtListenPort');
if @nNtListenPort <> nil then
mStatus:= nNtListenPort(0, mPortMsg);
finally
ListBox1.Items.Add('Port Dinle:'+inttostr(mStatus)+' - '+inttostr(mPortMsg.data[0]));
FreeLibrary(DLLHandle);
end;
end; // if DLLHandle <> 0 then
end;
procedure TForm1.Button3Click(Sender: TObject);
var
DLLHandle : THandle;
nNtRequestPort: TNtRequestPort;
mStatus : cardinal;
mPortMsg : pPORT_MESSAGE;
begin
DLLHandle := LoadLibrary('ntdll.dll');
if DLLHandle <> 0 then
begin
try
@nNtRequestPort := GetProcAddress(DLLHandle, 'NtRequestPort');
if @nNtRequestPort <> nil then
mStatus:= nNtRequestPort(0,....); //buraya ne yazıcam hiçbir fikrim yok :)
finally
ListBox1.Items.Add('Port Send:'+ inttostr(mPortMsg.DataSize));
FreeLibrary(DLLHandle);
end;
end; // if DLLHandle <> 0 then
end;
end.
Re: Challenge 4
@thelvaci 64 bit sebebiyle sıkıntı yaşadım.
If you are running 32-bit applications using LPC functions under 64-bit Windows, you will encounter various bad functionalty. As it turned out, the layer between 32-bit Ntdll.dll and 64-bit Ntdll.dll does not translate the layout of PORT_MESSAGE structure. As consequence, kernel API can't recognize format of the PORT_MESSAGE structure and usually returns STATUS_INVALID_PARAMETER (0xC000000D). For 64-bit systems, always use 64-bit build of the example.
Re: Challenge 4
@esistem NtRequestPort değil NTConnectPort'u çağırıp connection sağlamak gerekiyor.esistem yazdı:Tekrar selam,
hemen hemen hiçbir fikrim olmadan @G.Arkas ve sizin verdiğiniz kodlar üzerinden bişiler yapmaya çalıştım fakat ne yaptığımıda bilmiyorum
aşağıda yazdığım kodlar var, sanırım hiçbi işe yaramıcaktırKod: Tümünü seç
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type PUNICODE_STRING = ^UNICODE_STRING; UNICODE_STRING = record Length: SHORT; MaximumLength: SHORT; Buffer: LPWSTR; end; PPORT_MESSAGE = ^_PORT_MESSAGE; _PORT_MESSAGE = packed record DataSize, MessageSize, MessageType, VirtualRangesOffset:dword; ClientId:integer;//TClientID MessageId, SectionSize:dword; Data: array[0..0] of cardinal; end; POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES; OBJECT_ATTRIBUTES = record Length: ULONG; RootDirectory: THandle; ObjectName: PChar; Attributes: ULONG; SecurityDescriptor: POINTER; // Points to type SECURITY_DESCRIPTOR PVOID SecurityQualityOfService: POINTER; // Points to type SECURITY_QUALITY_OF_SERVICE PVOID end; TNtCreatePort = function( PortHandle : PHANDLE; ObjectAttributes : POBJECT_ATTRIBUTES; MaxDataSize : ULONG; MaxMessageSize : ULONG; Reserved : ULONG ): ULONG; stdcall; TNtListenPort = Function (PortHandle:THandle; Msg:PPORT_MESSAGE):ULONG; stdcall; TNtRequestPort = Function (PortHandle:THandle; Msg:PPORT_MESSAGE):ULONG; stdcall; TNtReplyPort = Function (PortHandle:THandle; Msg:PPORT_MESSAGE):ULONG; stdcall; TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; stats : cardinal; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var DLLHandle : THandle; nNtCreatePort: TNtCreatePort; Attibutes : UNICODE_STRING; mSize : OBJECT_ATTRIBUTES; xReserved : DWORD; begin Attibutes.MaximumLength := SizeOf(UNICODE_STRING); mSize.Length := SizeOf(OBJECT_ATTRIBUTES); DLLHandle := LoadLibrary('ntdll.dll'); if DLLHandle <> 0 then begin try @nNtCreatePort := GetProcAddress(DLLHandle, 'NtCreatePort'); if @nNtCreatePort <> nil then stats := nNtCreatePort(0,mSize.SecurityDescriptor, mSize.Length, Attibutes.MaximumLength, xReserved); finally ListBox1.Items.Add('Port Açık:'+inttostr(stats)); FreeLibrary(DLLHandle); end; end; // if DLLHandle <> 0 then end; procedure TForm1.Button2Click(Sender: TObject); var DLLHandle : THandle; nNtListenPort: TNtListenPort; mStatus : cardinal; mPortMsg : pPORT_MESSAGE; begin DLLHandle := LoadLibrary('ntdll.dll'); if DLLHandle <> 0 then begin try @nNtListenPort := GetProcAddress(DLLHandle, 'NtListenPort'); if @nNtListenPort <> nil then mStatus:= nNtListenPort(0, mPortMsg); finally ListBox1.Items.Add('Port Dinle:'+inttostr(mStatus)+' - '+inttostr(mPortMsg.data[0])); FreeLibrary(DLLHandle); end; end; // if DLLHandle <> 0 then end; procedure TForm1.Button3Click(Sender: TObject); var DLLHandle : THandle; nNtRequestPort: TNtRequestPort; mStatus : cardinal; mPortMsg : pPORT_MESSAGE; begin DLLHandle := LoadLibrary('ntdll.dll'); if DLLHandle <> 0 then begin try @nNtRequestPort := GetProcAddress(DLLHandle, 'NtRequestPort'); if @nNtRequestPort <> nil then mStatus:= nNtRequestPort(0,....); //buraya ne yazıcam hiçbir fikrim yok :) finally ListBox1.Items.Add('Port Send:'+ inttostr(mPortMsg.DataSize)); FreeLibrary(DLLHandle); end; end; // if DLLHandle <> 0 then end; end.
Kod: Tümünü seç
ZwConnectPort = Function (PortHandle:PDWORD;
PortName:PUnicodeString;
SecurityQos:PSECURITY_QUALITY_OF_SERVICE;
WriteSection:PPORT_SECTION_WRITE;
ReadSection:PPORT_SECTION_READ;
MaxMessageSize:PULONG;
ConnectData :pointer;
ConnectDataLength :PULONG):NTStatus;
stdcall;
Re: Challenge 4
Arkadaşlar eskiden yaptığım örnekleri aradım ama bulamadım; bu nedenle küçük bir uygulama yazdım hızlıca; şimdilik thread falan yok içinde. Dediğim gibi hızlıca yazdım, indirmeniz için atayım buraya; bir bakın bakalım sıkıntı var mı ? Onun üzerinden de ilerleyebilirsiniz eğer isterseniz.
Vakit bulabildiğim an bende devam edeceğim projeye.
Vakit bulabildiğim an bende devam edeceğim projeye.
Re: Challenge 4
Bu arada belirteyim henüz client tarafını kodlamak için zamanım olmadı, server tarafı da sadece fikir verecek türden. Şimdilik kilitli olarak bekliyor hali ile ana thread'de olduğu için Ama oluşturduğu LPC portunu Process Explorer'dan gözlemleyebilirsiniz.
Ayrıca Memo'da "NtCreatePort status" için 0 değerini görmeniz lazım, aksi bir değer görüyorsanız eğer o sayısal değeri hex'e çevirip Google amca da aratabilir ve NTSTATUS'ün ne olduğunu gözlemleyebilirsiniz
Ayrıca Memo'da "NtCreatePort status" için 0 değerini görmeniz lazım, aksi bir değer görüyorsanız eğer o sayısal değeri hex'e çevirip Google amca da aratabilir ve NTSTATUS'ün ne olduğunu gözlemleyebilirsiniz
Re: Challenge 4
Process Hacker'ın kaynak kodlarından gördüğüm kadarı ile 64 bit işletim sisteminde 64 bitlik PORT_MESSAGE yapısının kullanılması gerekiyormuş.
Aşağıda bu tanımlar mevcut:
Aşağıda bu tanımlar mevcut:
Kod: Tümünü seç
typedef struct _PORT_MESSAGE
{
union
{
struct
{
CSHORT DataLength;
CSHORT TotalLength;
} s1;
ULONG Length;
} u1;
union
{
struct
{
CSHORT Type;
CSHORT DataInfoOffset;
} s2;
ULONG ZeroInit;
} u2;
union
{
CLIENT_ID ClientId;
double DoNotUseThisField;
};
ULONG MessageId;
union
{
SIZE_T ClientViewSize; // only valid for LPC_CONNECTION_REQUEST messages
ULONG CallbackId; // only valid for LPC_REQUEST messages
};
} PORT_MESSAGE, *PPORT_MESSAGE;
// WOW64 definitions
// Except in a small number of special cases, WOW64 programs using the LPC APIs must use the 64-bit versions of the
// PORT_MESSAGE, PORT_VIEW and REMOTE_PORT_VIEW data structures. Note that we take a different approach than the
// official NT headers, which produce 64-bit versions in a 32-bit environment when USE_LPC6432 is defined.
typedef struct _PORT_MESSAGE64
{
union
{
struct
{
CSHORT DataLength;
CSHORT TotalLength;
} s1;
ULONG Length;
} u1;
union
{
struct
{
CSHORT Type;
CSHORT DataInfoOffset;
} s2;
ULONG ZeroInit;
} u2;
union
{
CLIENT_ID64 ClientId;
double DoNotUseThisField;
};
ULONG MessageId;
union
{
ULONGLONG ClientViewSize; // only valid for LPC_CONNECTION_REQUEST messages
ULONG CallbackId; // only valid for LPC_REQUEST messages
};
} PORT_MESSAGE64, *PPORT_MESSAGE64;
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Re: Challenge 4
bu challenge ' a benim de soyle bi katkim olsun
Re: Challenge 4
There's no place like 127.0.0.1
Re: Challenge 4
İşyerinde kısa bir vakit daha bulup; C++ 'daki örneği derleyip 32 bit bir işletim sistemi üzerinde test ettim ve çalıştığını gördüm. Benzer kodu Delphi'ye çevirdim; server NtListenPort'ta beklemesi gerektiği gibi bekler vaziyette kalıyor ama client app NtConnectPort'da hata alıyordu son durum olarak. Neyse yakında hallederiz
Ayrıca; şu an kullanmayacak olsanız da bilginin ne zaman ve nerede işe yarayacağı belli olmaz öyle değil mi Ben fii tarihinde kullanıyordum ama arşivlerde kimbilir nerede. Neyse benim için de iyi bir hatırlatıcı olacak, adam akıllı fırsat bulup bakabildiğimde.
Bu arada arkadaşlarım da yorulup bunalmadılarsa bakmaya devam etsinler. Zaten challange'lerin mantığı bir şeyler öğretmek değil mi; herhalde tamamen boş bir challange olmamıştır, bir şeyler katmıştır diye ümit ediyorum.
Ayrıca; şu an kullanmayacak olsanız da bilginin ne zaman ve nerede işe yarayacağı belli olmaz öyle değil mi Ben fii tarihinde kullanıyordum ama arşivlerde kimbilir nerede. Neyse benim için de iyi bir hatırlatıcı olacak, adam akıllı fırsat bulup bakabildiğimde.
Bu arada arkadaşlarım da yorulup bunalmadılarsa bakmaya devam etsinler. Zaten challange'lerin mantığı bir şeyler öğretmek değil mi; herhalde tamamen boş bir challange olmamıştır, bir şeyler katmıştır diye ümit ediyorum.
Re: Challenge 4
Hocamm sende mi cevabı bilmiyon yoksa Nasıl bir challenge oldu bu yaaa.NtListenPort'ta beklemesi gerektiği gibi bekler vaziyette kalıyor ama client app NtConnectPort'da hata alıyordu son durum olarak. Neyse yakında hallederiz
Ben en son connection oluşturmaya çalışıyordum ama başaramadım. Bugün çok yoğundum walla bakamadım çok fazla inşallah bakarım yarın.
Re: Challenge 4
Ben bu API'leri kullandığımda 64 bit yoktu Neyse hallederiz yarın inşallah.G.Arkas yazdı:Hocamm sende mi cevabı bilmiyon yoksa Nasıl bir challenge oldu bu yaaa.NtListenPort'ta beklemesi gerektiği gibi bekler vaziyette kalıyor ama client app NtConnectPort'da hata alıyordu son durum olarak. Neyse yakında hallederiz
Ben en son connection oluşturmaya çalışıyordum ama başaramadım. Bugün çok yoğundum walla bakamadım çok fazla inşallah bakarım yarın.
Re: Challenge 4
Tuğrul hocam sende yapamadıysan artık ben nasıl yaparım diye düşünüyorum yani ben daha pointer in ne işe yaradığını bilmiyorum uğraştığım şey kernel, ring0, root vs.vs.
neyse bu kadar şaka yeter, bu gün kodu yayınlarım burda dermişim
neyse bu kadar şaka yeter, bu gün kodu yayınlarım burda dermişim
Re: Challenge 4
Hatamı buldum ve düzelttim, kodun şeklini şemalini biraz düzelteyim; birazdan atacağım en son projeyi. Şimdilik uygulamayı 32 bitte test etmelisiniz, 64 bit için gereken değişiklikleri de yapmaya çalışacağım.