[原创]感染型病毒编程实现(有源码)
众所周知,感染型病毒是通过感染计算机PE文件,来复制传播。病毒与PE文件同穿一条裤子,偷偷寄存在人家后院,尽干“不见得人”的事。
搜一下硬盘发现曾写过一个练过手,虽然写得不尽完美,但感染性还是有的,分享下,初学者能有一个直观印象,大鸟请拍砖。。。
病毒的目的创建svchost傀儡进程,感染计算机下所有非系统文件夹下的exe,dll文件,在被感染文件下添加一个节,把母体和shellcode写进去,修改入口。下次被感染母体运行时,释放病毒母体并运行,重复过程继续感染。
感染流程如下:

下面回答关键的几个问题:
1,如何注入svchost进程?
通过Inline 底层的ntdll.dll ZwWriteVirtualMemory函数,可以在母体创建svchost.exe进程还没有执行线程的过程中,得到往svchost.exe进程空间写入注入代码的机会。
为什么要Inline ZwWriteVirtualMemory函数,而不是其它的?
因为进程创建进程有一个过程,打开映像文件,创建执行体,初始化线程,线程执行。往进程注入代码的关键时刻只能是线程执行前。初始化线程,有调用ZwWriteVirtualMemory写入数据的过程,这时候如果Hook住 ZwWriteVirtualMemory函数就可以为所欲为了。
写入shellcode和修改入口跳转到shellcode,然后再让svchost进程跑起来。那么svchost就帮你干事了。

2,注入svchost 的Shellcode代码如何写?
Shellcode是用C++写后,编译成一个exe文件,然后再去提取你需要的那部分。写Shellcode最重要的是保证其独立性,别让代码跑崩了。Shellcode不像exe执行一样有PE加载器重定位,链接输入表,为你准备一切东西就等你跑起来。Shellcode是“干坏事”的没有人帮,怎么办?所以一切要自己动手丰衣足食,这里的shellcode调用所有的API都是通过LoadLibrary和GetProcAddress得到的。那LoadLibrary和GetProcAddress怎么得到?这里通过fs:[0x30]寄存器,得到kernel基址,然后解析输出表得到两个API地址。
有时编译器会在你不知道情况下,为你加上库函数,这样情况要避免。如初始化一个数组:
Array[1024]={0};
汇编下做了什么?

编译器自动为你加上memset库函数。所以shellcode一跑就崩溃了。
3,写shellcode代码要注意什么?
重定位。
源码
源码.zip

1,测试目标
母体。资源里包括有下面两段shellcode
2,注入代码
注入到svchost中,跑起来的shellcode,编译再提取出来。
3,shellcodeTest
添加到被感染文件shellcode,编译后提取出来。
声明:源码只提供交流学习之用,勿用来做违法事情。
