成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

學(xué)習(xí)“免殺技術(shù)”前應(yīng)該掌握的“基礎(chǔ)知識(shí)”

安全 網(wǎng)站安全
在Windows下所謂PE文件即Portable Executable,意為可移植的可執(zhí)行的文件。而今天我們就來(lái)具體了解一下PE文件的DOS頭和PE頭的結(jié)構(gòu)成員與部分成員的作用。

一、 什么是PE文件?

在Windows下所謂PE文件即Portable Executable,意為可移植的可執(zhí)行的文件。常見(jiàn)的.EXE、.DLL、.OCX、.SYS、.COM都是PE文件。PE文件有一個(gè)共同特點(diǎn):前兩個(gè)字節(jié)為4D 5A(MZ)。如果一個(gè)文件前兩個(gè)字節(jié)不是4D 5A則其肯定不是可執(zhí)行文件。比如用16進(jìn)制文本編輯器打開一個(gè)".xls"文件其前兩個(gè)字節(jié)為:0XD0 0XCF;打開一個(gè)".pdf"其前兩個(gè)字節(jié)為:0X25 0X50。

PE文件結(jié)構(gòu):DOS頭+PE頭+節(jié)表+.data/.rdata/.text。而今天我們就來(lái)具體了解一下PE文件的DOS頭和PE頭的結(jié)構(gòu)成員與部分成員的作用。注意:一個(gè)exe文件本身是一個(gè)PE文件,但是由于包含dll庫(kù),所以一個(gè)exe文件也是許多PE文件組成的(包含多個(gè)dll)一個(gè)PE文件

1. DOS頭:共40H(64字節(jié))

DOS頭中聲明用的寄存器(我們可以看到e_ss、e_sp、e_ip、e_cs還是16位的寄存器),所以在32位/64為系統(tǒng)中用到的只有兩個(gè)成員了(第一個(gè)和最后一個(gè)):

  • e_magic:判斷一個(gè)文件是不是PE文件;
  • e_lfanew:相對(duì)于文件首的偏移量,用于找到PE頭;

學(xué)習(xí)“免殺技術(shù)”前應(yīng)該掌握的“基礎(chǔ)知識(shí)”

2. PE頭

PE頭分為標(biāo)準(zhǔn)PE頭和可選PE頭,其同為NT結(jié)構(gòu)的成員:

  1. //NT頭  
  2. //pNTHeader = dosHeader + dosHeader->e_lfanew;  
  3. struct _IMAGE_NT_HEADERS{  
  4. 0x00 DWORD Signature; //PE文件標(biāo)識(shí):ASCII的"PE"  
  5. 0x04 _IMAGE_FILE_HEADER FileHeader;  
  6. 0x18 _IMAGE_OPTIONAL_HEADER OptionalHeader;  
  7. }; 

根據(jù)DOS頭的e_lfanew成員我們就可以找到NT頭,NT頭的第一個(gè)成員是"PE"(0X50 0X45 0X00 0X00四字節(jié)的簽名,可以在上圖00000100H地址處觀察),后兩個(gè)成員則分別是標(biāo)準(zhǔn)PE頭(_IMAGE_FILE_HEADER)和可選PE頭(_IMAGE_OPTIONAL_HEADER)。

3. 幾個(gè)重點(diǎn)的數(shù)據(jù)成員

(1) 文件對(duì)齊(FileAlignment)和內(nèi)存對(duì)齊(SectionAlignment):

一個(gè)PE文件加載進(jìn)內(nèi)存中可能大于在硬盤上的大小,并且無(wú)論是在內(nèi)存中還是硬盤上,都是是分塊管理(分節(jié)),一塊和一塊存儲(chǔ)空間之間是空隙。在硬盤上空隙有可能小于內(nèi)存中空隙;在內(nèi)存中空隙較大(相較于硬盤)。而存在間隙的原因則是分塊管理。

