Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Bağlı Liste & Undocumented API Hakkında (+25 .. +100)
#11
(05-10-2017, Saat: 16:34)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlEvet, ismail bey'in de söylediği gibi; içerisinde LIST_ENTRY yapısını barındıran bir çok yapı var. Ve bu yapıları döndüren de bazı undocumented API'ler var. Maksadımız, bu undocumented API'lerden bir tanesini kullanarak, içeriğinde LIST_ENTRY bulunan bir yapı üzerinden liste üzerinde ilerlemek. Biraz daha ipucu, cevabı verecek korkarım  Smile

Hocam savaş bey C'de yazdığını söylüyor.Geriye çevirmesi kalmıştır.
Benim daha hiç deneme fırsatım olmadı.Bir kaç makale okudum.Sanki o hafıza bloklarına undocumented api olmadan da erişmenin yollarını gördüm.Tecrübe ettiğimde geri döneceğim.Beynim çok karışık şimdi. Confused
My name is nobody.
WWW
Cevapla
#12
program Project19;

{$APPTYPE CONSOLE}
{$R *.res}

uses
 Winapi.Windows, System.SysUtils;

Type
 PLinkedList = ^TLinkedList;

 TLinkedList = record
   Prev, Next: PLinkedList;
 end;

 PData = ^TData;

 TData = record
   X: Byte;
   Y: Byte;
   List: LIST_ENTRY;

 end;

 UNICODE_STRING = record

   Length: USHORT;
   MaximumLength: USHORT;
   Buffer: LPWSTR;
 end;

 PLDR_MODULE = ^LDR_MODULE;

 LDR_MODULE = record
   InLoadOrderModuleList: LIST_ENTRY;
   InMemoryOrderModuleList: LIST_ENTRY;
   InInitializationOrderModuleList: LIST_ENTRY;
   BaseAddress: PVOID;
   EntryPoint: PVOID;
   SizeOfImage: ULONG;
   FullDllName: UNICODE_STRING;
   BaseDllName: UNICODE_STRING;
   Flags: ULONG;
   LoadCount: SHORT;
   TlsIndex: SHORT;
   HashTableEntry: LIST_ENTRY;
   TimeDateStamp: ULONG;
 end;

 PPEB_LDR_DATA = ^PEB_LDR_DATA;

 PEB_LDR_DATA = record
   Length: ULONG;
   Initialized: UCHAR;
   SsHandle: PVOID;
   InLoadOrderModuleList: LIST_ENTRY;
   InMemoryOrderModuleList: LIST_ENTRY;
   InInitializationOrderModuleList: LIST_ENTRY;
   EntryInProgress: PVOID;
 end;

function CONTAINING_RECORD(alan, adres, listrecordkonum: Pointer): Pointer;
begin
 Result := Pointer(Integer(alan) - (integer(listrecordkonum) -
   integer(adres)));

end;

function getPEB_LDR_DATA(): PPEB_LDR_DATA;
asm
{$IFDEF WIN32}
    mov eax, [fs:$18]
    add eax,$30
    mov eax,[eax]
    add eax, $c
    mov eax,[eax]
    mov @result,eax

{$ENDIF}
{$IFDEF WIN64}
     xor rax,rax
    mov rax,[gs:48]
    add rax,96
    mov rax,[rax]
    add rax, 24
    mov rax,[rax]
    mov @result,rax
{$ENDIF}


end;

var
 module: PLDR_MODULE;
 ppeb: PPEB_LDR_DATA;

begin

 ppeb := getPEB_LDR_DATA;
 module := CONTAINING_RECORD(ppeb.InLoadOrderModuleList.Flink, 0, 0);
 while (module^.BaseAddress <> nil) do
 begin
   writeln(IntToHex(UInt64(module.BaseAddress)) + ' ' +
     module.BaseDllName.Buffer);
   module := CONTAINING_RECORD(module.InLoadOrderModuleList.Flink, 0, 0);;
 end;

 readln;

end.
Program kendi kullandığı dll'leri listeliyor.Ben yapının adresini assembly ile aldım.

