Challenge 4

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

Ne hatası alıyorsun, GetLastError ne diyor ?
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

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 :)

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.
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 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.
Resim
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ı: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 :)

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.
@esistem NtRequestPort değil NTConnectPort'u çağırıp connection sağlamak gerekiyor.

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;
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 »

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.
LPC_API.RAR
Client Server LPC API Test
(109.22 KiB) 107 kere indirildi
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

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 ;)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

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:

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;

Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Challenge 4

Mesaj gönderen sadettinpolat »

bu challenge ' a benim de soyle bi katkim olsun :)

Resim
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Challenge 4

Mesaj gönderen SimaWB »

:N)
There's no place like 127.0.0.1
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

Geçin bakalım makaranızı, bitiremedik diye :D
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

İş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.
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'ta beklemesi gerektiği gibi bekler vaziyette kalıyor ama client app NtConnectPort'da hata alıyordu son durum olarak. Neyse yakında hallederiz ;)
Hocamm sende mi cevabı bilmiyon yoksa :lol: Nasıl bir challenge oldu bu yaaa. :D

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.
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.Arkas yazdı:
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 ;)
Hocamm sende mi cevabı bilmiyon yoksa :lol: Nasıl bir challenge oldu bu yaaa. :D

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.
Ben bu API'leri kullandığımda 64 bit yoktu ;) Neyse hallederiz yarın inşallah.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

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 :P
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

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.
Cevapla