分塊的一個(gè)原因是節(jié)省硬盤:比如notepad.exe,由于是早期的程序,當(dāng)時(shí)硬盤容量比較小,編譯器在生成可執(zhí)行文件時(shí),不僅要考慮效率問(wèn)題使得內(nèi)存對(duì)齊/文件對(duì)齊,還需要設(shè)計(jì)成節(jié)省硬盤空間的結(jié)構(gòu)。所以這種結(jié)構(gòu)遵循的對(duì)齊原則:內(nèi)存對(duì)齊(1000H)和硬盤對(duì)齊(200H),對(duì)齊的補(bǔ)充數(shù)據(jù)(0X0000)便是間隙。硬盤的對(duì)齊值較小,補(bǔ)充間隙自然小,因此同一個(gè)可執(zhí)行程序在內(nèi)存中可能比在硬盤上大。但是現(xiàn)如今的硬盤空間更大,所以編譯器生成的可執(zhí)行程序在硬盤上與內(nèi)存中對(duì)齊方式都是1000H。統(tǒng)一對(duì)齊為1000H的目的依舊是提高效率。

而分塊的另一個(gè)目的是節(jié)省內(nèi)存空間,比如同時(shí)在電腦上運(yùn)行登錄多個(gè)QQ賬號(hào),就需要運(yùn)行多次QQ可執(zhí)行程序。而代碼段為只讀數(shù)據(jù)需要一份即可,數(shù)據(jù)段則需要為每個(gè)賬號(hào)均開辟一份,,多個(gè)QQ程序共享代碼塊,單獨(dú)使用數(shù)據(jù)塊,這樣就節(jié)省了多份代碼塊的內(nèi)存。(這些塊是使用結(jié)構(gòu)體來(lái)維護(hù)的,分塊即創(chuàng)建結(jié)構(gòu)體)。

(2) 鏡像地址/基址ImageBase的作用:

FileBuffer是磁盤上.exe文件在內(nèi)存中的一份拷貝,但是FileBuffer無(wú)法直接在內(nèi)存中運(yùn)行,必須經(jīng)過(guò)PE loader(裝載器)裝載以后成為ImageBuffer。ImageBuffer是FileBuffer的"拉伸"。即".exe–>FileBuffer–>ImageBuffer"

  • .exe首地址(基址)為0
  • FileBuffer首地址也為0
  • ImageBuffer首地址為ImageBase
  • 而真正的程序入口地址是:ImageBase + AddressOfEntryPoint(OEP)

一個(gè)exe文件默認(rèn)鏡像地址為400000H(有可能不是,總之有一個(gè)默認(rèn)值),如果一個(gè)exe文件中用到了多個(gè)dll,而dll文件作為一個(gè)PE文件,其默認(rèn)鏡像地址也均是400000H,操作系統(tǒng)不會(huì)修改exe的鏡像基址。因?yàn)?exe先被加載,在.exe中才加載的dll庫(kù),由于400000已經(jīng)被.exe占用,所以裝載器會(huì)修改dll的鏡像基址。而采用ImageBase + OEP的目的也就是:采用偏移地址的方式可以更方便地修改基址,使得任何一個(gè)dll文件基址修改后程序依舊不會(huì)出錯(cuò)。比如:dll和exe基址有沖突,本只需要將沖突的.dll的文件基址修改為600000H(假設(shè)是編譯器為其分配的是600000H);如果不采用"基址+偏移地址"的方式,而采用絕對(duì)地址,那么要修改的就不是一個(gè)基址為600000H了,而是dll中所有的地址統(tǒng)一加上200000H(因?yàn)樵瓉?lái)默認(rèn)為400000H)。

二、 匯編基礎(chǔ)知識(shí)

1. 寄存器

顧名思義,寄存器就是暫時(shí)存儲(chǔ)數(shù)據(jù)的地方,寄存器被設(shè)計(jì)在CPU內(nèi)部,對(duì)于一個(gè)匯編程序員來(lái)說(shuō),CPU中最主要的部分就是寄存器了。寄存器是程序員能通過(guò)指令讀寫的部件,程序員通過(guò)改變寄存器的值間接的控制CPU

  • eax:拓展累加寄存器;
  • ecx:循環(huán)計(jì)數(shù)器;
  • edx:數(shù)據(jù)寄存器;
  • ebx:基址寄存器;

2. 堆棧

