《原創》 通過PEB獲得程序路徑 附完整工程

2022-08-02 03:42:12 字數 1824 閱讀 8015

完整工程:

peb(process environment block,程序環境塊)存放程序資訊,每個程序都有自己的peb資訊。位於使用者位址空間。

peb位址可以通過函式psgetprocesspeb(eprocess)來獲得,也可以通過eprocess基位址加偏移0x1b0(x86)來獲得。

peb結構

typedef 

struct _peb peb, *ppeb;

peb偏移0x10處還有個指標processparameters,指向乙個程序引數塊ppb、即rtl_user_process_parameters資料結構。

這ppb也是在使用者空間的,雖然是個獨立存在的資料結構,邏輯上卻可以看作是peb的一部分。

程序引數塊rtl_user_process_parameters結構

typedef struct

_rtl_user_process_parameters

rtl_user_process_parameters, *prtl_user_process_parameters;

下面以x86為例,在windbg中可以具體實驗感受一下:

1.先隨便找個程序

2.注意peb是在使用者空間,從他的位址也可以看出來,因為7ffdf000<80000000,

所以在檢視peb時要先使用命令 .process 899ac958 切入我們我們所找的sogouexe.exe程序的位址空間中,這個很重要

然後我們檢視程序sogouexe.exe的peb

3.在偏移0x10處看到了結構體rtl_user_process_parameters,從圖中可以看出,它位於位址0x20000處

4,在偏移0x38處就存放著程序完整路徑。ok,成功找到,這樣就可以進入具體的**實現了

1 boolean getprocesspathbyeprocess(peprocess eprocess,wchar*wzprocesspath)

212 peb =psgetprocesspeb(eprocess);

13if (peb==null)

1417

18 kestackattachprocess(eprocess, &apcstate); //

切入程序位址空間,很重要

1920

21 processparameters = *(ulong_ptr*)((ulong_ptr)peb+processparametersofpeb);

2223 memcpy(wzprocesspath,((punicode_string)((ulong_ptr)processparameters+imagepathnameofprocessparameters))->buffer,

24 ((punicode_string)((ulong_ptr)processparameters+imagepathnameofprocessparameters))->length);

2526

2728 keunstackdetachprocess(&apcstate); //切出程序,很重要

2930

3132

return

true;

33 }

(原創)通過域策略分發檔案

今天有人在qq上提問,怎麼通過域控給客戶機安裝字型 思路很簡單,首先該操作可用通過登陸指令碼實現將字型拷貝至字型目錄。其次,可以寫乙個指令碼判斷一下該字型是否存在於字型目錄如果存在就拷貝。具體實現如下 echo offif exist windir fonts msyhmono.ttf exit e...

通過PEB的Ldr列舉程序內所有已載入的模組

一 幾個重要的資料結構,可以通過windbg的dt命令檢視其詳細資訊 peb peb ldr data ldr data table entry 二 技術原理 1 通過fs 30h 獲取當前程序的 peb結構 2 通過 peb的ldr成員獲取 peb ldr data結構 3 通過 peb ldr ...

根據程序號獲取程序路徑函式(原創)

這個問題在論壇上被很多人問過,我這裡寫個函式,公開源 對應csdn論壇帖子為 源 private declare function openprocess lib kernel32.dll byval dwdesiredaccess as long,byval binherithandle as l...