|
手艺频道
|
51CTO旗下网站
|
|
挪动端

进修“免杀手艺”前应当把握的“基础知识”

在Windows下所谓PE文件即Portable Executable,意为可移植的可执行的文件。而今天我们便去详细相识一下PE文件的DOS头和PE头的构造成员取局部成员的感化。

作者:信息平安我来说您去听泉源:|2019-03-26 09:41

一、 什么是PE文件?

在Windows下所谓PE文件即Portable Executable,意为可移植的可执行的文件。常见的.EXE、.DLL、.OCX、.SYS、.COM都是PE文件。PE文件有一个配合特性:前两个字节为4D 5A(MZ)。若是一个文件前两个字节不是4D 5A则其一定不是可执行文件。好比用16进造文本编辑器翻开一个".xls"文件其前两个字节为:0XD0 0XCF;翻开一个".pdf"其前两个字节为:0X25 0X50。

PE文件构造:DOS头+PE头+节表+.data/.rdata/.text。而今天我们便去详细相识一下PE文件的DOS头和PE头的构造成员取局部成员的感化。注重:一个exe文件自己是一个PE文件,然则因为包含dll库,以是一个exe文件也是很多PE文件构成的(包含多个dll)一个PE文件

1. DOS头:共40H(64字节)

DOS头中声明用的寄存器(我们能够看到e_ss、e_sp、e_ip、e_cs照样16位的寄存器),以是在32位/64为体系顶用到的只要两个成员了(第一个和最初一个):

  • e_magic:判定一个文件是否是PE文件;
  • e_lfanew:相对文件尾的偏移量,用于找到PE头;

金沙@22官网

2. PE头

PE头分为尺度PE头和可选PE头,其同为NT构造的成员:

  1. //NT头  
  2. //pNTHeader = dosHeader + dosHeader->e_lfanew;  
  3. struct _IMAGE_NT_HEADERS{  
  4. 0x00 DWORD Signature; //PE文件标识:ASCII的"PE"  
  5. 0x04 _IMAGE_FILE_HEADER FileHeader;  
  6. 0x18 _IMAGE_OPTIONAL_HEADER OptionalHeader;  
  7. }; 

凭据DOS头的e_lfanew成员我们便能够找到NT头,NT头的第一个成员是"PE"(0X50 0X45 0X00 0X00四字节的署名,能够在上图00000100H地点处视察),后两个成员则分别是尺度PE头(_IMAGE_FILE_HEADER)和可选PE头(_IMAGE_OPTIONAL_HEADER)。

3. 几个重点的数据成员

(1) 文件对齐(FileAlignment)和内存对齐(SectionAlignment):

一个PE文件加载进内存中能够大于在硬盘上的巨细,而且无论是在内存中照样硬盘上,都是是分块管理(分节),一块和一块存储空间之间是闲暇。在硬盘上闲暇有可能小于内存中闲暇;在内存中闲暇较大(相较于硬盘)。而存在间隙的缘由则是分块管理。

分块的一个缘由是节约硬盘:好比notepad.exe,由因而晚期的顺序,事先硬盘容量比较小,编译器在天生可执行文件时,不只要思索效力题目使得内存对齐/文件对齐,借需求设想成节约硬盘空间的构造。以是这类构造遵照的对齐原则:内存对齐(1000H)和硬盘对齐(200H),对齐的增补数据(0X0000)就是间隙。硬盘的对齐值较小,增补间隙天然小,因而同一个可执行顺序在内存中能够比在硬盘上大。然则现如今的硬盘空间更大,以是编译器天生的可执行顺序在硬盘上取内存中对齐体式格局都是1000H。同一对齐为1000H的目标照旧是提高效率。

而分块的另一个目标是节约内存空间,好比同时在电脑上运转登录多个QQ账号,便需求运转屡次QQ可执行顺序。而代码段为只读数据需求一份便可,数据段则需求为每一个账号均拓荒一份,,多个QQ顺序同享代码块,零丁运用数据块,如许便节约了多份代码块的内存。(这些块是运用构造体去保护的,分块即建立构造体)。

(2) 镜像地点/基址ImageBase的感化:

FileBuffer是磁盘上.exe文件在内存中的一份拷贝,然则FileBuffer没法间接在内存中运转,必需经由PE loader(装载器)装载今后成为ImageBuffer。ImageBuffer是FileBuffer的"拉伸"。即".exe–>FileBuffer–>ImageBuffer"

  • .exe尾地点(基址)为0
  • FileBuffer尾地点也为0
  • ImageBuffer尾地点为ImageBase
  • 而真正的顺序入口地点是:ImageBase + AddressOfEntryPoint(OEP)

