首页
社区
课程
招聘
[旧帖] [求助]1个木马 0.00雪花
发表于: 2014-11-18 00:06 1668

[旧帖] [求助]1个木马 0.00雪花

2014-11-18 00:06
1668
在卡饭下了个样本,像是盗号的
查了下,没查出来,直接ida打开了,刚看了没多久,cpu就100%,任务管理器被禁用,exe都打不开,也不知道咋回事><
由于在网吧,重启了下继续分析




一些变量声明

StartupInfo= _STARTUPINFOW
ProcessInformation= _PROCESS_INFORMATION
cbData= dword
hKey= dword
CommandLine= word
FileName= byte
var_414= word
var_412= byte
Buffer= word
var_20A= byte
var_4= dword

开始代码:

mov     edi, edi
push    ebp
mov     ebp, esp
sub     esp, 880h
mov     eax, ___security_cookie
mov     [ebp+var_4], eax                                ;栈安全码
mov     ax, ds:word_1002070
push    ebx
push    esi
push    edi
mov     [ebp+Buffer], ax                                ;存储ds:word_1002070
xor     eax, eax
mov     edx, 81h
mov     ecx, edx
lea     edi, [ebp+var_20A]                                ;缓冲区清零
rep stosd
stosw
mov     ax, ds:word_1002074
mov     [ebp+var_414], ax
xor     eax, eax
mov     ecx, edx
lea     edi, [ebp+var_412]                                ;缓冲区清零
rep stosd
stosw
xor     eax, eax
mov     ecx, 82h
lea     edi, [ebp+FileName]                                ;文件名缓冲区清零
rep stosd
lea     eax, [ebp+hKey]                                        ;注册表键的句柄变量
push    eax           
push    20019h      
xor     esi, esi
push    esi           
push    offset SubKey                                           ; "Microsoft\Terminal Server Client"
push    80000002h     
mov     [ebp+cbData], 208h
call    ds:__imp__RegOpenKeyExW@20
test    eax, eax
jnz     loc_100235B

开始初始化了几个变量,调用了RegOpenKeyExW,打开注册表的HKEY_LOCAL_MACHIN\Software\Microsoft\Terminal Server Client键
键的句柄保存在[ebp+hKey], 查了下,这是个允许远程连接的服务               

调用成功跳到这里

lea     eax, [ebp+cbData]
push    eax                    
lea     eax, [ebp+FileName]
push    eax           
push    esi         
push    esi      
push    offset ValueName                 ; "LogFile"
push    [ebp+hKey]
call    ds:__imp__RegQueryValueExW@24
mov     edi, eax
cmp     edi, esi
jnz     short loc_1002331

读注册表键的值,这里要读的文件是LogFile
这里描述下上述2个注册表相关的api

打开注册表
LONG WINAPI RegOpenKeyEx(
  _In_      HKEY hKey,                       
  _In_opt_  LPCTSTR lpSubKey,
  _In_      DWORD ulOptions,
  _In_      REGSAM samDesired,
  _Out_     PHKEY phkResult
);

hKey: 一个打开的键的句柄,可以是返回 RegCreateKeyEx的值,或者是下列的值

HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

lpSubKey: 被打开的子键名, 如果为null,hKey为上述的预定义的值
ulOptions: 一般为0,或者REG_OPTION_OPEN_LINK-->代表一个符号链接
samDesired: 被打开的访问权限, 这里是可读可执行, 20019h
phkResult: 一个变量的指针,返回被打开的键的句柄

如果成功返回0,否则返回非0

读注册表,返回与该键关联的值的类型和数据
LONG WINAPI RegQueryValueEx(
  _In_         HKEY hKey,                ; 被打开的句柄 hKey
  _In_opt_     LPCTSTR lpValueName,        ; 值的名称
  _Reserved_   LPDWORD lpReserved,        ; null
  _Out_opt_    LPDWORD lpType,                ; 返回值,类型
  _Out_opt_    LPBYTE lpData,                ; 返回值,数据
  _Inout_opt_  LPDWORD lpcbData                ; 返回lpData缓冲区中数据的大小
);

读成功跳到这里

push    esi      
push    80h           
push    4           
push    esi      
push    esi            
push    0C0000000h   
lea     eax, [ebp+FileName]
push    eax                             ; lpFileName
call    ds:__imp__CreateFileW@28         ; CreateFileW
cmp     eax, 0FFFFFFFFh
mov     ?g_hLogFile@@3PAXA, eax
jz      short loc_1002329

这里打开Log文件, 设置文件指针, 然后RegCloseKey关闭键

后面几个比较跳转后,如果打开成功,输出"Log file opened by new process attach"到log文件
否则没有生成log文件

loc_100235B:           
cmp     ?g_hLogFile@@3PAXA, 0FFFFFFFFh                ; g_hLogFile是否为-1
jz      short loc_100236

