青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

無我

讓內心永遠燃燒著偉大的光明的精神之火!
靈活的思考,嚴謹的實現
豪邁的氣魄、頑強的意志和周全的思考

【轉】pe/elf 文件加殼時的處理

本文轉自http://huaidan.org/pstzine/0x02/html/PSTZine_0x02_0x0A.html

 ==Ph4nt0m Security Team==

                       Issue 0x02, Phile #0x0A of 0x0A


|=---------------------------------------------------------------------------=|
|=----------------------=[  pe/elf 文件加殼時的處理  ]=----------------------=|
|=---------------------------------------------------------------------------=|
|=---------------------------------------------------------------------------=|
|=--------------------------=[      By dummy     ]=--------------------------=|
|=-----------------------=[  <dummy_at_ph4nt0m.org>  ]=----------------------=|
|=---------------------------------------------------------------------------=|

               
前言:

    最初的殼是在感染型的病毒技術上發展出來的,加殼目的一般是壓縮或加密。本文主要
就x86平臺下win32 pe和linux elf 加殼程序的實現做簡單介紹和總結,以自己以前寫相關
程序做線索敘述,其中程序源碼是開源的,有興趣的朋友可以繼續進行改進。

    ps: 其中有些地方很久沒碰,可能有地方描述有誤,還請見諒:)

正文:

    -------------------------------------------------------
    slm        x86 win32 r3 pe packer
    mimisys    x86 win32 r0 pe packer
    elfp       x86 linux r3 elf packer
    -------------------------------------------------------

一、一個殼的組成

    一個完整的殼程序主要由 2 個部分組成 packer 和 loader。它們具體的作用分別是:

    (1) packer
       
    負責將待加殼程序壓縮和加密處理、把loader寫到待加殼程序上。以slm的pakcer
    為例具體操作包括,pe有效性判斷、優化可壓縮數據、壓縮和加密、添加loader、存放
    加殼參數和待加殼程序原數據(oep等等)、改寫入口點等等。

    (2) loader
       
    主要工作是解壓或解密被加殼的程序,以slm的loader為例具體的操作包括:獲取自
    身位置、獲取加殼參數、進行解壓或解密、填充導入表、重定位、tls 初始化等等。

二、slm (x86 win32 r3 pe packer)

資料:
    http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx

工具:
    lordpe    pe 文件格式查看編輯工具
    dumpbin    vc 自帶coff文件格式查看工具
    ollydbg    r3 調試工具

源碼結構:
    ./slm/cm 公共頭文件和模塊
    ./slm/pk    packer 實現
    ./slm/sc    loader 實現

    在做這個時候對 pe 也是剛剛了解,所以 slm 很多地方現在看來有些問題:)。在第一
