
第3章亲和特征提取方法31如果偏移为000000E0h,则输入表的文件偏移为000000E0h 80h 000000160h. 如图3所示,输入表的地址为0001FC38h,大小为3Ch. 类似地,可以得出结论,输入地址表IAT的地址为00001000h,大小为00000148h. IMAGESECTION HEADER结构的定义typedef struct IMAGE SECTION HEADER BYTE名称联合块大小DWORD PhysicalAddress物理地址是文件偏移量DWORD VirtualSize相对虚拟大小其他DWORD VirtualAddress块虚拟相对位置DWORD SizeOfRawData文件中的对齐大小DWORD PointerToRawData文件中的偏移量DWORD PointerToRelocations重定位偏移量DWORD PointerToLinenumbers符号表调试的偏移量WORD NumberOfRelocations重定位项编号WORD NumberOfLinenumbers行号编号的行数表DWORD特性块属性IMAGE SECTION HEADER PIMAGE SECTION HEADER数据目录该表是块表之后,即从PE标头为F8h,即文件偏移量为0000001D8h 000000E0h F8h.
同时,在上述分析中,字段NumberOfSections的值为3,即,它包含3个块,因此一共有3个块头结构. 如图3所示,两端的黑色阴影部分分别为2和1. 总共3. 块表本质上是IMAGE SECTION HEADER块头结构的数组. 每个IMAGE SECTION HEADER结构都代表一个块. 它的大小是40个字节. 电子科技大学32的硕论文包含其指出的部分. 表37中显示了诸如名称,长度,位置等信息. IMAGE SECTION HEADER结构的定义. 恶意代码示例的阻止列表知识与恶意代码示例相结合,可以总结出阻止表信息,如表38所示.

其中Name表示块名称VSize,即VirtualSize. 它是指未执行对齐过程之前使用的块的实际大小. VOffset,VirtualAddress,指示将块加载到内存中时的相对虚拟地址简称. RVA该地址基于内存页对齐的RSize,即SizeOfRawData,它指示磁盘文件中块的大小. 可以写入等. 公共字段属性为00000020h,其中包含代码00000040h,其中包含初始化数据00000080h,其中包含未初始化数据02000000h可丢弃块10000000h共享块20000000h可执行文件40000000h可读80000000h可写. 在此示例中,块文本的属性值为60000020h 20000000h 40000000h 00000020h表示它包含可读且可执行的代码C0000040h 40000000h 80000000h 00000040h表示块数据包含已初始化的数据且可读可写.
类似地,可以推断其他块的块属性信息. 根据表38中的数据,可以计算出表39中所示的差Δk. 然后,您可以使用它来查找输入表的位置. 内存中每个块的起始地址与磁盘文件之间的差异块的虚拟偏移量VOffset RVA文件的偏移量ROffset差异Δk文本0000 1000 0000 0400 0000 0C00h数据0002 1000 0001 F800 0000 1800h rstc 0006 9000 0006 1C00 0000 7400h输入表根据数据目录表的描述,输入表的地址为0001FC38h. 查询表3显示00001000h 0001FC38h 00001000h 0001F3DF,因此它位于块文本中,其文件偏移为ROffset RVA 0001FC38h00000C00h 0001F038h. 您可以在恶意代码文件的第3章,亲和特征提取方法33中找到地址,您可以找到输入表,如图38所示. 10IMAGE IMPORT DESCRIPTOR结构定义typedef struct IMAGE IMPORT DESCRIPTOR 00h union DWORD特征DWORD OriginalFirstThunk指向INT RVA其他04h DWORD TimeDateStamp 32位时间标记可以忽略08h WORD ForwarderChain通常为0可以忽略0Ch WORD名称指向DLL名称的指针10h WORD FirstThunk指向IAT的RVA图像导入描述符PIMAGE IMPORT DESCRIPTOR输入表是图像导入描述符,后跟一个IID数组,并以全零的IID结尾.