loc_100236是主要的部分,有以下几个子程序

call   ?DeleteTSCDesktopShortcuts
call   ?DeleteTSCFromStartMenu
call   ?DeleteTSCProgramFiles
call   ?DeleteTSCRegKeys
call   ?UninstallTSACMsi
call   ?CreateProcess

开始的子程序进去看下

call    ?DeleteTSCDesktopShortcuts
;

mov     edi, edi
push    ebp
mov     ebp, esp
sub     esp, 670h
mov     eax, ___security_cookie
push    ebx
push    esi
push    edi
xor     ebx, ebx
or      edi, 0FFFFFFFFh
cmp     ?g_hLogFile@@3PAXA, edi                 ; g_hLogFile是否为-1
mov     [ebp+var_4], eax
mov     [ebp+pidl], ebx
jz      short loc_1008D4A

继续判断是否有logfile文件,没有就

loc_1008D4A:         
push    ebx
call    ds:__imp__CoInitialize@4
mov     [ebp+var_670], eax
lea     eax, [ebp+FileName]
push    offset word_1008B0E         
push    eax            
call    _wcscpy                                        ; 拷贝指定的文件名到FileName
pop     ecx
pop     ecx                                        ; 平衡栈
lea     eax, [ebp+pidl]                                ; 参数  一个ITEMIDLIST的指针
push    eax                    
push    10h            
push    ebx            
call    ds:__imp__SHGetSpecialFolderLocation@12  ;取路径, C:\Documents and Settings\[user]\桌面       
test    eax, eax
jl      loc_1008F7B

指定了文件名后,调用了SHGetSpecialFolderLocation来取桌面的根目录的路径, 成功后,pid1的值是一个ITEMIDLIST结构的指针

这个结构保存了指定的文件夹的有关信息,简单说就是每个文件夹都维护一个自己的ITEMIDLIST结构,结构体包含了所有属性,如
文件名,类型,大小,修改时间,通过id+value的形式表示, 桌面也是一个文件夹

----------------------
id         value
0        file type
1        file name
;
----------------------

lea     eax, [ebp+FileName]
push    eax                                     ; 接受返回的路径
push    [ebp+pidl]                              ; pidl
call    ds:__imp__SHGetPathFromIDListW@8        
lea     eax, [ebp+FileName]
push    offset word_1008B12
push    eax        
call    _wcscat                                        ; 追加一个'\'到路径
lea     eax, [ebp+FileName]
push    eax         
call    _wcslen                                        ; 算路径的长度,不包括'\0'
add     esp, 0Ch                                ; 平衡栈
cmp     ?g_hLogFile@@3PAXA, edi                 ; hLogFile保存的是打开的文件句柄,如果是-1,跳到loc_1008DD2,否则输出路径到logfile文件
mov     esi, eax
jz      short loc_1008DD2
;

loc_1008DD2:
lea     eax, [ebp+FileName]
push    offset word_1008B76                        ; 2ah
push    eax            
call    _wcscat                                        ; 追加一个'*'到路径
pop     ecx
pop     ecx
lea     eax, [ebp+FindFileData]                        ; WIN32_FIND_DATA结构
push    eax            
lea     eax, [ebp+FileName]
push    eax                                     ; lpFileName
call    ds:__imp__FindFirstFileW@8                ; 找该路径下所有文件
cmp     eax, edi                                ; 失败就跳转
mov     [ebp+hFindFile], eax
jz      loc_1008F9E

此时的路径应该是这个样子 C:\Documents and Settings\[user]\桌面\*.*

lea     eax, [ebp+FindFileData.cFileName]        ; 文件名
push    eax     
lea     eax, [ebp+FileName]                        ; 路径名
lea     esi, [ebp+esi*2+FileName]
push    eax            
mov     [esi], bx
call    _wcscat                                        ; 追加文件名到路径名
pop     ecx
pop     ecx
lea     eax, [ebp+String1]
push    eax            
lea     eax, [ebp+FileName]
push    eax           
call    ?GetLinkFileTarget@@YGHPAG0@Z
test    eax, eax
mov     edi, ds:__imp__GetFileAttributesW@4         ; edi=GetFileAttributesW地址
mov     ebx, ds:__imp__SetFileAttributesW@8         ; ebx=SetFileAttributesW地址
jz      loc_1008F50

找到一个文件后,路径为C:\Documents and Settings\Administrator\桌面\xx.xx
然后调用一个子程序GetLinkFileTarget(void *,void *),这个子程序先创建一个com对象? 不知道干嘛用
后面查文件是否是可执行文件,是的话就继续,否则就搜索下一个文件

如果不是可执行文件

loc_1008F50:
lea     eax, [ebp+FindFileData]
push    eax            
push    [ebp+hFindFile]
call    ds:__imp__FindNextFileW@8                ; FindNextFile
test    eax, eax
jnz     loc_1008EB3

