windowsPE 1-7

来源:互联网 发布:金融数据分析师是什么 编辑:程序博客网 时间:2024/04/30 23:14
.386.model flat,stdcalloption casemap:noneinclude     windows.incinclude     user32.incincludelib  user32.libinclude     kernel32.incincludelib  kernel32.lib    .dataszText db 'HelloWorld',0    .code   start:    invoke MessageBox, NULL, offset szText, NULL, MB_OK    invoke ExitProcess, NULLend start;MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD;MessageBox equ OD:F7 单步步入F8 单步步过在这次跟踪分析的过程中,我们获得了这样的一些信息:汇编语言编译链接的程序的可执行代码在被装入操作系统后,代码的执行入口点被设置在进程地址空间的0x00401000处,大小为1000h;紧跟着是输入表,也占1000h字节;最后是数据段,大小为1000h。DB命令:da 反汇编db hex and assicdc assicdd 数值PE(Portable Executeable File Format,可移植的执行体文件格式),使用该格式的目标是使链接生成的exe文件能在不同的CPU工作指令下工作。资源文件是文本文件,由定义资源的一些脚本语句组成,可以使用文本编辑软件查看和修改。资源目标文件是对这些脚本的一种再组织,根据脚本描述将脚本涉及的所有资源编译到一起,形成二进制字节码。整个过程分为两个阶段:1.创建资源文件.rc2.生成资源目标文件.res内存映射文件是指将硬盘上的文件不做修改地装载到内存中。在硬盘上,文件被分割成若干簇,这些簇不一定会按照文件内容顺序排列在一起,当我们访问磁盘上的文件时,需要计算机首先将不同位置的内容读取到内存。有了内存映射文件,访问就会变得更轻松和快捷,由于读取磁盘的操作集中到了一起执行,读写效率会提高很多。PE内存映射是指将PE文件按照一定的规则装载到内存中,装入后的整个文件头内容不会发生变化,但PE文件的某一部分如节的内容会按照字段中的对齐方式在内存中对齐,从而使得内存中的PE映像与装载前的PE文件不同。RVA是相对于模块而言的,VA是相对于整个地址空间而言的。PE中规定了三类对齐:数据在内存中的对齐、数据在文件中的对齐、资源文件中资源数据的对齐。数据在文件中的对齐通常会以一个物理扇区的大小作为对齐粒度的值,即512字节,十六进制表示为200h。这就是我们在第1章中看到数据段、代码段等起始地址都是200h的倍数的原因了。DOS头:DOS MZ头DOS StubPE头PE数据区:节表节内容IMAGE_NT_HEADERS STRUCTSignature DWORD ?FileHeader IMAGE_FILE_HEADER <>OptionalHeader IMAGE_OPTIONAL_HEADER32 <>IMAGE_NT_HEADERS ENDSIMAGE_DATA_DIRECTORY STRUCTVirtualAddress DWORD ?isize DWORD ?IMAGE_DATA_DIRECTORY ENDSIMAGE_SECTION_HEADER STRUCTName1 db IMAGE_SIZEOF_SHORT_NAME dup(?) ;8个字节的节区名称union MiscPhysicalAddress dd ?VirtualSize dd ? ;节区的尺寸endsVirtualAddress dd ? ;节区的RVA地址SizeOfRawData dd ? ;在文件中对齐后的尺寸PointerToRawData dd ? ;在文件中的偏移PointerToRelocations dd ? ;在OBJ文件中使用PointerToLinenumbers dd ? ;行号表的位置(供调试用)NumberOfRelocations dw ?NumberOfLinenumbers dw ?Characteristics dd ? ;节的属性IMAGE_SECTION_HEADER ENDSWindows加载器在运行PE时会将导入表中声明的动态链接库一并加载到进程的地址空间,并修正指令代码中调用的函数地址。在数据目录中一共有四种类型的数据与导入表数据有关。这四种数据依次为:导入表、导入函数地址表、绑定导入表、延迟加载导入表。在汇编语言中,程序一旦被编译,编译器会对invoke指令进行适当分解。分解后的指令中将会包含指向导入函数地址的操作数。当PE文件被装载到内存中时,该操作数就会变成导入函数所在虚拟地址空间真实的VA。双桥导入表结构:IMAGE_IMPORT_DESCRIPTORIMAGE_TRUNK_DATAIMAGE_IMPORT_BY_NAME在内存中,桥1可以让你找到调用的函数名称或函数的索引编号,桥2却可以帮助你找到该函数指令代码在内存空间的地址。当PE被加载进虚拟地址空间以后,IAT的内容会被操作系统更改为函数的VA。绑定导入是数据目录中注册的一种类型IMAGE_BOUND_IMPORT_DESCRIPTOR STRUCTTimeDateStamp dword ? ; 时间戳OffsetModuleName word ? ;指向DLL名称NumberOfModuleForwarderRefs word ? ; ModuleForwarderRef数目IMAGE_BOUND_IMPORT_DESCRIPTOR ENDSIMAGE_BOUND_FORWARDER_REF STRUCTTimeDateStamp dword ?OffsetModuleName word ?Reserved word ?IMAGE_BOUND_FORWARDER_REF ENDS有关注册表操作的函数位于动态链接库文件advapi32.dll中。通过导出表,DLL文件向调用它的程序或系统提供导出函数的名称、序号,以及入口地址等信息。导出表的作用有两个:一是可以通过导出表分析不认识的动态链接库文件所能提供的功能。二是向调用者提供输出函数指令在模块中的起始地址。Windows加载器将与进程相关的DLL加载到虚拟地址空间以后,会根据导入表中登记的与该动态链接库相关的由INT指向的名称或编号来遍历DLL所在虚拟地址空间,通过函数名或编号查找导出表结构,从而确定该导出函数在虚拟地址空间中的起始地址VA,并将该VA覆盖导入表的IAT相关项。只要你掌握了动态链接库的内部编码,即使没有导出表,你也可以随意地引用里面的函数,哪怕这些函数是私有的。链接器会根据def文件的内容在导出表中加入由EXPORTS指定的函数名EXPORTSAnimateOpenAnimateCloseFadeInOpenFadeOutCloseIMAGE_EXPORT_DIRECTORY STRUCTCharacteristics dowrd ?TimeDateStampdword ?MajorVersionword ?MinorVersion word ?nName dword ?nBase dword ?NumberOfFunctions dword ?NumberOfNames dword ?AddressOfFunctions dword ?AddressOfNames dword ?AddressOfNameOrdinals dword ?IMAGE_EXPORT_DIRECTORY ENDS导出表常见的应用主要包括对导出表函数的覆盖,以及对动态链接库内部私有函数的导出等。进函数:push ebpmov ebp, esp...mov esp, ebppop ebp出函数如果使用重定位技术,你就可以将代码随意地部署到内存中,而不影响程序的运行。程序被装入内存时,其基址是由字段IMAGE_OPTIONAL_HEADER中的ImageBase决定的。但是,如果当装载时该位置已经被别的程序使用,那么操作系统就有权重新选择一个基地址。这时候就需要对所有的重定位信息进行修正,而修正的依据就是PE中的重定位表。伪代码:struct IMAGE_BASE_RELOCATION{DWORD VirtualAddress;DWORD SizeOfBlock;WORD TypeOffset[1];};位图、光标、图标这三种资源最终都是基于图片文件的。定义格式:nameID BITMAP/CURSOR/ICON [DISCARDABLE] 文件名IDM_MAIN MENU DISCARDABLEBEGINPOPUP "文件"BEGINMENUITEM "打开文件", IDM_OPENMENUITEM SEPARATORMENUITEM "退出", IDM_EXITENDPOPUP "查看"BEGINMENUITEM "源文件", IDM_1MENUITEM "窗口透明度", IDM_2ENDENDPE的资源组织方式类似于操作系统的文件管理方式。从根目录开始,下设一级子目录、二级子目录和三级子目录;三级子目录下才是文件。一级子目录按照资源类型分类,如“光标”,“位图”,“菜单”等二级子目录按照资源的ID分类。三级子目录按照资源的代码页分类。如“中文”、“英文”、“繁体中文”三级目录后即为节点,也就是所说的“文件”。这里的“文件”其实就是包含了资源数据的指针和大小等信息的一个数据结构而已。定义资源时,既可以使用字符串作为名称来标识一个资源,也可以通过ID号来标识资源。IMAGE_RESOURCE_DIRECTORYIMAGE_RESOURCE_DIRECTORY_ENTRYIMAGE_RESOURCE_DATA_ENTRY
0 0
原创粉丝点击