(05-10-2017, Saat: 16:44)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(05-10-2017, Saat: 16:34)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlEvet, ismail bey'in de söylediği gibi; içerisinde LIST_ENTRY yapısını barındıran bir çok yapı var. Ve bu yapıları döndüren de bazı undocumented API'ler var. Maksadımız, bu undocumented API'lerden bir tanesini kullanarak, içeriğinde LIST_ENTRY bulunan bir yapı üzerinden liste üzerinde ilerlemek. Biraz daha ipucu, cevabı verecek korkarım  Smile

Hocam savaş bey C'de yazdığını söylüyor.Geriye çevirmesi kalmıştır.
Benim daha hiç deneme fırsatım olmadı.Bir kaç makale okudum.Sanki o hafıza bloklarına undocumented api olmadan da erişmenin yollarını gördüm.Tecrübe ettiğimde geri döneceğim.Beynim çok karışık şimdi. Confused

Hocam yanılmıyorsam Module32First, Module32Next,ReadProcessMemory fonksiyonlarını kullanarak da yapılıyor;ama farklı yapılarla.Burada paylaştığım yapılardan biri belgelenmemiş (LDR_MODULE) diğeri (PEB_LDR_DATA) ise yarı belgelenmiş.Yada en azından ben bulamadımSmile
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#13
(05-10-2017, Saat: 17:28)savasabd Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
program Project19;

{$APPTYPE CONSOLE}
{$R *.res}

uses
 Winapi.Windows, System.SysUtils;

Type
 PLinkedList = ^TLinkedList;

 TLinkedList = record
   Prev, Next: PLinkedList;
 end;

 PData = ^TData;

 TData = record
   X: Byte;
   Y: Byte;
   List: LIST_ENTRY;

 end;

 UNICODE_STRING = record

   Length: USHORT;
   MaximumLength: USHORT;
   Buffer: LPWSTR;
 end;

 PLDR_MODULE = ^LDR_MODULE;

 LDR_MODULE = record
   InLoadOrderModuleList: LIST_ENTRY;
   InMemoryOrderModuleList: LIST_ENTRY;
   InInitializationOrderModuleList: LIST_ENTRY;
   BaseAddress: PVOID;
   EntryPoint: PVOID;
   SizeOfImage: ULONG;
   FullDllName: UNICODE_STRING;
   BaseDllName: UNICODE_STRING;
   Flags: ULONG;
   LoadCount: SHORT;
   TlsIndex: SHORT;
   HashTableEntry: LIST_ENTRY;
   TimeDateStamp: ULONG;
 end;

 PPEB_LDR_DATA = ^PEB_LDR_DATA;

 PEB_LDR_DATA = record
   Length: ULONG;
   Initialized: UCHAR;
   SsHandle: PVOID;
   InLoadOrderModuleList: LIST_ENTRY;
   InMemoryOrderModuleList: LIST_ENTRY;
   InInitializationOrderModuleList: LIST_ENTRY;
   EntryInProgress: PVOID;
 end;

function CONTAINING_RECORD(alan, adres, listrecordkonum: Pointer): Pointer;
begin
 Result := Pointer(Integer(alan) - (integer(listrecordkonum) -
   integer(adres)));

end;

function getPEB_LDR_DATA(): PPEB_LDR_DATA;
var
 ppeb: PPEB_LDR_DATA;
begin
{$IFDEF WIN32}
 asm
   mov eax, [fs:$18]
   add eax,$30
   mov eax,[eax]
   add eax, $c
   mov eax,[eax]
   mov ppeb, eax

 end;
{$ENDIF}
{$IFDEF WIN64}
 asm
   mov eax, [fs:$30]
   add eax,$60
   mov eax,[eax]
   add eax, $18
   mov eax,[eax]
   mov ppeb, eax
 end;
{$ENDIF}
 Result := ppeb;

end;

var
 module: PLDR_MODULE;
 ppeb: PPEB_LDR_DATA;

begin

 ppeb := getPEB_LDR_DATA;
 module := CONTAINING_RECORD(ppeb.InLoadOrderModuleList.Flink, 0, 0);
 while (module^.BaseAddress <> nil) do
 begin
   writeln(IntTostr(integer(module.BaseAddress)) + ' ' +
     module.BaseDllName.Buffer);
   module := CONTAINING_RECORD(module.InLoadOrderModuleList.Flink, 0, 0);;
 end;

 readln;

end.
Program kendi kullandığı dll'leri listeliyor.Ben yapının adresini assembly ile aldım.

