[原创]纯汇编打造PE感染病毒
本人文笔非常烂,想到什么就写什么,望见谅。
这个是上一年写的代码,最近翻了翻硬盘发现了这尘封了多年的东西。
由于PE感染病毒中了很麻烦,请小心运行。
编译环境是masm32,附件里有编译用的命令行,改改就行。xp下测试通过
PE感染病毒要克服几个重要的问题:变量的存放,函数地址的调用,对PE文件的处理,还要考虑在宿主的变量函数等存储等,很麻烦,我一年前写的我都忘的差不多了。
程序的一切是从main.asm的start标号开始。顺着他看下去一切思路又回来了。
要处理的问题:
1,重定位。
由于病毒会在宿主里运行,病毒不知道自己是在哪里运行,哪个地址被执行的,所以要想办法知道自己在哪里。
call @1 @1:
pop ebp
sub ebp, offset @1
sub ebp, offset @1 的意思是把@1处的地址,被ebp减,如果是在本程序,ebp为0,但如果这代码运行在宿主程序里,那么ebp的值就是原编译好的程序的地址与宿舍新地址的差。以后要用变量,只要 offset var + ebp就是变量地址。这样就达到重定位的目的。
例如,在上面定义的变量:
kernel32_base dd 0 ;kernel32.dll的基地址
mov eax , dword ptr [ebp + kernel32_base]
这样就可以使用这个变量,而不管这段代码是在宿主的哪个地方运行的。
2,API地址的获取
R3的程序肯定要调用系统的API,不然没法工作。找api的方法通常来讲都是这样:找到kernel32.dll的基址, 通过输出表,找到GetProcAddress地址,再通过GetProcAddress找到任何你想要的函数地址。
我这里找kernel32.dll采用暴力搜索法,但其实是可以通过fs来找到的,方法各异。
因为当程序在入口点运行时,栈里就是kernel32.dll的某个地址。
;下面要取得kernel32.dll的基地址
mov eax,[esp] ;取得kernel返回地址
@step1:
dec eax
cmp dword ptr [eax], 4550h ;如果是MZ标志的DOS头标志
je offset @step2
jmp offset @step1
@step2:
dec eax
cmp word ptr[eax], 5A4Dh
je offset @step3
jmp @step2
@step3: ;现在eax就是kernel32.dll的基地址了
mov dword ptr [ebp + kernel32_base] , eax
至于在k32.dll里通过导出表找到函数的方法,我封装了下:
;函数名称 :getApiAddr_K32
;说明 :根据导出表,得出在K32里的API的函数地址
;k32base :kernel32.dll的基地址
;export_table :导出表地址
;api_name :要取得api的函数名称地址
;返回值 :找到的API地址,如找不到则为0
getApiAddr_K32 proc k32base:DWORD, export_table:DWORD, api_name_addr:DWORD
具体代码在看代码吧。
3,感染PE文件
对于感染PE文件,我采用文件映射到内存的方法,CreateFileMapping什么的。一个个搜索指定的目录,判断是否是PE文件,然后感染。
首先做的是打开文件,然后进行文件映射,然后增加一个节,用来存放病毒代码。把病毒本身的代码写进去。
当然,也要把程序的原始入口点保存起来,到时执行完病毒 的代码,就跳转回原来的执行。
在病毒执行的过程中,你可以增加别的代码,在程序启动前干什么事都行。这里我的程序只是弹一个网页而已。