節已經簡單描述 slm 的工作流程,下面主要就我當初做的時候遇到的問題做一些描述:

    (1) 資源的處理
       
    slm 的資源處理做的比較煩瑣,當初目的是為了把可壓縮資源數據歸并到一起,進
    行一次壓縮,不可壓縮單獨存放。下面簡單介紹一下資源的目錄數據格式,詳細還是看
    看微軟的文檔和相關源碼:)
       
        從IMAGE_NT_HEADERS.IMAGE_DATA_DIRECTORY[IMAGE_DIRECTORY_ENTRY_RESOURCE]
    取出資源數據的地址res_rva,經過轉換后第一個結構體是IMAGE_RESOURCE_DIRECTORY

        IMAGE_RESOURCE_DIRECTORY:

            NumberOfIdEntries       目錄下 id 名稱入口項個數
            NumberOfNamedEntries    目錄下 name 名稱入口項個數

        緊跟著IMAGE_RESOURCE_DIRECTORY后面是IMAGE_RESOURCE_DIRECTORY_ENTRY結構
    數組,這個數組的元素個數是 NumberOfIdEntries + NumberOfNamedEntries。

        IMAGE_RESOURCE_DIRECTORY_ENTRY:

            Id                  目錄id,只有NameIsString非真才有效
            NameIsString        目錄名稱是否是字符串,如果為真NameOffset有效
            NameOffset          目錄名稱串的偏移, 偏移是相對與res_rva*的。
            DataIsDirectory     如果為真 OffsetToData 有效,否則OffsetToDirectory
                                有效
            OffsetToData        指向資源數據,偏移類型rva
            OffsetToDirectory   指向子目錄,偏移類型rva

        如果目錄入口名稱是字符串,通過NameOffset獲取PIMAGE_RESOURCE_DIR_STRING_U
    的結構指針,目錄名是unicode格式,并且不是以零結尾的字符串。如果目錄名不是字符
    串而是id, 那么其值在winnt.h 定義。常見id有RT_ICON、RT_VERSION等等。

        結構大致簡單描述完了,有點要注意OffsetToDirectory、OffsetToData修改時要
    進行 DWORD 對齊,否則會出現奇怪的現象。

    (2) 導入表處理

        從IMAGE_NT_HEADERS.IMAGE_DATA_DIRECTORY[IMAGE_DIRECTORY_ENTRY_IMPORT]
    取出導入表的地址imp_rva,經過轉換后第一個結構體是IMAGE_IMPORT_DESCRIPTOR。
       
    IMAGE_IMPORT_DESCRIPTOR:

            Name               指向導入 dll 的名稱,偏移類型 rva
            FirstThunk         指向 IMAGE_THUNK_DATA 結構體,偏移類型 rva
            OriginalFirstThunk 指向FirstThunk 的副本, 可以為空。偏移類型 rva
       
        導入由IMAGE_IMPORT_DESCRIPTOR結構數組組成,數組長度由一個Name域為空的結
    構表明。
       
        FirstThunk和OriginalFirstThunk都是指向以IMAGE_THUNK_DATA數組組成的數據
    結構,系統的加載器在進行導入表填充時,會把FirstThunk指向的結構修改掉。

    (3) TLS 處理

        這里說的tls是所謂的靜態tls(在pe文件結構上進行實現),關于什么是tls可以看看
    《windows 核心編程》線程那章。
       
        1、tls 是怎樣的

        比如要在vc中聲明一個tls變量需要這樣__declspec(thread) int x = 0;在鏈接
    時這個變量會被鏈接器放入.tls的節中。這個節從外邊看和其他的節沒有什么不同,唯
    一的區別在IMAGE_DATA_DIRECTORY[IMAGE_DIRECTORY_ENTRY_TLS]指向的一個結構會對
    此節進行描述,這個結構是IMAGE_TLS_DIRECTORY。

        IMAGE_TLS_DIRECTORY:

            StartAddressOfRawData   tls數據開始地址類型va
            EndAddressOfRawData     tls數據結束地址類型va
            AddressOfIndex;         tls slot的地址,默認tls slot為0

            AddressOfCallBacks      指向一個PIMAGE_TLS_CALLBACK的數組,這個數組
                                    以0結尾,每個PIMAGE_TLS_CALLBACK都是va類型
           
            SizeOfZeroFill          數據區需要進行清 0 數據的大小
            Characteristics
       
        2、系統加載器怎樣處理exe的tls

            系統加載器在完成重定位和輸入表填充后,就開始處理tls。如果存在tls_dir,
    求出tls數據的大小EndAddressOfRawData - StartAddressOfRawData +
    SizeOfZeroFill, 按照大小分配一塊內存,地址存入(PDWORD)fs:[0x2c] +
    tls_slot, 接著拷貝StartAddressOfRawData -> EndAddressOfRawData之間的數
    據到新分配的內存中,然后使用SizeOfZeroFill 清零剩下的數據,然后進行循環回
    調AddressOfCallBacks中的函數,PIMAGE_TLS_CALLBACK函數和DllMain原型很像,
    只是沒有返回值。

        3、系統加載器怎樣處理dll的tls

            首先明確dll是可以使用tls的,唯一的不同是AddressOfCallBacks調用方式會
    有些區別。如果目標dll是被靜聽鏈接到其他文件上,在進程創建完成時即被加載,
    那么他的tls callback會觸發,而LoadLibrary方式加載不會觸發。

    (4) rva & raw 轉換

        pe 文件中許多結構域的指針類型是rva, rva是pe文件由系統加載后,方法相關數
    據的相對偏移量。而我們進行加殼處理時,是直接map的文件數據訪問都是使用文件指
    針,這就需要rva進行轉換。(每次做pe相關工具時,我都會習慣寫一個這樣的函數,現在
    不下10中版本,竟然沒有一個可以保證是正確的 - -)

        下面這個是最新的rva2raw版本,不保證正確性。

