对于多阶段释放的样本,可以扔进xdbg,在回连C2的函数下断。找到断下来的地址空间,不是shellcode的话就是一个完整的PE,如果是PE,直接dump出来,修复导入导出表后便能在IDA中分析。
看修复过程的操作主要涉及对VirtualAddress和Relative VirtualAddress的处理,顺便学习一下内存对齐的原理。
对于内存空间的任意值, 有:
VirtualAddress:进程虚拟内存的绝对地址。
RelativeAddress:从某个ImageBase开始的相对地址。
ImageBase+RVA=VirtualAddress。
对于PE文件从磁盘到内存映射:
由于PE文件在磁盘上和在内存中的对齐颗粒度不同,会导致同一个PE文件在磁盘上有两个不同的偏移。FOV:文件偏移,RVA内存偏移。
PE扩展头中定义了内存对齐颗粒度SectionAlignment和文件对齐颗粒度FileAlignment。
相互转换的方法:差值=RVA-节VirtualAddress(内存对齐值),FOV=节PointerToData值(文件偏移对齐值)。
对齐
经典的文件对齐值:200h,X86内存对齐:1000h。
SectionAlignment定义了内存中区块的对齐值,PE文件被映射到内存中时,区块总是至少从一个页的边界开始。
对齐的原因
现代计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定的规则在空间上排列,而不是按照顺序一个接一个的排放,这种就称为内存对齐,内存对齐是指首地址对齐,而不是说每个变量大小对齐。
对齐参数
即对齐的最小单位。假如对齐参数是8字节,那4字节的需要填充4字节00h到8字节,36字节需要填充4字节的00h到40字节。