<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    基于PMI實現對讀寫行為檢測

    VSole2022-10-09 17:42:14

    這幾天分析某驅動樣本發現幾種檢測讀寫的方法,就有意思的一種和大家分享。

    PMI

    使用CPU提供的性能監視(PM)功能,對內存讀寫時的關鍵掛靠函數(KeStackAttachProcess, KeAttachProcess)實現了一種類似hook的技術。

    通過監視調用情況,來判斷進程內存是否被讀取。關于處理器的性能監視功能,不同的處理器架構都有差異,可以參考白皮書,或者這個翻譯的帖子:https://www.codenong.com/cs106475009/

    大致原理:

    設置ICACHE_MISS類型的監視事件開啟性能監視功能。當L1指令高速緩存未命中次數達到溢出值時,觸發PM中斷,執行樣本注冊的PMI回調函數。

    在回調函數中判斷中斷的位置是否處于監視函數代碼的序言部分(這樣才能獲取到正確的調用參數),如果處于那么通過調用參數判斷掛靠的目標進程是否為被保護的進程,進而記錄下調用信息。不處于則使用clflush或clflushopt指令使監視函數代碼從緩存中失效,以提高下次被中斷到的概率。

    下面是詳細的流程:

    判斷處理器對性能監視功能的支持性

    通過cpuid的0號功能來判斷處理器是不是intel(看代碼樣本尚未支持amd)。

    Cupid的a號功能判斷處理器是否支持版本2以上的性能監視功能。

    單個核心是否支持4個以上的計數器。

    是否支持clflush指令,并且處理器是否支持ICACHE_MISS類型的監視事件。

    獲取監視函數(KeStackAttachProcess, KeAttachProcess)

    解析nt模塊的導出表得到兩個監視函數地址,并解析異常表得到兩個監視函數的序言部分的大小(SizeOfProlog),應該是為了兼容不同系統的做法。

    配置并開啟性能監視

    1、注冊PMI回調函數

    獲取nt模塊導出的HalDispatchTable地址,這是hal提供的一張函數地址表。

    調用其中的hal!HalpSetSystemInformation并指定HalProfileSourceInterruptHandler來注冊自己的PMI回調函數。

    其中的foo就是注冊的回調函數地址。

    樣本使用Windows提供的接口來注冊回調函數,當然也可以通過配置IA32_X2APIC_LVT_PMI寄存器來指定PMI發生時的中斷向量號。

    Windows系統中配置的向量號是0xfe。

    中斷歷程實際是_KINTERRUPT.ServiceRoutine字段指向的函數:hal!HalpPerfInterrupt

    而這個函數很簡單就是逐個調用hal!HalpPerfInterruptHandler中注冊的PMI回調函數。

    所以hal!HalpSetSystemInformation的作用很簡單就是指定的foo參數設置到HalpPerfInterruptHandler中。

    2、開啟每個處理器核心中的計數器

    開啟參數中CounterMode_0指明計數器的類型(固定用途、通用),當然樣本只用到了通用的性能監視計數器。

    CtrxIndex_4是每個處理器核心中開啟的計數器的索引。

    EVESEL_8是選擇的性能監視事件,也就是在一開始提到的ICACHE_MISS類型。

    CtrCount_C是計數值,這個參數直接決定了PMI發生的頻率,計數值越低,頻率越高,當然中斷到監視函數的概率也越高。

    開啟前保證計數器處于停止狀態。

    重置指定計數器的計數值。

    選擇監視事件。

    開啟性能監視。

    回調函數處理

    樣本注冊的回調函數為PMICallBackMode0_140058d40,唯一的參數是_KTRAP_FRAME,記錄了發生中斷的寄存器環境。

    通過_KTRAP_FRAME,可以拿到發生中斷的地址,用來判斷是否命中監視函數的序言部分。

    如果命中,進而判斷是否掛靠指定進程。

    如果未命中,將定時使用clflush或clflushopt指令讓監視函數代碼從緩存中失效。

    最后,不管是否命中,都需要清除溢出標志,重置計數器以允許下一次PMI處理程序調用。

    總結

    我將樣本實現PMI的關鍵代碼拷貝出來編譯后在虛擬機中運行,并測試XT掃描進程鉤子時讀寫內存的情況,確實可以命中!

    (測試時保證處理器支持PM并且虛擬機處理器開啟虛擬化CPU性能計數器)。

    這種中斷實現的監視調用的方法應用場景有限,即使使用clflsuh指令提高了對監視函數的命中概率,實際測試效果也一般,考慮運行效率的情況下不能將計數值設置的足夠小,就不能保證每次調用監視函數時都能命中。

    但在游戲安全方面,用來監視高頻率的讀寫行為確實很有效果,并且其不依賴系統函數的隱蔽性和中斷的隨機性意味著更難被作弊者發現。

    回調函數
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    x32TLS回調函數實驗
    2023-05-31 09:34:55
    TLS回調函數介紹TLS回調函數是在程序運行時由操作系統自動調用的一組函數,用于在進程加載和卸載時執行一些初始化和清理操作。在TLS回調函數中,可以訪問當前線程的TLS數據,并對其進行修改或檢查。值得一提的是TLS回調可以用來反調試,原理實為在實際的入口點代碼執行之前執行檢測調試器代碼。為了棧平衡,我們要把傳進這個回調函數的參數所占用的
    動態函數PHP中支持一個功能叫 variable function ,變量函數的意思。//最終是system;當一個變量后邊帶括號,那他就被視作一個函數。編譯器會解析出變量的值,然后會去找當前是否存在名為“system()”的函數并執行它。這里就不給實例了,很多免殺案例中都用到了這個特性。也是被瘋狂查殺的特征。回調函數回調函數,簡單來說就是一個函數不是由我直接調用,而是通過另一個函數去調用它。
    結果分析Hook前Hook后,我們的彈窗本該是hello的但是hook后,程序流程被我們修改了。760D34B2 55 push ebp760D34B3 8BEC mov ebp,esp通過這兩條指令,函數就可以在堆棧中為局部變量分配存儲空間,并在函數執行過程中保存和恢復現場。這樣做的好處是可以避免局部變量和其他函數之間的沖突,同時也可以提高函數的可讀性和可維護性。
    Dobby一共兩個功能,其一是inlinehook,其二是指令插樁,兩者原理差不多,主要介紹指令插樁。所謂指令插樁,就是在任意一條指令,進行插樁,執行到這條指令的時候,會去執行我們定義的回調函數
    在Windows大部分應用都是基于消息機制,他們都擁有一個消息過程函數,根據不同消息完成不同功能,windows通過鉤子機制來截獲和監視系統中的這些消息。一般鉤子分局部鉤子與全局鉤子,局部鉤子一般用于某個線程,而全局鉤子一般通過dll文件實現相應的鉤子函數
    全局鉤子注入在Windows大部分應用都是基于消息機制,他們都擁有一個消息過程函數,根據不同消息完成不同功能,windows通過鉤子機制來截獲和監視系統中的這些消息。一般鉤子分局部鉤子與全局鉤子,局部鉤子一般用于某個線程,而全局鉤子一般通過dll文件實現相應的鉤子函數
    相關例子如下,編譯的時候需要在Debug模式:#define _CRTDBG_MAP_ALLOC. main.cpp : {163} normal block at 0x000002882AE17740, 12 bytes long.Data: < M > 07 00 00 00 4D 00 00 00 09 03 00 00. main.cpp : {162} normal block at 0x000002882AE148C0, 4 bytes long.內存的申請在C++編程語言中,內存申請對應的關鍵字是new或malloc,其實new最后調用的也是malloc函數,對應源代碼文件是debug_heap.cpp。在包含相關頭文件之后,malloc函數的調用棧為:malloc -> _malloc_dbg -> heap_alloc_dbg -> heap_alloc_dbg_internal。_CrtMemBlockHeader* _block_header_prev; // 雙向鏈表,訪問該雙向鏈表的全局變量為__acrt_first_block. size_t _data_size; // malloc分配的大
    當L1指令高速緩存未命中次數達到溢出值時,觸發PM中斷,執行樣本注冊的PMI回調函數。是否支持clflush指令,并且處理器是否支持ICACHE_MISS類型的監視事件。
    Win32k組件最初的設計和編寫是完全建立的用戶層上的,但是微軟在 Windows NT 4.0 的改變中將 Win32k.sys 作為改變的一部分而引入,用以提升圖形繪制性能并減少 Windows 應用程序的內存需求。窗口管理器(User)和圖形設備接口(GDI)在極大程度上被移出客戶端/服務端運行時子系統(CSRSS)并被落實在它自身的一個內核模塊中。
    電子郵件安全和威脅檢測服務提供商Vade公司近日發布了一份報告,詳細闡述了最近發現的一起網絡釣魚攻擊,這起攻擊成功欺騙了Microsoft 365身份驗證系統。由于Microsoft 365在商業界得到廣泛采用,被泄露的賬戶很有可能屬于企業用戶。此外據報告顯示,Vade的研究人員還發現了一種涉及使用被欺騙的Adobe版本的網絡釣魚攻擊。小心那些聲稱你的Microsoft 365賬戶存在風險或要求緊急驗證個人信息的電子郵件。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类