VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1024|回复: 0

[交流] 一个隐藏自身常驻内存的Win32病毒(WinXP下调试通过)

[复制链接]
53_avatar_middle
在线会员 发表于 2016-9-21 15:47:06 | 显示全部楼层 |阅读模式
一、        几点说明:
a)        本代码用 TASM32 编写。为什么不用MASM32?因为喜欢
Borland。病毒代码需要比较精细地控制,MASM32宏的优势
体现不出来。当然,TASM32有很多不完善的地方,比如说,
WINDOWS有大量的结构它没有定义,需要我们自己去定义,
还比如说,它定义结构的时候,不同结构体里也不能有相同的
命名,导致我们定义结构的时候需要为命名绞尽脑汁。

b)        本代码没有写感染代码。为什么没有写?主要是没有找到比较
满意的感染策略。本来是写了一段简单的感染代码的。做法就
是在被感染文件后加一个节,将病毒代码写入这个节里,可我
发现在感染自解压文件的时候,会破坏自解压文件的数据,让
它无法再解压,这让我太有挫败感了,我觉的一个精巧的病毒
是不应该破坏宿主程序的基本功能的,于是将感染部分去掉
了。后来又想了个策略,就是想将病毒代码分成多段分别写入
宿主文件的空隙中,在运行时再将代码拼合起来。但是,本代
码比较大(编译后有8K,还没有算感染代码),另外,固定
代码部分(也就是不能分割的代码)有1K多。微软的链接器
默认的节对齐大小是1024字节,Borland的只有512字节。因
此,基本上太可能会有文件存在8K这么大的空隙供我来感
染,这个想法也流产了。有兴趣的同学可以自己尝试着写一下
感染代码。

c)上传的压缩包里有两个文件,一个是.asm源代码,一个是.inc头文件
用tasm32编译,用tlink32链接
tasm32.EXE /mx /m4 /z /q /zn  /I"..\Include" Terminate.asm
tlink32.EXE /x /V4.0 /Tpe /aa /c /L"..\LIB"  "Terminate.obj" ",,,,,"
生成Terminate.exe
可以放心运行,不会感染任何文件
另外,让explorer.exe调用 GetDC 的方法:鼠标右键在工具栏上点右键,然后点任务管理
就可以了

二、        基本思路:
隐藏自身常驻内存的概念:简单的说,它不是一个独立的进程,
你在任务管理器中是看不到这个进程的。
如何实现?我们知道,WINDOWS正常工作时,一定会有一个
Explorer.exe的进程在运行。如果这个进程被杀掉了,windows
会自动启动另一个Explorer.exe进程。当然,严重的时候,只能
注销或者重启系统。既然Explorer是常驻内存的,那么,我们
可不可以把我们的病毒代码附在Explorer进程上?当然是可以
的。我的做法是:

1、分配一个内存共享文件,将病毒代码整个拷贝到内存共享
        文件中去。
2、搜索进程 Explorer.exe,找到后,挂接 Explorer.exe的一个
   API,可以选择GetDC这个函数。当然,这个挂接函数是必须
   写入Explorer.exe进程空间的,因为挂接函数比较小,我们是
        很容易在Explorer.exe进程里找到空隙把它写进去的。
3、当GetDC被调用时,我们的代码就接管了控制权。这时,我
们就可以在挂接函数里打开之前分配的内存共享文件。

4、这时,我们的病毒程序就可以结束了。因为Explorer打开了内
存共享文件,只要Explorer不结束,内存共享文件就不会被释
放。

5、现在,我们就可以做一些我们想做的事情了。比如说创建一个
                线程(线程代码在内存共享文件中),在线程里,可以搜索
                所有磁盘上所有的EXE,DLL文件,逐个感染。我的做法是
                挂接API  CreateProcessW。只要用户通过Explorer来运行程
序,就会被拦截,然后弹出一个对话框,请输入运行密码,密
码错误,禁止运行,密码正确,可以运行。