一个exe文件默许镜像地点为400000H(有可能不是,总之有一个默认值),若是一个exe文件顶用到了多个dll,而dll文件作为一个PE文件,其默许镜像地点也均是400000H,操作系统不会修正exe的镜像基址。由于.exe先被加载,在.exe中才加载的dll库,因为400000曾经被.exe占用,以是装载器会修正dll的镜像基址。而接纳ImageBase + OEP的目标也就是:接纳偏移地点的体式格局能够更轻易天修正基址,使得任何一个dll文件基址修正后顺序照旧不会失足。好比:dll和exe基址有抵触,本只需求将抵触的.dll的文件基址修正为600000H(假定是编译器为其分派的是600000H);若是不接纳"基址+偏移地点"的体式格局,而接纳绝对地点,那么要修正的便不是一个基址为600000H了,而是dll中所有的地点同一加上200000H(由于本来默许为400000H)。

二、 汇编基础知识

1. 寄存器

望文生义,寄存器就是临时存储数据的中央,寄存器被设想在CPU内部,关于一个汇编程序员来讲,CPU中最主要的局部就是寄存器了。寄存器是程序员能经由过程指令读写的部件,程序员经由过程改动寄存器的值直接的掌握CPU

  • eax:拓展累加寄存器;
  • ecx:轮回计数器;
  • edx:数据寄存器;
  • ebx:基址寄存器;

2. 客栈

客栈是一连的内存单位,存取体式格局遵照"先辈后出"原则,栈是一种特别的存储体式格局,特别在最早进入这个空间的数据却是最初进来的。然则堆和栈不是同一个观点,栈一样平常由编译器主动分派开释,存储函数的参数值、部分变量值等;而堆,一样平常由程序员分派开释,顺序完毕时能够由OS(体系)收受接管。

  • esp:栈顶;
  • ebp:栈底;
  • esi:拓展目天指针;
  • edi:拓展目天指针;
  • eip:指令指针。

3. 汇编指令

汇编指令有5类:

  • 数据传输指令:mov
  • 逻辑盘算指令:add
  • 串操纵指令:movs
  • 掌握转移指令:jmp
  • 处理器掌握指令:nop

个中1,2,4类指令对免杀有效。

4. 常用免杀汇编指令

  • mov ebp,9:传送指令
  • push ebp :进栈指令
  • pop ebp :出栈指令
  • add esp,8 :加法指令
  • sub esp,8 :减法指令
  • inc ecx :增量指令
  • dec ecx :加量指令
  • jmp 00000001 :无条件跳转指令
  • call 00000001 :挪用指令
  • xchg:交流指令
  • pushad:压栈8个寄存器
  • popad:弹出8个寄存器(先辈后出)

三、免杀常用等价交换汇编指令修正要领

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 复件_(4).004CF607 ----------------- push 复件_(4).004CF607
  • CMP DWORD PTR DS:[100170A4],0 -------------sub DWORD PTR DS:[100170A4],0
  • CALL ---------看到了CALL追随出来看NOP便能够把CALL的地点该成NOP
  • 要领2--看下四周有没有MOV建该成NOP看下可以避免杀不。能够的话该XOR
  • 要领3--看四周jnz跳转该下跳转的地点/可免杀不/
  • CALL EAX |CALL EBX
  • 比效指令 CMP:看下是个比效指令 在看下JNZ前提转移指令
  • 就是说CMP比效准确便跳那我们能够把CMP用NOP失落在把JNZ该成JMP
  • 不停止CMP比效
  • CMP ESI,1
  • call 改 jmp

D开头:

  • DAA 组合的十进制加法调解指令 --------DAS 减法的十进制调解.

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修正中要看下跳的地点是否是很重要阐明[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

【编纂推荐】

【责任编辑:赵宁宁 TEL:(010)68476606】9980.com

点赞 0
  •     
分享:
人人皆在看
猜您喜好
7249澳门金莎娱乐场

编纂推荐

热点
聚焦
存眷
头条
热点
24H热文
一周话题
本月最赞
www.61619.com

定阅专栏

优化运维流水线
共3章 | youerning

198人定阅进修

IT人的职场心法
共22章 | Bear_Boss

79人定阅进修

运维标配手艺
共15章 | one叶孤舟

199人定阅进修

视频课程

讲师:20967人进修过

讲师:3229人进修过

讲师:17846人进修过

CTO品牌
7249澳门金莎娱乐场

最新专题

7249澳门金莎娱乐场
精选博文
论坛热帖
下载排行

读 书

在那本书中,C 言语专家 Peter Prinz和Tony Crawford为您供应大量的编程参考信息。全书叙说清楚,语句简约,剖析深入。本书主题包孕: ...
金沙@22官网
7249澳门金莎娱乐场

定阅51CTO邮刊

51CTO服务号

51CTO播客