如果是可执行文件

loc_1008E7F:
lea     eax, [ebp+String1]
push    eax                                          
call    edi                                        ; GetFileAttributesW
and     eax, 0FFFFFFFEh                                ; 去掉只读
push    eax   
lea     eax, [ebp+String1]
push    eax  
call    ebx                                         ; SetFileAttributesW
cmp     ?g_hLogFile@@3PAXA, 0FFFFFFFFh
jz      loc_1008F43                                ; 如果有logfile文件,就输出"deleteTSCDesktopShortcuts: delete shortcuts: %s"到文件中

loc_1008F43:
lea     eax, [ebp+FileName]
push    eax            
call    ds:__imp__DeleteFileW@4                 ; 删除文件

然后继续遍历下一个文件,直到结束返回,里面比较蒙圈,猜是遍历路径下的文件,最后删除指定文件,其余就不分析了
返回之后,加载了2个字符串资源,并调用了?DeleteTSCFromStartMenu子程序
这次换了一个路径C:\Documents and Settings\[user]\[开始] 菜单 程序\程序\*.*,修改文件属性,然后删除文件和所有目录,

然后是这个子程序call   ?DeleteTSCProgramFiles
打开键HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Terminal Server Client, 取到键值UninstallString
然后调用wsplitpath取到其全路径,最后调用了SHFileOperation函数删除文件

lea     eax, [ebp+Args]
mov     [ebp+FileOp.pFrom], eax                ;目录
lea     eax, [ebp+FileOp]
push    eax           
mov     [ebp+FileOp.wFunc], 3                ;删除操作,删除pFrom中指定的目录或文件
mov     [ebp+FileOp.pTo], ebx
mov     [ebp+FileOp.fFlags], 414h        ;不弹出确认框,直接删除
call    ds:__imp__SHFileOperationW@4
lea     eax, [ebp+Args]
push    eax             ; Source
lea     eax, [ebp+FullPath]
push    eax             ; Dest
call    _wcscpy
lea     eax, [ebp+Ext]
push    eax             ; Ext
lea     eax, [ebp+Filename]
push    eax             ; Filename
lea     eax, [ebp+Dir]
push    eax             ; Dir
lea     eax, [ebp+Format]               
push    eax             ; Drive
lea     eax, [ebp+FullPath]
push    eax             ; FullPath
call    __wsplitpath
lea     eax, [ebp+Dir]
push    eax
lea     eax, [ebp+Format]
push    eax             ; Format
lea     eax, [ebp+Args]
push    offset aSS_0    ; "%s%s"        ;像是%XXXXX%的目录
push    eax             ; String       
call    _swprintf
lea     eax, [ebp+Args]
push    eax             ; Str
call    _wcslen
add     esp, 30h
cmp     [ebp+eax*2+var_216], 5Ch
jnz     short loc_10099BA

去掉指定目录%XXXXX%下的以下文件的只读,并删除 "cconman.hlp","conman.exe", "mscreate.dir", "mstsc.cnt","mstsc.exe", "mstsc.hlp","rdpdr.dll"

loc_1009A14:            
push    ?TSCFiles@@3PAPAGA                ;offset "cconman.hlp"..
lea     eax, [ebp+FileName]
push    eax            
mov     [edi], bx
call    _wcscat
pop     ecx
pop     ecx
lea     eax, [ebp+FileName]
push    eax            
call    ds:__imp__GetFileAttributesW@4
and     eax, 0FFFFFFFEh
push    eax            
lea     eax, [ebp+FileName]
push    eax            
call    ds:__imp__SetFileAttributesW@8
lea     eax, [ebp+FileName]
push    eax            
call    ds:__imp__DeleteFileW@4
add     esi, 4
cmp     esi, 20h
jb      short loc_1009A14

之后关闭注册表键,加载shlwapi.dll,调用SHDeleteKey删除键Software\Microsoft\Windows\CurrentVersion\Uninstall\Terminal Server Client的记录
最后释放shlwapi.dll

loc_1009A73:            ; hKey
push    [ebp+hKey]
call    ds:__imp__RegCloseKey@4
push    offset aShlwapi_dll                         ; "shlwapi.dll"
call    ds:__imp__LoadLibraryW@4
mov     esi, eax
cmp     esi, ebx
jz      short loc_1009ABF
push    offset aShdeletekey                         ; "SHDeleteKey"
push    esi            
call    ds:__imp__GetProcAddress@8                
cmp     eax, ebx
jz      short loc_1009AA

后面,后面跟丢了><,大虾帮忙看看创建进程后干了什么

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 215
活跃值: (90)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
网吧都装IDA了
2014-11-18 16:02
0
游客
登录 | 注册 方可回帖
返回
//