三、mimisys (x86 win32 r0 pe packer)

資料:
    Windows Research Kernel
        wrk/base/ntos/mm/sysload.c:MmLoadSystemImage
工具:
    syser     內核調試器,你也可以選擇其他的r0調試器
    vmware    如果不想頻繁重啟,需要一個虛擬機

    文件格式的一些處理參考slm, 這里主要就r0 pe和r3 pe區別做介紹:

    (1) 節和頁

        r0空間的內存常常很緊張,就導致sys section屬性有幾個特殊地方

        1、可換出和禁止換出
           
        在內存不足時,系統內存管理器,會枚舉已加載的section object, 如果存在
    pageout屬性,那么系統內存管理器就會換出這個節對應的頁(這個節經過系統頁對
    齊后換出內存)節對齊原則VirtualAddress向上、VirtualSize向下。禁止換出如
    名字所名這個節將永駐內存。

        2、節對齊小于一頁
           
        大多數sys的節對齊指數都是小于一頁,系統加載器在處理這類文件時相當很
    簡單。加載后文件和磁盤上的文件布局基本一致。當節對齊小于一頁時,
    SizeOfRawData必須大于等于VirtualSize,即不支持未初始化節。mimisys通過增
    加SizeOfImage在文件加載后分配一個未初始化的緩沖區,保證解壓過程。

    (2) checksum校驗

        一句話: 只有正確的checksum sys文件才允許被加載。

    (3) win2k相關問題

        win2k的系統加載器和其他nt系統有幾處不同,r3和r0都會有一些區別,比如r3 pe
    的必須要有導入表,否則拒絕加載,r0 pe必須要有重定位信息,否則也會拒絕加載。這
    種情況需要構造一個空的重定位目錄即可。

        mimisys采取的是合并節,導致加殼后只剩下兩個節,第一個節是loader, 存放
    loader和各種加殼參數,第二個節是原程序優化壓縮后的數據(移動重定位,移動資源等
    等)。兩個節的屬性都是不允許換出的。

四、elfp (x86 linux r3 elf packer)

資料:
    Tool Interface Standard (TIS) Executable and Linking Format
        http://www.x86.org/ftp/manuals/tools/elf.pdf
    毛德操 《漫談內核兼容》8,9 ELF映像的裝入
        http://linux.insigma.com.cn/jszl.asp?docid=132762762
        http://linux.insigma.com.cn/jszl.asp?docid=133617926
    linux 內核源碼
        linux/fs/binfmt_elf.c:load_elf_binary

工具:
    objdump    進行elf文件格式的結構查看
               http://www.gnu.org/software/binutils/binutils.html
               
    ald        匯編級調試器,gdb無法調試沒有調試信息文件的。
               http://ald.sourceforge.net/
   
    elfp是在magiclinux完成的linux elf文件壓縮殼。

    elf的格式是linux下主要的可執行文件格式,它也是在coff上基礎上設計的,所以它和