(05-10-2017, Saat: 16:44)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlHocam savaş bey C'de yazdığını söylüyor.Geriye çevirmesi kalmıştır.
Benim daha hiç deneme fırsatım olmadı.Bir kaç makale okudum.Sanki o hafıza bloklarına undocumented api olmadan da erişmenin yollarını gördüm.Tecrübe ettiğimde geri döneceğim.Beynim çok karışık şimdi. Confused

Hocam yanılmıyorsam Module32First, Module32Next,ReadProcessMemory fonksiyonlarını kullanarak da yapılıyor;ama farklı yapılarla.Burada paylaştığım yapılardan biri belgelenmemiş (LDR_MODULE) diğeri (PEB_LDR_DATA) ise yarı belgelenmiş.Yada en azından ben bulamadımSmile

Ellerinize sağlık. Maksadımıza ulaştık diye düşünüyorum. Bu soruda amaç; bağlantılı listelere aşina olunmasına yardımcı olmak, işletim sisteminin generic bağlantılı liste yapısı olan LIST_ENTRY'i tanıtmak, Undocumented API'lere kıyısından köşesinden bulaşılmasına vesile olmak ve record alignment ve offset kavramlarına vurgu yapmaktı.

 LIST_ENTRY yapısı işletim sistemi üzerinde bağlı liste gereken hemen hemen her yerde kullanılıyor. Dolayısı ile en azından göz aşinalığı dahi faydalı olacaktır. Bu konu sayesinde belki pek çok arkadaşımız işletim sisteminin düşük seviye yapı ve metodlarını gözlemleme imkanı bulacaklardır. NtQuerySystemInformation, NtQueryInformationProcess, NtCurrentTeb, NtQueryInformationThread gibi API'ler ile ilgilenecekler ve derinlere doğru bir yolculuk başlayacaktır umut ederim.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#14
Ayrıca not olarak belirtmekte fayda var. Bu tarz yapıları nerede ve nasıl bulacağımız ve ne gibi tool'lara ihtiyacımız olacağı bilgisi Low Level bölümünde mevcut Smile
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#15
(05-10-2017, Saat: 18:32)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlEllerinize sağlık. Maksadımıza ulaştık diye düşünüyorum. Bu soruda amaç; bağlantılı listelere aşina olunmasına yardımcı olmak, işletim sisteminin generic bağlantılı liste yapısı olan LIST_ENTRY'i tanıtmak, Undocumented API'lere kıyısından köşesinden bulaşılmasına vesile olmak ve record alignment ve offset kavramlarına vurgu yapmaktı.

 LIST_ENTRY yapısı işletim sistemi üzerinde bağlı liste gereken hemen hemen her yerde kullanılıyor. Dolayısı ile en azından göz aşinalığı dahi faydalı olacaktır. Bu konu sayesinde belki pek çok arkadaşımız işletim sisteminin düşük seviye yapı ve metodlarını gözlemleme imkanı bulacaklardır. NtQuerySystemInformation, NtQueryInformationProcess, NtCurrentTeb, NtQueryInformationThread gibi API'ler ile ilgilenecekler ve derinlere doğru bir yolculuk başlayacaktır umut ederim.

Hocam,ben teşekkür ederim.Düşük seviye programlamayı çok severim ama Undocumented API'lerle daha önce tanışma fırsatım olmamıştı.Araştırırken bu konu haricinde de çok enteresan Undocumented API'lerle karşılaştım.Bir kısmını forumda paylaşacağım.Vesile olduğunuz için tekrar çok teşekkür ederim.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#16
Aşama 3:

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol fonksiyonu üzerinden, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'e ordan Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'ya ve içersindeki LIST_ENTRY çift yönlü bağlı liste tipindeki InMemoryOrderModuleList alanına eriştim.
InMemoryOrderModuleList bağlı liste için diyor ki; Process'in yüklenen modüllerini içeren bağlı listedir.Liste içindeki her bir eleman (FLink, BLink) LDR_DATA_TABLE_ENTRY tipinde bir yapıya işaret eder.
Alıntı:The head of a doubly-linked list that contains the loaded modules for the process. Each item in the list is a pointer to an LDR_DATA_TABLE_ENTRY structure. For more information, see Remarks.
Yukarıdaki dokümanlarda bulunan yapılar Winternl.h içerisinde görülebilir.Önce C ile yazdım ve denedim.
#include <stdio.h>
#include <Windows.h>
#include <winnt.h>
#include <Winternl.h>

