exp2 分析PE感染程序
1.分析感染后的可执行程序
感染前和感染后对比:
main-new.exe:最先传播病毒的exe文件,大小:3KB
test.exe:感染目标,感染前大小:2.5KB
test2.exe:感染后的exe文件,感染后大小:6.5KB
winhex打开这两个文件,利用相关功能分析(查看—>同步和比较)
感染前后文件不一样的地方就被winhex用黑色给标记出来了
一共有四处不一样:
感染前有3个节(00 03)感染后有4个节(00 04)
感染前时间戳为B9 2F 70 5E 感染后时间戳为6B 72 61 64
感染前入口地址为10 00(00 10) 感染后入口地址为42 DC(DC 42)
感染前PE映像尺寸为40 00(00 40) 感染后PE映像尺寸为50 00(00 50)
1.1.1确定感染后的test.exe程序包含哪几个节,每个节的访问属性如何;这两方面与感染前程序相比,有什么变化?
感染前程序包含.text、.rdata、.data三个节
感染后程序包含.text、.rdata、.data、.hum四个节
.text节characteristic为60 00 00 20 可读可执行
.rdata节characteristic为40 00 00 40 可读已初始化
.data节characteristic为40 00 00 C0可读,既包含已初始化又包含未初始化
(以上为感染前后相同部分)
.hum节characteristic为E0 00 00 20 可写可读可执行,包含可执行代码
1.1.2如何验证main—new.exe程序是否会反复感染同一test.exe文件?分析main—new.exe是如何做到不重复感染的?
-
main—new.exe先感染test.exe,感染后程序大小由2.5K变成6.5K
-
再次运行main—new.exe,test.exe不会再次被感染,提示“本程序仅感染未被感染过的test.exe程序
-
”test.exe文件大小仍然为6.5K。如果反复感染同一test.exe文件,理论上被感染文件就会变得非常大。
综上:main—new.exe不会反复感染同一test.exe文件
前文已经说明:感染前后的PE头一共有四处不一样,不确定到底哪个才是感染后的标记的话,可以一个一个来试
修改节数
将感染节数值03改成04,发现程序无法运行,这个不是感染后的标记
修改时间戳
将时间戳改为感染后时间戳
得出结论:感染过程大概是判断PE程序的时间戳是否为感染后时间戳,若为感染后时间戳,则不会再次感染。我用pexplorer.exe打开看了一下,看到了感染前后两个PE文件的创建时间查看了这个病毒的时间戳2023/05/14 22:44:43。理论上,如果有PE文件是在这个时间创建的,这个PE文件就不会被感染。我记得之前课上老师讲过时间戳可以作为一些病毒感染过的标记
修改过后,运行test2,test没有被感染
2.手工清除被感染程序test.exe中的“病毒”部分,同时达到免疫效果
修改了被感染程序test2.exe的病毒部分,共需修改三处:
1.节数值04改为感染前的03
2.程序入口地址改为感染前的10 00
3.PE映像尺寸改为感染前的40 00
感染后的时间戳不变,这样就达到了免疫的效果。我发现计算机病毒在某种程度上很像生物学的病毒。当我们被病毒入侵一次过后,病毒的一些特征就被我们的免疫系统记住了,病毒再次入侵我们人体时就没有之前入侵那次破坏性那么强了。我们将病毒的特征提取出来,制成了疫苗,注射到人体中,人体对有这种特征的病毒就免疫了。
3.(选做)分析源程序main-new.asm
3.1定位并分析其中重定位相关的代码,说明存储相应偏差位移量的寄存器是哪个:
call _delta
调用delta函数,delta的地址被推入栈
pop ebp
得到delta地址,将delta变量的地址存放在ebp寄存器中
sub ebp,offset _delta
以便于后面变量重定位,offset _delta 是delta变量预期的地址
其中sub ax,bx
就是ax中的值减bx中的值,然后把结果,放入ax中。
3.2定位并分析其中获取kerne132.dll在内存中装载位置的代码,说明记录装载位置的存储单元(包含寄存器和变量)
需要重定位的原因:实际地址与预期地址存在差异
解决方法:通过kernel32里面的结构特征来定位kernel32的API函数地址
1.kernel32.dll的块对齐值是10000h
2.kernel32也是PE文件,其结构中Imagebase值是载入地址,
可以将ecx寄存器中的值(模块起始值/程序运行过程中的基地址)与PE文件结构的Imagebase是否相等来作为判定依据。
edi指向的位置我觉得是定位感染目标文件,因为EDI地址附近就是test.exe,
esi指向API函数名字串偏移地址,我看到目标位置的内容是GetModuleHandleA一些列函数名
这是对AX和DX的解答
EAX与AX不是独立的,EAX是32位的寄存器,而AX是EAX的低16位
同样,AH是ax的高8位,而AL是ax的低8位