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

無我

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

【轉】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 閱讀(1831) 評論(0)  編輯 收藏 引用 所屬分類: 逆向工程

<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

導航

統計

公告

本博客原創文章,歡迎轉載和交流。不過請注明以下信息:
作者:TimWu
郵箱:timfly@yeah.net
來源:www.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>
            欧美激情国产高清| 亚洲一区二区在线免费观看| 久久精品亚洲一区二区| 国产一区二区三区四区在线观看| 欧美一区免费视频| 欧美一区二区三区在线观看| 国产一区二区福利| 老牛影视一区二区三区| 开元免费观看欧美电视剧网站| 亚洲人成欧美中文字幕| 亚洲精品专区| 国产麻豆午夜三级精品| 蜜臀久久99精品久久久画质超高清| 久久在线免费| 亚洲视频免费在线| 午夜一区二区三区在线观看 | 亚洲人体影院| 欧美视频第二页| 欧美中文字幕不卡| 久久综合导航| 亚洲视频在线观看视频| 性8sex亚洲区入口| 亚洲免费精品| 午夜精品久久| 日韩亚洲视频| 久久精精品视频| 中文在线不卡| 另类成人小视频在线| 一区二区欧美日韩| 久久九九国产| 亚洲一区二区三区欧美| 久久国产精品一区二区| 在线亚洲欧美视频| 久久久天天操| 欧美在线地址| 欧美日韩调教| 男女精品网站| 国产视频一区三区| 亚洲免费av电影| 亚洲国产毛片完整版 | 亚洲精品无人区| 国产亚洲欧洲| 一本一本久久a久久精品综合妖精| 国产一区二区三区电影在线观看 | 一区二区免费在线视频| 久久国产福利| 欧美一区二区国产| 欧美激情aaaa| 欧美高清日韩| 合欧美一区二区三区| 亚洲一区二区三区四区五区午夜| 日韩一本二本av| 老司机午夜精品视频在线观看| 欧美自拍偷拍午夜视频| 国产精品二区三区四区| 亚洲日本免费| 亚洲精品中文字| 裸体丰满少妇做受久久99精品 | 亚洲精品在线免费观看视频| 久久精品国产一区二区电影| 午夜视频在线观看一区二区| 欧美视频你懂的| 亚洲精品视频一区二区三区| 亚洲乱码国产乱码精品精| 狂野欧美激情性xxxx| 免费91麻豆精品国产自产在线观看| 国产女优一区| 欧美一级淫片aaaaaaa视频| 欧美在线视频免费播放| 国产欧美三级| 久久国产精品久久久| 久久午夜国产精品| 亚洲二区在线| 欧美激情中文字幕乱码免费| 亚洲欧洲精品一区二区精品久久久| 亚洲日本成人网| 欧美乱妇高清无乱码| 亚洲日韩欧美视频一区| 亚洲网站在线观看| 国产精品久久久久久模特| 亚洲图片在线观看| 久久精品视频99| 在线精品国精品国产尤物884a| 久久亚洲私人国产精品va| 亚洲国产精品久久91精品| 一本综合精品| 国产欧美亚洲一区| 久久免费视频在线观看| 亚洲欧洲一区二区在线播放| 亚洲午夜精品在线| 国产一区日韩一区| 欧美高清视频免费观看| 夜夜夜久久久| 久久亚洲不卡| 一区二区欧美亚洲| 国产视频久久久久久久| 免费h精品视频在线播放| 99re热这里只有精品免费视频| 欧美一区免费| 亚洲日本欧美在线| 国产女主播一区| 欧美国产精品专区| 亚洲综合色激情五月| 欧美成人资源网| 亚洲欧美影院| 亚洲人成网站777色婷婷| 国产精品免费小视频| 久久综合五月| 亚洲欧美精品| 亚洲精品在线观| 久久天堂成人| 亚洲女同精品视频| 亚洲国产精品悠悠久久琪琪| 国产精品女人毛片| 欧美—级高清免费播放| 久久精品国产亚洲高清剧情介绍| 亚洲美女视频网| 欧美91大片| 久久久999| 亚洲免费在线观看视频| 亚洲欧洲日本一区二区三区| 国产午夜久久久久| 欧美日韩中文字幕综合视频| 蜜臀久久99精品久久久久久9| 午夜伦欧美伦电影理论片| 99www免费人成精品| 亚洲欧洲日韩女同| 欧美成人精品三级在线观看| 久久精品国产亚洲aⅴ| 亚洲欧美www| 亚洲一二区在线| av成人免费观看| 亚洲精品一区二区在线| 一色屋精品亚洲香蕉网站| 国产视频精品网| 国产精品视频第一区| 国产精品福利av| 欧美午夜精品电影| 欧美午夜电影完整版| 欧美精品福利| 欧美精品久久一区二区| 欧美www视频| 免费在线亚洲| 欧美成人午夜影院| 欧美大香线蕉线伊人久久国产精品| 欧美在线不卡视频| 欧美在线影院| 久久久久在线| 老司机免费视频一区二区| 久久午夜色播影院免费高清| 久久久久久香蕉网| 老牛嫩草一区二区三区日本| 毛片av中文字幕一区二区| 麻豆精品视频在线观看| 巨乳诱惑日韩免费av| 欧美国产激情二区三区| 欧美日韩福利视频| 国产精品wwwwww| 国产精品亚洲不卡a| 国产日韩亚洲| 亚洲高清资源| 9人人澡人人爽人人精品| 亚洲无玛一区| 久久久久一区二区三区| 欧美a级理论片| 亚洲人在线视频| 亚洲先锋成人| 久久免费99精品久久久久久| 嫩模写真一区二区三区三州| 欧美日韩一区在线观看视频| 国产麻豆视频精品| …久久精品99久久香蕉国产| 99re热这里只有精品免费视频| 亚洲欧美日韩精品久久奇米色影视| 久久久国产一区二区| 欧美成人自拍| 亚洲天堂偷拍| 久久久另类综合| 欧美日韩国产综合视频在线观看中文 | 国产精品久久久99| 韩日精品视频| 亚洲一区二区日本| 久久综合九色九九| 亚洲免费观看在线观看| 欧美亚洲系列| 欧美人与性禽动交情品| 国产欧美精品一区| 亚洲精品裸体| 久久爱www.| 亚洲美女视频在线观看| 欧美在线视频一区二区| 欧美日韩性生活视频| 一区二区三区在线不卡| 中日韩男男gay无套| 美女精品在线| 午夜精品久久久久久久久 | 亚洲女爱视频在线| 欧美国产一区二区三区激情无套| 国产日韩在线看| 夜夜躁日日躁狠狠久久88av|