int main()
{
   PTEB teb = NtCurrentTeb();
   PLIST_ENTRY root = &teb->ProcessEnvironmentBlock->Ldr->InMemoryOrderModuleList;

   PLIST_ENTRY current;

   current = root->Flink;
   while (current->Flink != root)
   {
     LDR_DATA_TABLE_ENTRY entry = *(PLDR_DATA_TABLE_ENTRY)current;
     wprintf(entry.FullDllName.Buffer);
     wprintf(L"\n");
     current = current->Flink;
   }


   PLIST_ENTRY last = root->Blink;
   current = last;
   while (current->Blink != current)
   {
      LDR_DATA_TABLE_ENTRY entry = *(PLDR_DATA_TABLE_ENTRY)current;
      wprintf(entry.FullDllName.Buffer);
      wprintf(L"\n");
     current = current->Blink;
   }
}
Sonra Winternl.h içersindeki yapıları inceleyerek ihtiyaç duyulanları delphi'ye çevirdim.Eksikler ve yanlışlar olabilir.
unit Unit3;

interface

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

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

 UNICODE_STRING = record
   Length: USHORT;
   MaximumLength: USHORT;
   Buffer: LPWSTR;
 end;

 PRTL_USER_PROCESS_PARAMETERS = ^RTL_USER_PROCESS_PARAMETERS;

 RTL_USER_PROCESS_PARAMETERS = record
   Reserved1: array [1 .. 16] of BYTE;
   Reserved2: array [1 .. 10] of Pointer;
   ImagePathName: UNICODE_STRING;
   CommandLine: UNICODE_STRING;
 end;

 PPEB_LDR_DATA = ^PEB_LDR_DATA;

 PEB_LDR_DATA = record
   Reserved1: array [1 .. 8] of BYTE;
   Reserved2: array [1 .. 3] of Pointer;
   InMemoryOrderModuleList: LIST_ENTRY;
 end;

 PPEB = ^PEB;

 PEB = record
   Reserved1: array [1 .. 2] of BYTE;
   BeingDebugged: BYTE;
   Reserved2: array [1 .. 1] of BYTE;
   Reserved3: array [1 .. 2] of Pointer;
   Ldr: PPEB_LDR_DATA;
   ProcessParameters: PRTL_USER_PROCESS_PARAMETERS;
   Reserved4: array [1 .. 3] of Pointer;
   AtlThunkSListPtr: Pointer;
   Reserved5: Pointer;
   Reserved6: ULONG;
   Reserved7: Pointer;
   Reserved8: ULONG;
   AtlThunkSListPtr32: ULONG;
   Reserved9: array [1 .. 45] of Pointer;
   Reserved10: array [1 .. 96] of BYTE;
   PostProcessInitRoutine: Pointer;
   Reserved11: array [1 .. 128] of BYTE;
   Reserved12: array [1 .. 1] of Pointer;
   SessionId: ULONG;
 end;

 PTEB = ^TEB;

 TEB = record
   Reserved1: array [1 .. 12] of Pointer;
   ProcessEnvironmentBlock: PPEB;
   Reserved2: array [1 .. 399] of BYTE;
   Reserved3: array [1 .. 1952] of BYTE;
   TlsSlots: array [1 .. 64] of Pointer;
   Reserved4: array [1 .. 8] of BYTE;
   Reserved5: array [1 .. 26] of Pointer;
   ReservedForOle: Pointer; // Windows 2000 only
   Reserved6: array [1 .. 4] of Pointer;
   TlsExpansionSlots: Pointer;
 end;

 PLDR_DATA_TABLE_ENTRY = ^LDR_DATA_TABLE_ENTRY;

 LDR_DATA_TABLE_ENTRY = record
   Reserved1: array [1 .. 2] of Pointer;
   InMemoryOrderLinks: LIST_ENTRY;
   Reserved2: array [1 .. 2] of Pointer;
   DllBase: Pointer;
   Reserved3: array [1 .. 2] of Pointer;
   FullDllName: UNICODE_STRING;
   Reserved4: array [1 .. 8] of BYTE;
   Reserved5: array [1 .. 3] of Pointer;
   TimeDateStamp: ULONG;
 end;

const
 ntdll = 'ntdll.dll';