三、        一些关键技术简介。
1、        重定位:为什么要重定义位,简单说来,是因为PE文件在
磁盘上和在内存里的状态是不一样的,所有的地址引用都会
发生变化。特别是病毒,感染宿主文件后,它的位置更是发
生很大的变化。所以,必须在程序里重新计算地址偏移,在
所有引用地址的时候把偏移加上。
计算重定位方法:(代码中随处可见)
CALL        _delta
_delat:  
POP                EBP
SUB        EBP,OFFSET _delta
就这么简单的3行,EBP寄存器里就得到了重定位的偏移。

2、        结构化异常处理:为什么要用结构化异常处理?主要是为
了打乱代码执行顺序,反跟踪,反调试。
代码里用的线程结构化异常处理。Windows的结构化异常
处理是一个链表结构。
EXCEPTION_REGISTRATION
        typedef struct _EXCEPTION_REGISTRATION
                {
struct _EXCEPTION_REGISTRATION * ddPrev
                        PROC        ddHandler
                }EXCEPTION_REGISTRATION
挂接异常处理函数代码如下:
        ASSUME        FS:NOTHING
        ;异常处理函数地址入栈
        PUSH        OFFSET        _SEH_Entry
        ;异常处理函数地址需加上重定位偏移
        ADD                DWORD PTR [ESP], EBP
        ;将前一个节点(TIB)入栈
        PUSH        DWORD PTR FS:[0]
        ;挂接新的节点
        MOV                FS:[0],ESP
挂接了异常处理函数后。我们主动触发异常,这时,代码
将跳到异常处理函数里。如果用调试器来跟踪,异常处理
函数就不会执行。因为调试器通常都会接管异常处理。
OR                DWORD PTR [EAX],0
这是往 kernel32.dll中的一个地址里写一个字节(其实没
变,但也会触发异常),触发非法内存访问异常。

        PUSHFD
        OR                DWORD PTR [ESP],0100H
        POPFD
        NOP
这四行是将单步标志置1,触发单步异常。

3、        获取Kernel32.dll的首地址。相当于windows API LoadLibraryA
原理就是获得一个 Kernel32.dll 里的地址,由这个
地址从后往前搜索PE文件标志 ‘PE’ 以及 ‘MZ’
如果找到了’PE’标志以及 ‘MZ’标志且满足
IMAGE_NT_HEADER =
IMAGE_DOS_HEADER +
MAGE_DOS_HEADER->IDH_lfanew
则认为找到了Kernel32.dll的首地址。
如何获得一个 Kernel32.dll 里的地址?我们的进程
都是由API  CreateProcessW创建,CreateProcessW
创建进程后,会在栈里保存一个返回地址,这个返回
地址就在 Kernel32.dll中。

4、        获取API函数,相当于 API  GetProcessAddress
用之前获取的Kernel32.dll的首地址,搜索它的函数
导出表,则可以获得我们所需要的API。需要注意的
是Kernel32.dll里有少量API并没有代码,而是直接从
NTDLL.DLL里引入的,这样的函数被称作 Forward函数,
这时,我们就需要从NTDLL里获得这个函数的地址了。

5、        搜索进程Explorer,用Windows 的 ToolHelp API完成
CreateToolhelp32Snapshot
Process32First
Process32Next
Module32First
Module32Next

6、        将GetDC_Hook代码写入Explorer的进程空间并挂接
API  GetDC,这个API的挂接方法是修改的函数导入表。
OpenProcess
WriteProcessMemory

7、        挂接Explorer 的 CreateProcessW。这个API的挂接方法
是修改前面函数入口处的7个字节为
MOV  EAX, CreateProcessW_Hook
JMP                EAX
字节编码为:
MOV  EAX,XXXXXXXX  =  B8 XX XX XX XX
JMP   EAX = FF E0

8、        内存对话框
为什么要用内存对话框,而不能用资源文件?
因为资源文件的Load是从文件头里的资源列表
中找到的,而我们的病毒寄生后没有文件头,所以
不能用资源文件,而必须用内存对话框。
调用API  DialogBoxIndirectParamA 生成一个模态
对话框。



Terminate.rar

15.53 KB, 下载次数: 2, 下载积分: 驿站币 -1

源程序





上一篇:(XTP)VS2010 环境下XTP资源,一款优秀的开源界面开发库
下一篇:嵌入式入门首先必须要知道以下几点
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-9-22 15:02

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表