堆棧是連續(xù)的內(nèi)存單元,存取方式遵循"先進(jìn)后出"原則,棧是一種特殊的存儲(chǔ)方式,特殊在最先進(jìn)入這個(gè)空間的數(shù)據(jù)卻是最后出去的。但是堆和棧不是同一個(gè)概念,棧一般由編譯器自動(dòng)分配釋放,存儲(chǔ)函數(shù)的參數(shù)值、局部變量值等;而堆,一般由程序員分配釋放,程序結(jié)束時(shí)可能由OS(系統(tǒng))回收。

  • esp:棧頂;
  • ebp:棧底;
  • esi:拓展目地指針;
  • edi:拓展目地指針;
  • eip:指令指針。

3. 匯編指令

匯編指令有5類:

  • 數(shù)據(jù)傳輸指令:mov
  • 邏輯計(jì)算指令:add
  • 串操作指令:movs
  • 控制轉(zhuǎn)移指令:jmp
  • 處理器控制指令:nop

其中1,2,4類指令對(duì)免殺有用。

4. 常用免殺匯編指令

  • mov ebp,9:傳送指令
  • push ebp :進(jìn)棧指令
  • pop ebp :出棧指令
  • add esp,8 :加法指令
  • sub esp,8 :減法指令
  • inc ecx :增量指令
  • dec ecx :減量指令
  • jmp 00000001 :無(wú)條件跳轉(zhuǎn)指令
  • call 00000001 :調(diào)用指令
  • xchg:交換指令
  • pushad:壓棧8個(gè)寄存器
  • popad:彈出8個(gè)寄存器(先進(jìn)后出)

三、免殺常用等價(jià)替換匯編指令修改方法

A開頭:

  • add 改adc
  • ADD 改ADC
  • ADD 1 改 sub -1
  • add dword ptr ss:[ebp-130],edx ---------adc dword ptr ss:[ebp-130],edx
  • ADD [EAX],CH----------------------------ADD [EAX],DH
  • ADD [EAX],BH 0038 ----------------------ADD [EAX+40],AL 0040 40
  • ADD [EAX+EAX*2+46],AL ------------------ADD [EAX+EAX*2+46],CL
  • ADD [EAX+40],DL 0050 40 ----------------0058 40 ADD [EAX+40],DL
  • ADD AH,CH 00EC -------------------------00F4 ADD AH,DH
  • add dword ptr ss:[ebp-130],edx -------- adc dword ptr ss:[ebp-130],edx

C開頭:

  • CMP 改SUB
  • call 復(fù)件_(4).004CF607 ----------------- push 復(fù)件_(4).004CF607
  • CMP DWORD PTR DS:[100170A4],0 -------------sub DWORD PTR DS:[100170A4],0
  • CALL ---------看到了CALL跟隨進(jìn)去看NOP就可以把CALL的地址該成NOP
  • 方法2--看下附近有沒(méi)有MOV修該成NOP看下可以免殺不。可以的話該XOR
  • 方法3--看附近jnz跳轉(zhuǎn)該下跳轉(zhuǎn)的地址/可免殺不/
  • CALL EAX |CALL EBX
  • 比效指令 CMP:看下是個(gè)比效指令 在看下JNZ條件轉(zhuǎn)移指令
  • 就是說(shuō)CMP比效正確就跳那我們可以把CMP用NOP掉在把JNZ該成JMP
  • 不進(jìn)行CMP比效
  • CMP ESI,1
  • call 改 jmp

D開頭:

  • DAA 組合的十進(jìn)制加法調(diào)整指令 --------DAS 減法的十進(jìn)制調(diào)整.

J開頭:

  • JE 改 JNB
  • JNZ 改 JNL
  • jnz 改 JB
  • JE 改 JNA
  • je 改 jb
  • jnz 改 jg
  • js 改 jp
  • je 改 jle
  • jnz 改 jle
  • je 改 jge
  • JE 改 jnz
  • JE 改 JB
  • JNS 改 POP ECX
  • JNS 改 jnc-jnb
  • JNB 改 JGE
  • jnb short fsg2_0.0040015D----------------ja short fsg2_0.0040015D
  • JMP NEAR [1071c]---------------------JMP NEAR [1071B]
  • jnz--je-jmp修改中要看下跳的地址是不是很重要說(shuō)明[1]
  • JNZ 00874E85--MOV EAX,88B6D0 可以是該成JE 00874E85--MOV EAX,88B6D0