var
 Form3: TForm3;

function NtCurrentTeb(): PTEB; stdcall; external ntdll;

implementation

{$R *.dfm}

procedure L(msg: string);
begin
 Form3.Memo1.Lines.Add(msg);
end;

procedure TForm3.Button1Click(Sender: TObject);
var
 ATeb: TEB;
 Root, Current, Last: PListEntry;
 Entry: LDR_DATA_TABLE_ENTRY;
begin
 ATeb := NtCurrentTeb()^;
 Root := @ATeb.ProcessEnvironmentBlock^.Ldr^.InMemoryOrderModuleList;

 L('İleriye doğru gezinme');
 Current := Root.Flink;
 while (Current.Flink <> Root) do
 begin
   Entry := PLDR_DATA_TABLE_ENTRY(Current)^;
   L(string(Entry.FullDllName.Buffer));
   Current := Current^.Flink;
 end;


 L('Geriye doğru gezme');
 Last := Root.Blink;
 Current := Last;
 while (Current.Blink <> Last) do
 begin
   Entry := PLDR_DATA_TABLE_ENTRY(Current)^;
   L(string(Entry.FullDllName.Buffer));
   Current := Current^.Blink;
 end;

end;

end.
Bu arada neden undocumented(belgelenmemiş, belgesiz) api denmiş acaba anlamış değilim. Huh
My name is nobody.
WWW
Cevapla
#17
(06-10-2017, Saat: 00:56)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlAşama 3:

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol fonksiyonu üzerinden, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'e ordan Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'ya ve içersindeki LIST_ENTRY çift yönlü bağlı liste tipindeki InMemoryOrderModuleList alanına eriştim.
InMemoryOrderModuleList bağlı liste için diyor ki; Process'in yüklenen modüllerini içeren bağlı listedir.Liste içindeki her bir eleman (FLink, BLink) LDR_DATA_TABLE_ENTRY tipinde bir yapıya işaret eder.
Alıntı:The head of a doubly-linked list that contains the loaded modules for the process. Each item in the list is a pointer to an LDR_DATA_TABLE_ENTRY structure. For more information, see Remarks.
Yukarıdaki dokümanlarda bulunan yapılar Winternl.h içerisinde görülebilir.Önce C ile yazdım ve denedim.
#include <stdio.h>
#include <Windows.h>
#include <winnt.h>
#include <Winternl.h>

int main()
{
   PTEB teb = NtCurrentTeb();
   PLIST_ENTRY root = &teb->ProcessEnvironmentBlock->Ldr->InMemoryOrderModuleList;

   PLIST_ENTRY current;

   current = root->Flink;
   while (current->Flink != root)
   {
     LDR_DATA_TABLE_ENTRY entry = *(PLDR_DATA_TABLE_ENTRY)current;
     wprintf(entry.FullDllName.Buffer);
     wprintf(L"\n");
     current = current->Flink;
   }


   PLIST_ENTRY last = root->Blink;
   current = last;
   while (current->Blink != current)
   {
      LDR_DATA_TABLE_ENTRY entry = *(PLDR_DATA_TABLE_ENTRY)current;
      wprintf(entry.FullDllName.Buffer);
      wprintf(L"\n");
     current = current->Blink;
   }
}
Sonra Winternl.h içersindeki yapıları inceleyerek ihtiyaç duyulanları delphi'ye çevirdim.Eksikler ve yanlışlar olabilir.
unit Unit3;