pe文件的格式很相似,下面的敘述過程中會和 pe 文件以對比形式進行描述。

    elf文件的第一個數據結構是以Elf32_Ehdr開始

    typedef struct
    {
      unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */
      Elf32_Half    e_type;                 /* Object file type */
      Elf32_Half    e_machine;              /* Architecture */
      Elf32_Word    e_version;              /* Object file version */
      Elf32_Addr    e_entry;                /* Entry point virtual address */
      Elf32_Off     e_phoff;                /* Program header table file offset */
      Elf32_Off     e_shoff;                /* Section header table file offset */
      Elf32_Word    e_flags;                /* Processor-specific flags */
      Elf32_Half    e_ehsize;               /* ELF header size in bytes */
      Elf32_Half    e_phentsize;            /* Program header table entry size */
      Elf32_Half    e_phnum;                /* Program header table entry count */
      Elf32_Half    e_shentsize;            /* Section header table entry size */
      Elf32_Half    e_shnum;                /* Section header table entry count */
      Elf32_Half    e_shstrndx;             /* Section header string table index */
    } Elf32_Ehdr;

    e_ident        在 elf.h 中對應的 ELFMAG 宏,長度是四個字節
    e_entry        入口點映像偏移(映像偏移即 pe 中所說的 rva)
    e_phoff        Elf32_Phdr 數組的文件偏移
    e_shoff        Elf32_Shdr 數組的文件偏移
    e_ehsize       Elf32_Ehdr 結構的大小
    e_phentsize    Elf32_Phdr 結構大小
    e_phnum        Elf32_Phdr 數組成員個數
    e_shentsize    Elf32_Shdr 結構大小
    e_shnum        Elf32_Shdr 數組成員個數
   
    在Elf32_Ehdr之后即Elf32_Phdr數組,Elf32_Phdr的地址通過Elf32_Ehdr.e_ehsize來
確定。Elf32_Ehdr數組(或叫段表),你可以把phdr看做pe的節表。

    typedef struct
    {
      Elf32_Word    p_type;            /* Segment type */
      Elf32_Off     p_offset;        /* Segment file offset */
      Elf32_Addr    p_vaddr;        /* Segment virtual address */
      Elf32_Addr    p_paddr;        /* Segment physical address */
      Elf32_Word    p_filesz;        /* Segment size in file */
      Elf32_Word    p_memsz;        /* Segment size in memory */
      Elf32_Word    p_flags;        /* Segment flags */
      Elf32_Word    p_align;        /* Segment alignment */
    } Elf32_Phdr;
   
    p_type    描述這個段的加載行為屬性
    p_offset  段數據在文件中偏移,類似pe節中的PointerToRawData
    p_vaddr   段數據加載后在映像中偏移, 類似pe節中的VirtualAddress
    p_filesz  段數據在文件中大小,類型pe節中的SizeOfRawData
    p_memsz   段數據加載后在映像中大小,類型pe節中的VirtualSize
    p_flags   描述這個段的內存屬性,類似pe節中的節屬性
    p_align   段對齊粒度

    p_type主要的類型有

        PT_LOAD      這個段需要裝載到內存中
        PT_PHDR      這個段存放的是Elf32_Phdr數組
        PT_INTERP    這個段存放一個解釋器名,請求系統加載器把映像裝載需求轉給這
             個解釋器,關于elf的解釋器問題,可以理解為windows下ntdll裝載
     pe文件,elf文件的解釋器主要負責重定位、導入表填充等操作

    p_flags 主要類型有

        PF_X         這個段可執行
        PF_W         這個段可寫
        PF_R         這個段可讀

    在Elf32_Ehdr(段表)之后便是Elf32_Shdr數組(節表),你可能到這里很奇怪了,怎么這
個叫節表?如果你熟悉pe應該知道節表對pe文件的重要性,但這個可不是pe中的那個節表,你
應該把它看做nt header中data_dir[]結構,加載器或調試器等工具會通過節名確定節具體
用途,比如存儲調試信息、版本信息、字符串表等等、elfp在加殼過程會丟棄節表。

    下面簡單講講elfp的loader處理過程(加殼過程很簡單),在一個elf文件被加載后,它的