PE文件链接到的每个DLL都有一个IID. IID的大小为5个双字节. 表3-10中显示了IMAGE IMPORT DESCRIPTOR的定义. 结合图3的内容,我们可以看到恶意代码总共具有2个有效的IID. 可以找到第一个IID,名称字段为000201E6h,因此其文件偏移为ROffsetRVA 000201E6h00000C00h 001F5E6h. 找到如图3所示的地址. DLL的名称是kernel32dll. 同样,另一个DLL的名称是shell32 dll. 根据图38和IMAGE IMPORT DESCRIPTOR结构的定义,我们可以对IID数组信息进行排序,如表31所示. 字段OriginalFirstThunk包含指向输入名称表的内容,即INT的RVA INT是其数组元素均为IMAGE THUNK DATA结构的数组. TimeDateStamp指示32位时间戳,无需注意. ForwarderChain是第一个重定向到0的API索引. FirstThunk包含输入地址表IAT的RVA. IAT也是由IMAGE THUNK DATA结构组成的数组.
IMAGE THUNK DATA是一个双字结构,在不同情况下具有不同的含义. 对OriginalFirstThunk科技大学硕论文34和FirstThunk的内容的分析表明,当未将PE文件加载到内存中时,OriginalFirstThunk和FirstThunk最终指示相同的内容,但是当加载到内存中时,FirstThunk的内容会改变. 这不是本文的重点. 没有更多细节. 11IID数组十六进制DLL名称OriginalFirstThunk TimeDateStamp ForwarderChain FirstThunk kernel32 dll 0001 FC74 0000 0000 0000 0000 0000 0000 1000 shell32 dll 0001 FD5C 0000 0000 0000 0000 0000 0000 10E8下面将详细解释如何查找API函数名称kernelFirstThunk OriginalFirstThunk值. 计算文件偏移0001FC74h 00000C00h 0001F074h. 找到文件偏移量0001F074h以获取IMAGE THUNK DATA数组,如图3所示. 10以全零的IMAGE THUNK DATA结构结束. 您可以在此处查看所有的IMAGE THUNK数据. 最高位为0,表示这些值分别是RVA,指向IMAGE IMPORT NAME结构,该结构是存储输入功能信息的字长.

恶意代码实例的DLL名称的第3章亲和特征提取方法35 10恶意代码实例的OriginalFirstThunk数组11输入恶意代码实例的函数名称IMAGE IMPORT NAME结构以函数名称开头,以00结尾. 以第一个为例. RVA值为0001FDBCh 0001FDBCh 00000C00h 0001F1BCh. 文件偏移为0001F1BCh. 您可以看到函数名称,如图3所示. 11.前2个字节4D01h(或提示)aspack 修复输入表iat 手动,后一个00为结尾. 同样,可以逐个搜索输入函数,即系统API函数10中IMAGETHUNK DATA结构的数目. 可以获得输入函数的数目. 同样,您可以在另一个DLL中找到API函数名称. 至此,我们可以成功找到所有系统API功能的信息,包括DLL以及DLL下的功能数量和功能名称. 中国电子科技大学硕论文36 Shell恶意代码样本的Shell分析本文使用两种PE解析软件PEid和ExeInfoPE,并使用HexWorkshop直接查看恶意代码样本的内容. 同时,结合文献59的研究成果,对不同外壳类型的恶意代码样本进行了观察和分析,并与未编码的恶意代码样本进行了比较.
如图3所示,12是带有UPX shell的恶意代码示例. 您可以看到,块表中的块名称都与UPX相关. 这与ExeinfoPE软件给出的诊断结果一致. 根据这种方法,分析了几个带有UPX shell的恶意代码示例,并用UPX标记了块名称. 查看它调用的API数量. 它调用kernel32 dll,user32dll,advapi32dll. 括号中的三个dll是每个dll中API的数量. 您可以看到API的总数只有七个. 12带有UPX Shell的恶意代码示例使用专门删除UPX Shell的工具. 12解压缩恶意代码后,检查其十六进制文件的内容,如图3所示. 13与shell相比,您可以看到该块编号已更改,块名称已还原为通用块名称. 再次查看其输入表,您可以看到其编号已变为13. 再次查看图3. 图14是带有ASPack类型外壳的恶意代码示例. 检查其块表. 有一个块名aspack. 查看如图3 15所示的恶意代码示例的输入表,我们可以看到在其输入表中只有6个API函数. 使用特殊的脱壳工具对ASP进行脱壳以再次执行脱壳,然后观察其十六进制文件. 根据上面第37章第3章中的亲属特征提取方法,对PE文件的分析将找到其输入表的位置,如图3 16所示. 当有大量API函数时,至少有50个或50个API函数. 这样.

