freeBuf
主站

分類

漏洞 工具 極客 Web安全 系統安全 網絡安全 無線安全 設備/客戶端安全 數據安全 安全管理 企業安全 工控安全

特色

頭條 人物志 活動 視頻 觀點 招聘 報告 資訊 區塊鏈安全 標準與合規 容器安全 公開課

官方公眾號企業安全新浪微博

FreeBuf.COM網絡安全行業門戶,每日發布專業的安全資訊、技術剖析。

FreeBuf+小程序

FreeBuf+小程序

    如何使用其他API混淆特定的Windows API
    2021-03-29 19:10:52

    HW期間,為防范釣魚,即日起FreeBuf將取消投稿文章的一切外部鏈接。給您帶來的不便,敬請諒解~

    關于CallObfuscator

    CallObfuscator是一款功能強大的API混淆工具,在該工具的幫助下,廣大研究人員可以從靜態/動態分析工具中混淆或隱藏PE導入,并使用其他不同的API來混淆特定的Windows API。

    比如說,我們假設代碼中使用了VirtualProtect,而我想要用Sleep來對其進行混淆處理,那么此時CallObfuscator將會修改IAT,然后讓指向VirtualProtect的代碼塊改為指向Sleep。當我們執行該文件時,Windows加載器將會加載Sleep,而不會加載VirtualProtect,并將執行流轉移到入口點,此時執行流將會被重定向至工具之前存儲的shellcode,并尋找到VirtualProtect的真實地址,然后用這個地址替換加載器之前分配的Sleep的地址。

    CallObfuscator獲取

    廣大研究人員可以使用下列命令將該項目源碼克隆至本地:

    git clone https://github.com/d35ha/CallObfuscator.git

    工具使用

    我們可以直接將CallObfuscator以代碼庫的形式使用,請查看下列代碼段,或者直接點擊查看項目中的cli.cpp文件:

    #include <cobf.hpp>
    
    ?
    
    int main() {
    
    cobf obf_file = cobf("sample.exe");
    
    obf_file.load_pe();
    
    obf_file.obf_sym("kernel32.dll", "SetLastError", "Beep");
    
    obf_file.obf_sym("kernel32.dll", "GetLastError", "GetACP");
    
    obf_file.generate("sample_obfuscated.exe");
    
    obf_file.unload_pe();
    
    return 0;
    
    };

    除此之外,CallObfuscator也能夠以命令行工具的形式使用,我們只需要提供輸入PE路徑、輸出PE路徑和配置文件路徑即可。默認配置文件為config.ini:

    cobf.exe <input file> <out file> [config file]

    配置文件中包含了混淆處理所需的內容(dll和符號等)。下面給出的是配置文件的內容模板:

    ; Template for the config file:
    
    ; * Sections can be written as:
    
    ; [dll_name]
    
    ; old_sym=new_sym
    
    ; * The dll name is case insensitive, but
    
    ; the old and the new symbols are not.
    
    ; * You can use the wildcard on both the
    
    ; dll name and the old symbol.
    
    ; * You can use '#' at the start of
    
    ; the old or the new symbol to flag
    
    ; an ordinal.
    
    ; * The new symbol should be exported
    
    ; by the dll so the windows loader can resolve it.
    
    ; For example:
    
    ; * Obfuscating all of the symbols
    
    ; imported from user*32.dll with ordinal 1600.
    
    [user*32.dll]
    
    *=#1600
    
    ; * Obfuscating symbols imported from both
    
    ; kernel32.dll and kernelbase.dll with Sleep.
    
    [kernel*.dll]
    
    *=Sleep
    
    ; * Obfuscating fprintf with exit.
    
    [*]
    
    fprintf=exit

    工具使用樣例

    首先,我們需要構建下列樣本代碼:

    #include <windows.h>
    
    #include <stdio.h>
    
    ?
    
    int main() {
    
    SetLastError(5);
    
    printf("Last error is %d\n", GetLastError());
    
    return 0;
    
    };

    構建完成之后,kernel32導入將如下圖所示:

    接下來,我們分別使用Beep和GetACP來混淆SetLastError和GetLastError(實際上,任何來自于kernel32的API都支持混淆,即使它們沒有被導入)。

    使用的配置信息如下:

    [kernel32.dll]
    
    SetLastError=Beep
    
    GetLastError=GetACP

    下面是混淆后的輸出結果:

    我們看看kernel32導入結果:

    我們可以看到,其中已經不存在SetLastError或GetLastError了。

    但是,我們的程序和文件仍然可以正常運行:

    混淆處理效果

    IDA HexRays反編譯器:

    IDA調試器:

    Ghidra:

    ApiMonitor:

    這是因為所有靜態分析工具都依賴于在IAT中編寫的API名稱,該名稱可以如圖所示進行操作。

    對于ApiMonitor,由于使用IAT掛鉤,同樣的問題也存在。

    另一方面,對于x64dbg這樣的工具,顯示的API名稱將只取決于實際調用的內容(而不是IAT中編寫的內容)。

    注意事項

    從內存中轉儲模糊處理后的PE不會使其失效,因為被修改的IAT是相同的。

    此工具的主要目的是搞亂研究人員的分析過程(使其變慢)。

    可以將任何導入的符號(按名稱或序號)與另一個符號(名稱或序號)混淆。

    Shellcode會以第一個tls回調執行,并在執行入口點之前處理其他tls回調所需的模糊符號。

    Shellcode將作為C代碼執行,便于進行編譯。

    混淆的符號名稱是通過哈希而不是直接通過名稱來解析的。

    該工具將禁用重定位并剝離任何調試符號。

    該工具創建一個名為.cobf的新rwx字段,用于保存Shellcode和其他所需的數據。

    它可以在同一個模糊處理的PE上使用多次。

    工具僅在Windows 10 x64上進行過測試。

    項目地址

    CallObfuscator:見github。

    本文作者:, 轉載請注明來自FreeBuf.COM

    被以下專輯收錄,發現更多精彩內容
    + 收入我的專輯
    評論 按熱度排序

    登錄/注冊后在FreeBuf發布內容哦

    相關推薦
    • 0 文章數
    • 0 評論數
    • 0 關注者
    文章目錄
    登錄 / 注冊后在FreeBuf發布內容哦
    收入專輯
    四月天小说网