interface

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

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

 UNICODE_STRING = record
   Length: USHORT;
   MaximumLength: USHORT;
   Buffer: LPWSTR;
 end;

 PRTL_USER_PROCESS_PARAMETERS = ^RTL_USER_PROCESS_PARAMETERS;

 RTL_USER_PROCESS_PARAMETERS = record
   Reserved1: array [1 .. 16] of BYTE;
   Reserved2: array [1 .. 10] of Pointer;
   ImagePathName: UNICODE_STRING;
   CommandLine: UNICODE_STRING;
 end;

 PPEB_LDR_DATA = ^PEB_LDR_DATA;

 PEB_LDR_DATA = record
   Reserved1: array [1 .. 8] of BYTE;
   Reserved2: array [1 .. 3] of Pointer;
   InMemoryOrderModuleList: LIST_ENTRY;
 end;

 PPEB = ^PEB;

 PEB = record
   Reserved1: array [1 .. 2] of BYTE;
   BeingDebugged: BYTE;
   Reserved2: array [1 .. 1] of BYTE;
   Reserved3: array [1 .. 2] of Pointer;
   Ldr: PPEB_LDR_DATA;
   ProcessParameters: PRTL_USER_PROCESS_PARAMETERS;
   Reserved4: array [1 .. 3] of Pointer;
   AtlThunkSListPtr: Pointer;
   Reserved5: Pointer;
   Reserved6: ULONG;
   Reserved7: Pointer;
   Reserved8: ULONG;
   AtlThunkSListPtr32: ULONG;
   Reserved9: array [1 .. 45] of Pointer;
   Reserved10: array [1 .. 96] of BYTE;
   PostProcessInitRoutine: Pointer;
   Reserved11: array [1 .. 128] of BYTE;
   Reserved12: array [1 .. 1] of Pointer;
   SessionId: ULONG;
 end;

 PTEB = ^TEB;

 TEB = record
   Reserved1: array [1 .. 12] of Pointer;
   ProcessEnvironmentBlock: PPEB;
   Reserved2: array [1 .. 399] of BYTE;
   Reserved3: array [1 .. 1952] of BYTE;
   TlsSlots: array [1 .. 64] of Pointer;
   Reserved4: array [1 .. 8] of BYTE;
   Reserved5: array [1 .. 26] of Pointer;
   ReservedForOle: Pointer; // Windows 2000 only
   Reserved6: array [1 .. 4] of Pointer;
   TlsExpansionSlots: Pointer;
 end;

 PLDR_DATA_TABLE_ENTRY = ^LDR_DATA_TABLE_ENTRY;

 LDR_DATA_TABLE_ENTRY = record
   Reserved1: array [1 .. 2] of Pointer;
   InMemoryOrderLinks: LIST_ENTRY;
   Reserved2: array [1 .. 2] of Pointer;
   DllBase: Pointer;
   Reserved3: array [1 .. 2] of Pointer;
   FullDllName: UNICODE_STRING;
   Reserved4: array [1 .. 8] of BYTE;
   Reserved5: array [1 .. 3] of Pointer;
   TimeDateStamp: ULONG;
 end;

const
 ntdll = 'ntdll.dll';

var
 Form3: TForm3;

function NtCurrentTeb(): PTEB; stdcall; external ntdll;

implementation

{$R *.dfm}

procedure L(msg: string);
begin
 Form3.Memo1.Lines.Add(msg);
end;

procedure TForm3.Button1Click(Sender: TObject);
var
 ATeb: TEB;
 Root, Current, Last: PListEntry;
 Entry: LDR_DATA_TABLE_ENTRY;
begin
 ATeb := NtCurrentTeb()^;
 Root := @ATeb.ProcessEnvironmentBlock^.Ldr^.InMemoryOrderModuleList;

 L('İleriye doğru gezinme');
 Current := Root.Flink;
 while (Current.Flink <> Root) do
 begin
   Entry := PLDR_DATA_TABLE_ENTRY(Current)^;
   L(string(Entry.FullDllName.Buffer));
   Current := Current^.Flink;
 end;


 L('Geriye doğru gezme');
 Last := Root.Blink;
 Current := Last;
 while (Current.Blink <> Last) do
 begin
   Entry := PLDR_DATA_TABLE_ENTRY(Current)^;
   L(string(Entry.FullDllName.Buffer));
   Current := Current^.Blink;
 end;

end;

end.
Bu arada neden undocumented(belgelenmemiş, belgesiz) api denmiş acaba anlamış değilim. Huh

Ellerine sağlık güzel kardeşim. Aslında neden undocumented dedikleri çok açık. Çünkü bu metodlar ve yapılar açıkça deklere edilmemiştir. Hatta kernel içindeki pek çok şey ancak uzun reverse işlemleri neticesinde açığa çıkartılmış ve paylaşılmıştır. Elbette Windows 2000'in kaynak kodlarının çalınmasından sonra Microsoft bir kısım dökümante edilmemiş API'yi dökümante etmiştir. Ama hâla çok büyük bir kısım bilgi dökümante edilmiş durumda değildir.

Örneğin PEB için Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol bir arama yapabilir ya da ReactOS kaynak kodlarının içine bakabilirsin.

