cs新生成一个shanque.exe用Everedit打开
在分析之前先说几个概念
pe结构:可执行文件的头部结构
分类
DWORD:8个位置,4字节
WORD:4个位置,2字节
BYTE:2个位置,1字节
大概有DOS头,NT头组成。
用来支持在dos操作系统上来运行
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
关注两个地方
1.e_magic
标志位,看到5A4D就说明是PE结构(MZ是一个什么创始人的吊签名),是一个可执行文件。
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; //文件签名
IMAGE_FILE_HEADER FileHeader; //标准的NT头
IMAGE_OPTIONAL_HEADER32 OptionalHeader; //可选的NT头
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
DWORD Signature
4550,PE,表示NT头开始的地方
IMAGE_FILE_HEADER FileHeader;
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, * PIMAGE_FILE_HEADER;
//
// Directory format.
//
-
WORD NumberOfSections;
区节数
0007,7节
用Exeinfo PE打开看一下
DWORD TimeDateStamp;
时间戳,5AC57562
1522890082
卧槽,exe是我昨晚生成的,我这是穿越啦
DWORD PointerToSymbolTable;标志表指针(被废除 不用管)
DWORD NumberOfSymbols;标志表数量(被废除 不用管)
WORD SizeOfOptionalHeader;
可选头大小
00E0,可以判断是32位还是64位,32位文件是224,64是240
WORD Characteristics;
文件特征,030F,30F就是300+F,100+200+F,F=1+2+4+8,然后对照下面的表看特征就可以。
IMAGE_OPTIONAL_HEADER32 OptionalHeader
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT additional fields.
//
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
WORD Magic;
文件类型标识,010B,32位镜像文件
0x10B:32位镜像文件
0x107:rom镜像文件
0x20B:62位镜像文件
BYTE MajorLinkerVersion;(链接器主版本号)
BYTE MinorLinkerVersion;(链接器副版本号)
不重要
DWORD SizeOfCode;
功能代码的大小(.text段的大小) 1E00,7680字节
DWORD SizeOfInitializedData;
.data段的大小,3400
DWORD SizeOfUninitializedData;
.bss段的总大小,600
DWORD AddressOfEntryPoint;
程序的虚拟入口地址,就是程序运行时候的第一行代码,不是整个文件的第一行
就是紫色的这一行
这一行才是文件的第一行,叫做代码基址。
DWORD BaseOfCode;
代码基址,第一行代码的内存地址,1000
DWORD BaseOfData;
数据基址
DWORD ImageBase;
入口点
入口点,当加载进内存时镜像的第1个字节的首选地址。它必须是64K的倍 数。
这里可以判断是exe还是dll:DLL默认是10000000H。Windows CE 的EXE默认是00010000H。Windows 系列的EXE默认是 00400000H。
整个的分析笔记我放在附件了,篇幅太大容我偷个懒,感兴趣的小伙伴看到这里应该也知道怎么去分析了。
把shanque.exe丢到微步的沙箱里看看分析除了什么PE特征,通过pefile来复现猜测一下沙箱是怎么去检测的。
1.判断是否有完整的PE结构,判据为DOS头的e_magic
import pefile
pe = pefile.PE('shanque.exe')
if pe.DOS_HEADER.dump_dict()['e_magic']['Value'] == 23117:
print("这是个PE结构的文件")
else:
print('not')
2.判断文件类型,判据可选NT头IMAGEBASE
import pefile
pe = pefile.PE('shanque.exe')
if pe.OPTIONAL_HEADER.dump_dict()['ImageBase']['Value'] == 4194304:
print('这是一个windows系列的exe程序')
else:
print('这是一个dll文件')
3.判断是32位还是64位,判据标准NT头WORD SizeOfOptionalHeader;
import pefile
pe = pefile.PE('shanque.exe')
if pe.FILE_HEADER.dump_dict()['SizeOfOptionalHeader']['Value'] == 224:
print('这是一个32位文件')
else:
print('这是一个64位文件')
4.平台,判据NT头WORD machine
import pefile
pe = pefile.PE('shanque.exe')
if pe.FILE_HEADER.dump_dict()['Machine']['Value'] == 332:
print('intel 386')
else:
print(0)
5.子系统,判据可选NT头 WORD Subsystem;
import pefile
pe = pefile.PE('shanque.exe')
if pe.OPTIONAL_HEADER.dump_dict()['Subsystem']['Value'] == 2:
print('Windows图形用户界面(GUI)子系统(一般程序)')
else:
print('0')
6.节区数量,标准NT头 WORD NumberOfSections
import pefile
pe = pefile.PE('shanque.exe')
print(pe.FILE_HEADER.dump_dict()['NumberOfSections']['Value'])
7.程序的入口点 可选NT头DWORD AddressOfEntryPoint;
import pefile
pe = pefile.PE('shanque.exe')
if pe.OPTIONAL_HEADER.dump_dict()['AddressOfEntryPoint;']['Value']
打赏我,让我更有动力~
day6.rar 文件大小:0.007M (下载次数:1)
© 2016 - 2024 掌控者 All Rights Reserved.
seraphim
发表于 2023-4-23
感谢分享
评论列表
加载数据中...