L開頭:

  • LEA EBP,[ESP+10] 改 LEA EBP,[ESP+10]

M開頭:

  • MOVSX 改 MOVZX
  • MOV EBP,ESP 改 AND AH,CH
  • MOV [EBP-18],ESP 改 MOV [EBP-18],AH
  • MOV EAX,[ESP+10] 改 MOV EAX,[ESP+10]
  • MOV [ESP+10],EBP 改 MOV [ESP+10],EBP
  • mov [ebp-256], eax 改 adc [ebp-226], eax
  • MOV EDI,[EBP+10] 改 MOV EDI,[EBP+11]
  • MOV EBX,DWORD PTR DS:[ESI] 改 XOR EBX,DWORD PTR DS:[ESI]
  • MOV EBP,ESP--------AND AH,CH
  • MOV EBX,DWORD PTR DS:[ESI]---------XOR EBX,DWORD PTR DS:[ESI]

P開頭:

  • push 改call
  • PUSH EBX PUSH EDI
  • PUSH ESI PUSH EAX
  • PUSH EDI PUSH ESI
  • PUSH EAX PUSH EBX
  • pop 改 nop

S開頭:

  • sbb 改adc
  • sub 改mov
  • SHL 改 SAL
  • SAR 改 SHR
  • sub ebp,7---------- add ebp,-7
  • sub ebx,eax----------sbb esi,ecx
  • SBB ECX,DWORD PTR DS:[ESI+2]----------ADC ECX,DWORD PTR DS:[ESI+2]
  • sub ebx,eax----------sbb esi,ecx

X開頭:

  • xor 改sub
  • XOR [EAX],AL-------改--------MOV [EAX],AL
  • XOR EAX,EAX-----改-------OR EAX,EAX
責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guān)推薦

2017-09-21 12:15:36

機(jī)器學(xué)習(xí)概率學(xué)習(xí)

2010-08-02 16:20:31

ICMP協(xié)議

2009-11-18 18:30:57

路由器技術(shù)

2014-06-17 09:55:24

機(jī)器學(xué)習(xí)

2023-03-29 14:58:17

Java元數(shù)據(jù)Java 注解

2010-08-06 08:49:00

2023-08-31 11:41:08

2010-11-15 10:02:31

UPS電源技術(shù)

2010-07-30 16:38:10

路由器網(wǎng)絡(luò)

2022-10-10 23:14:40

JavaScrip對(duì)象屬性

2015-07-15 16:53:55

IP游戲基礎(chǔ)知識(shí)

2009-12-24 10:43:26

FECN前向擁塞標(biāo)識(shí)

2010-07-23 13:16:07

Perl

2010-04-13 14:00:10

Unix文件

2009-10-16 10:07:29

綜合布線系統(tǒng)

2010-04-23 16:37:13

Aix權(quán)限

2011-02-25 09:37:35

2023-07-04 07:31:06

MapReduce數(shù)據(jù)處理編程模型

2012-05-21 10:39:52

RAID

2010-05-24 16:20:32

IPv6隧道技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 在线小视频 | 日本五月婷婷 | 欧美一区二区网站 | 91就要激情 | 国产一区二区欧美 | 国产一区二区 | 操一草 | 精品一区二区三区入口 | 欧美一a一片一级一片 | av一区二区三区四区 | 亚洲3p | 亚洲激情专区 | 亚洲欧美视频一区 | 欧美日韩在线观看一区 | 欧美精品中文字幕久久二区 | 精品电影 | 操操日| 观看av| 中文字幕国产高清 | 在线观看视频福利 | 国产精品看片 | 九九热这里只有精品在线观看 | 亚洲精品一区二区三区中文字幕 | 久久精品国产一区 | 99久久日韩精品免费热麻豆美女 | 日韩二区| av播播| 夜夜骚视频 | 欧美一级片久久 | 精品一二区 | 成人福利在线视频 | 特黄毛片| 久久久国产精品入口麻豆 | 久久综合九色综合欧美狠狠 | 狠狠色香婷婷久久亚洲精品 | 亚洲一区二区av | 欧美 日本 国产 | 黄网站涩免费蜜桃网站 | 久草资源在线视频 | 黄视频网站免费观看 | 欧美视频一区 |