入口點在執行之前,堆棧中會由系統加載器push的一些參數。

    //  堆棧結構:
    //  +-------------------+
    //  |   return address  |        返回地址
    //  +-------------------+
    //  |   argc            |        參數個數
    //  +-------------------+
    //  |   argv[?], NULL   |        參數表,以 NULL 結尾
    //  +-------------------+
    //  |   envp[?], NULL   |        環境表,以 NULL 結尾
    //  +-------------------+
    //  |   auxv[?]         |        中文不知道叫什么它,這個主要是給解釋器使用,
    //  +-------------------+        存放這個elf的相關信息如果被加殼程序需要解
                                     釋器,你需要重寫正確填寫這個參數,讓解釋器可
     以正確的找到相關數據的地址。
                                    
    elfp殼loader的執行流程大致如下:

        申請內存-->把每個段解壓到指定的地址上-->獲取被加殼程序原始信息-->檢查原
    始段表、重寫 auxv-->加載解釋器-->調用解釋器

    關于 elf 的解釋器,可以參考資料鏈接上的文字,那里比我描述的完整。

五、附錄

[1] 本文代碼
    ./pstzine_0A_01.zip

-EOF-

posted on 2012-06-27 17:21 Tim 閱讀(1826) 評論(0)  編輯 收藏 引用 所屬分類: 逆向工程

<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

導航

統計

公告

本博客原創文章,歡迎轉載和交流。不過請注明以下信息:
作者:TimWu
郵箱:timfly@yeah.net
來源:m.shnenglu.com/Tim
感謝您對我的支持!

留言簿(9)

隨筆分類(173)

IT