说明只要带壳的PE文件是带壳的,则成功完成脱壳后才能找到原始形状. 解压缩成功后,可以使用以前的PE文件分析方法来正常分析恶意代码样本的原始形式. 13删除UPX Shell之后的恶意代码示例14打包ASP包装的恶意代码示例的列表38电子科技大学论文38 15带ASP外壳的恶意代码示例的输入表16删除ASP外壳后的恶意代码示例的输入表17是使用nsPacker shell的恶意代码示例. 您可以看到ExeinfoPE的诊断与十六进制文件中显示的块名称中的名称相同. 查看它调用的API数量. 它调用kernel32 dll,user32dll,advapi32dll,mprdll,urlmondll. 括号中的5个dll是API的数量. 您可以看到总数只有14. 使用NSP的拆包软件进行拆包后,您可以看到其块名称恢复为正常,并且其输入功能变为kernel32 dll 53,user32 dll,advapi32dll,mprdll,urlmondll. 输入功能的数量也显着增加. 其他类型的外壳没有列出一些知名的外壳. 添加外壳程序后,其PE文件中的块名称将更改,并且将类似于外壳程序名称.
EXE文件中的通用块名称是文本. 第3章亲和特征提取方法39 codedata rdata idata edata rsrc bss crt tls reloc sdata srdata pdata debug drectvedidat. 因此,如果PE文件中的块名称中还有其他名称,则有理由怀疑可执行文件已打包. 17NSP打包的恶意代码查看如图3所示的未知外壳,图18所示的恶意代码示例无法检测是否使用ExeinfoPE打包了恶意代码. 观察恶意代码的PE标头可知道该文件总共有7个块. 然后,通过观察块表中的块名称,可以看到当有一个块名称时,dfd不是通用的块名称. 查看它调用的系统API,可以看到它仅调用user32 dll,并且API的数量仅为6. 18未知的Shell和打包的恶意代码电子科学技术大学硕论文40经过大量分析之后对带壳和未打包的恶意代码示例,可以得出以下结论: 当PE文件的块名称不是通用名称时,很有可能已被覆盖. b. 带有外壳程序的PE文件调用的系统API函数的数量通常相对较小,少于10,而解压后的数量通常大于10.
第2条中可能会有一些错误,但是您可以使用第1条对其进行更正,因此,本文将使用第2条来确定是否打包了恶意代码示例. 只要满足其中之一,就认为该恶意代码示例已被破坏. 这种检测是否打包了恶意代码样本的方法不能保证100%的准确性,但是在分析了大量的恶意代码之后,可以看出错误率仍然很小并且可以容忍. 对于其他没有检测到该外壳的恶意代码以及移除该外壳后的恶意代码,我们直接使用常规的PE文件分析方法来获取其系统API集和相似的功能代码. 拆包过程本文使用命令结合了第三方拆包软件和手动动态拆包来对带壳的恶意代码示例进行拆包. 第三方脱壳可能会导致脱壳失败. 为了更准确地提取MAS功能,本文还介绍了手动脱壳方法,该方法是使用OllyDebug动态调试脱壳. 脱壳工作的主要步骤包括脱壳,搜索OEP,DUMP程序以及修复. Shell检查是第一步. 已经有许多外壳检查软件. 本文使用ExeinfoPE和PEid,它们已经在上面进行了说明,在此不再赘述. OEP是原始入口点的缩写,表示程序的入口点. 有几种查找OEP的方法. 用于调试恶意代码的单步跟踪方法,逐步跟踪每条指令的执行,直到其到达程序的真正入口点为止,即所谓的OEP.
此方法最简单,但也浪费时间和精力. 为了加快搜索速度,在调试过程中几乎可以忽略所有向上的跳跃,从而更快地找到OEP. 在调试中aspack 修复输入表iat 手动,大多数情况下,遇到巨大的向下跳跃时,都会达到代码的OEP. ESP法则60这里的ESP代表扩展堆栈指针. 首字母缩写词是用于保存堆栈指针的指针寄存器. 该方法以堆栈平衡为理论基础,即当当前正在运行的程序调用其他函数或子程序时,当前处于程序运行状态的所有寄存器都保存在堆栈中. 指向栈顶地址的指针保存在ESP中. 当被调用的函数或子例程完成并返回时,有必要确保ESP中的指针内容与先前保存的内容一致,以确保正确返回先前运行的程序. 在打包代码的反汇编中,当主程序运行到Shell程序时,将首先执行PUSHAD命令. 该命令的特定作用是将所有当前寄存器放入
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-230330-1.html
无非就是电视剧播完了
人家只是分析情况
真坑