日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

PEB结构学习

發布時間:2024/6/21 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 PEB结构学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是PEB結構(Process Envirorment Block Structure)

    英文翻譯過來就是進程環境信息塊,這里包含了一寫進程的信息。我接觸到這個東西主要是在研究軟件的保護技術的時候,有種保護技術會檢測是否有調試器正在調試保護軟件,然后需要獲取是否被調試的消息,這個消息存儲在PEB結構中.

二、PEB結構(可以去msdn官網查看原文)

    msdn地址:https://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx

    可以看到PEB的結構如下圖。

typedef struct _PEB {
  BYTE                          Reserved1[2];
  BYTE                          BeingDebugged; //被調試狀態
  BYTE                          Reserved2[1];
  PVOID                         Reserved3[2];
  PPEB_LDR_DATA                 Ldr;
  PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;
  BYTE                          Reserved4[104];
  PVOID                         Reserved5[52];
  PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
  BYTE                          Reserved6[128];
  PVOID                         Reserved7[1];
  ULONG                         SessionId;
} PEB, *PPEB;

  我們看到有很多的保留字,保留字我們不用去管,那個是留給系統處理的。所以一共只有4個關鍵字需要了解。

第一個,BYTE BeingDebugged //,這里就是記錄程序的調試狀態的,(1代表被調試,0代表沒有被調試)

我們可以使用BOOL WINAPI IsDebuggerPresent(void);這個函數來檢測是否有調試器存在,返回非0值代表被調試,如果返回0代表沒有被調試。

我們可以寫一個小程序來實驗一下。

#include <iostream>
#include <vector>
#include <string>
#include <windows.h>

int main(int argc, char *argv[]) {
    bool status;
    status = IsDebuggerPresent();
    if (status) {
        MessageBox(nullptr, "Detecting debugger", "Find Debugger", MB_OK);
    }
    else {
        MessageBox(nullptr, "Not detect debugger", "No Debugger", MB_OK);
    }
    return 0;
}

處于被調試狀態:

      沒有調試的:

76A9A720 64 A1 30 00 00 00    mov         eax,dword ptr fs:[00000030h]  //獲取PEB結構基地址
76A9A726 0F B6 40 02          movzx       eax,byte ptr [eax+2]                       //根據PEB結構,我們知道是取
76A9A72A C3                   ret  

    

我們現在繼續觀察這個程序,調試跟蹤一下。PEB結構在TEB結構的0x30偏移的地方,也就是fs:[0x30]處可以取到PEB的基地址。

觀察匯編代碼,https://en.wikipedia.org/wiki/Win32_Thread_Information_Block, 這里可以看到PEB的偏移地址

76A9A720 64 A1 30 00 00 00    mov         eax,dword ptr fs:[00000030h]  //獲取PEB結構基地址
76A9A726 0F B6 40 02          movzx       eax,byte ptr [eax+2]        //根據PEB結構,我們知道這里是獲取BeingDebugged的值
76A9A72A C3 ret  //程序返回

我們看一下程序調用IsDebuggerPresent()函數的匯編代碼,然后一步步跟蹤,就會發現PEB的地址,觀察它在內存中的數據

然后看程序得到PEB的地址

然后我們觀看一下這個內存中的數據,就可以看到PEB結構的數據了。

可以看到第3個字節,也就是BeingDebug為1,代表被調試,其他的數據也可以分析了,但是這里就分析到這里了,其他的結構有時間會繼續分析的。

最后,我們可以使用內嵌asm語言來獲得PEB結構的值,如下圖,沒有調試,獲得beingdebug的值。

好了,就分析到這里了。

總結

以上是生活随笔為你收集整理的PEB结构学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。