Life

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费永久网站黄欧美| 欧美一区二区在线视频| 一区二区国产精品| 久久久亚洲人| 国内精品久久久久久久影视蜜臀 | 国产一区视频在线观看免费| 亚洲视频在线观看视频| 亚洲国产高潮在线观看| 欧美一区二区视频在线| 国产欧美一区二区三区在线看蜜臀 | 欧美激情精品久久久久久| 国产一区二区中文字幕免费看| 亚洲欧美日韩国产精品| 在线亚洲一区二区| 国产精品一区二区你懂的| 欧美一区=区| 欧美制服第一页| 亚洲成人原创| 亚洲国产精品传媒在线观看| 欧美精品粉嫩高潮一区二区 | 久久蜜桃av一区精品变态类天堂| 欧美一区二区三区精品| 在线看不卡av| 亚洲激情网站| 国产精品乱子久久久久| 国产精品成人v| 欧美日韩a区| 99精品国产热久久91蜜凸| 亚洲精品在线观看视频| 欧美三级第一页| 欧美一区在线看| 久久国产精品色婷婷| 亚洲第一区在线观看| 亚洲美女毛片| 国产在线欧美| 亚洲欧洲偷拍精品| 国产精品午夜在线| 女女同性女同一区二区三区91| 蜜桃av噜噜一区| 一区二区三区欧美在线| 欧美一区二区三区婷婷月色 | 亚洲人午夜精品| 国产精品久久久| 亚洲午夜精品网| 99精品欧美一区二区三区综合在线 | 久久国产精品一区二区三区四区| 亚洲高清网站| 在线综合亚洲| 亚洲国产欧美一区| 亚洲一区二区三区免费视频| 亚洲电影免费观看高清完整版 | 国产亚洲精品久久久| 欧美激情亚洲综合一区| 国产精品久久久| 亚洲国产精品久久久久秋霞影院| 国产精品福利av| 亚洲成色www8888| 国产毛片一区二区| 日韩亚洲欧美一区二区三区| 一区二区三区在线视频播放| 夜夜嗨av一区二区三区四季av| 曰本成人黄色| 先锋影院在线亚洲| 亚洲一区免费观看| 美腿丝袜亚洲色图| 久久精品国产第一区二区三区最新章节 | 亚洲国产专区校园欧美| 亚洲欧美日本在线| 在线亚洲伦理| 欧美大片91| 免费欧美在线视频| 国产专区精品视频| 亚洲自拍偷拍福利| 亚洲一区二区三区欧美| 欧美精品国产| 欧美激情一区二区三区蜜桃视频| 国产一区二区中文| 香蕉久久久久久久av网站| 亚洲欧美日韩在线| 欧美视频一区二区| 国产精品一区二区女厕厕| 欧美激情精品久久久六区热门 | 免费亚洲电影在线| 久久久久久久网站| 国产伦精品一区二区三区免费迷| 亚洲精品久久在线| 亚洲美女网站| 欧美极品一区| 亚洲日韩第九十九页| 一本色道久久综合亚洲精品不卡| 欧美激情一区二区三区不卡| 亚洲丁香婷深爱综合| 亚洲激情一区二区| 欧美黄免费看| 亚洲免费电影在线| 亚洲在线一区| 国产精品一区二区久激情瑜伽| 亚洲午夜精品国产| 午夜亚洲性色福利视频| 国产精品一区二区三区免费观看| 中文一区字幕| 欧美影院久久久| 韩日成人av| 久久人体大胆视频| 欧美激情视频在线播放| 日韩视频免费观看高清在线视频| 欧美激情一区二区三区成人| 日韩一级欧洲| 久久精品视频在线看| 亚洲缚视频在线观看| 欧美激情偷拍| 亚洲一区二区三区激情| 久久精品在线播放| 亚洲国产精品小视频| 欧美剧在线免费观看网站| 一本色道88久久加勒比精品| 欧美影院在线| 亚洲精品久久久久久久久久久久久| 欧美另类极品videosbest最新版本| 一区二区三区产品免费精品久久75| 欧美在线一二三区| 亚洲人成77777在线观看网| 欧美视频导航| 久久精品亚洲| 9l国产精品久久久久麻豆| 久久精品国产第一区二区三区| 亚洲欧洲日本在线| 国产精品一区二区在线观看不卡| 久久免费午夜影院| 一区二区三区精品视频在线观看 | 午夜久久久久久| 亚洲国产老妈| 香蕉成人啪国产精品视频综合网| 在线观看视频一区二区| 欧美色精品天天在线观看视频| 欧美一级理论片| av成人黄色| 欧美华人在线视频| 久久高清免费观看| 在线视频亚洲欧美| 亚洲第一久久影院| 国产日韩在线一区二区三区| 欧美精品性视频| 久久亚洲私人国产精品va| 亚洲午夜激情免费视频| 最新日韩中文字幕| 久久精品免费播放| 亚洲欧美国产77777| 欧美高清在线一区| 日韩亚洲欧美成人| 国产精品国色综合久久| 欧美一区二区三区视频免费播放| 免费的成人av| 亚洲网址在线| 精品va天堂亚洲国产| 欧美日韩精品久久久| 亚洲一区日韩在线| 欧美二区乱c少妇| 亚洲一区二区三区国产| 狠狠入ady亚洲精品经典电影| 欧美寡妇偷汉性猛交| 亚洲欧美色一区| 91久久综合亚洲鲁鲁五月天| 欧美一区二区三区在线免费观看| 原创国产精品91| 国产精品区免费视频| 欧美jizz19性欧美| 午夜一区二区三区不卡视频| 亚洲承认在线| 久久久久成人精品免费播放动漫| 日韩一级在线观看| 狠狠色丁香婷婷综合| 国产精品久久久久久亚洲调教| 久久亚洲欧美| 欧美在线免费观看亚洲| 亚洲精品免费在线播放| 欧美激情综合| 亚洲国产精品毛片| 最近中文字幕日韩精品 | 亚洲午夜久久久| 久久久成人精品| 久久久蜜桃一区二区人| 久久精品视频99| 久久天堂精品| 欧美va亚洲va国产综合| 欧美3dxxxxhd| 亚洲黄色有码视频| 亚洲精品美女在线观看| 一本久久精品一区二区| 亚洲亚洲精品三区日韩精品在线视频| 国产精品99久久99久久久二8| 亚洲视频 欧洲视频| 午夜欧美精品| 久久在线免费观看| 欧美片网站免费| 国产精品免费看| 黄色成人免费观看| 亚洲精品视频二区| 午夜精品成人在线视频| 久久综合九色综合久99|