typedef struct _PEB {
  BOOLEAN                 InheritedAddressSpace;
 BOOLEAN                 ReadImageFileExecOptions;
 BOOLEAN                 BeingDebugged;
 BOOLEAN                 Spare;
 HANDLE                  Mutant;
 PVOID                   ImageBaseAddress;
 PPEB_LDR_DATA           LoaderData;
 PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
 PVOID                   SubSystemData;
 PVOID                   ProcessHeap;
 PVOID                   FastPebLock;
 PPEBLOCKROUTINE         FastPebLockRoutine;
 PPEBLOCKROUTINE         FastPebUnlockRoutine;
 ULONG                   EnvironmentUpdateCount;
 PPVOID                  KernelCallbackTable;
 PVOID                   EventLogSection;
 PVOID                   EventLog;
 PPEB_FREE_BLOCK         FreeList;
 ULONG                   TlsExpansionCounter;
 PVOID                   TlsBitmap;
 ULONG                   TlsBitmapBits[0x2];
 PVOID                   ReadOnlySharedMemoryBase;
 PVOID                   ReadOnlySharedMemoryHeap;
 PPVOID                  ReadOnlyStaticServerData;
 PVOID                   AnsiCodePageData;
 PVOID                   OemCodePageData;
 PVOID                   UnicodeCaseTableData;
 ULONG                   NumberOfProcessors;
 ULONG                   NtGlobalFlag;
 BYTE                    Spare2[0x4];
 LARGE_INTEGER           CriticalSectionTimeout;
 ULONG                   HeapSegmentReserve;
 ULONG                   HeapSegmentCommit;
 ULONG                   HeapDeCommitTotalFreeThreshold;
 ULONG                   HeapDeCommitFreeBlockThreshold;
 ULONG                   NumberOfHeaps;
 ULONG                   MaximumNumberOfHeaps;
 PPVOID                  *ProcessHeaps;
 PVOID                   GdiSharedHandleTable;
 PVOID                   ProcessStarterHelper;
 PVOID                   GdiDCAttributeList;
 PVOID                   LoaderLock;
 ULONG                   OSMajorVersion;
 ULONG                   OSMinorVersion;
 ULONG                   OSBuildNumber;
 ULONG                   OSPlatformId;
 ULONG                   ImageSubSystem;
 ULONG                   ImageSubSystemMajorVersion;
 ULONG                   ImageSubSystemMinorVersion;
 ULONG                   GdiHandleBuffer[0x22];
 ULONG                   PostProcessInitRoutine;
 ULONG                   TlsExpansionBitmap;
 BYTE                    TlsExpansionBitmapBits[0x80];
 ULONG                   SessionId;

} PEB, *PPEB;
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#18
Küçük bir hatırlatma yapayım. Benzer bir şekilde, process'lerin listesinin tutulduğu LIST_ENTRY yapısına erişip, BLink ve FLink üzerinde modifikasyon yapılarak, sistemde çalışan herhangi bir process'in gizlendiğini; rootkitlerin bu yöntemi sıklıkla kullandığını da belirtmek isterim. Yani burada öğrendiklerinizin ne zaman nerede işe yarayacağını bilemezsiniz Smile
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#19
Doğru hocam, Windows çekirdeği ile uyumlu ReactOS'un kaynak kodlarındaki yapıya bakmak aklıma gelmedi.
O zaman, yarın rootkit yazmaya başlıyorum hemen...
My name is nobody.
WWW
Cevapla
#20
(06-10-2017, Saat: 10:03)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlDoğru hocam, Windows çekirdeği ile uyumlu ReactOS'un kaynak kodlarındaki yapıya bakmak aklıma gelmedi.
O zaman, yarın rootkit yazmaya başlıyorum hemen...

Anti-RootKit demek istediniz herhalde.  Sad

Hack, crack, warez ve benzeri sistem kaynaklarına müdahale eden her tür yazılıma/teşviğe karşıyız.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Pointer Dereferencing Hakkında. ismailkocacan 7 576 24-09-2017, Saat: 15:10
Son Yorum: uparlayan
  RTTI PE Hakkında ismailkocacan 5 564 23-09-2017, Saat: 00:24
Son Yorum: ismailkocacan



Konuyu Okuyanlar: 1 Ziyaretçi