前续:前段时间想玩玩游戏,到游戏里面弄到一个不错的装备,然后有人就私信M我,说想高价收,
然后让我加他QQ,当时也没想什么,就加上了,然后,他说要拿装备和我换,就发来一个图,是这样的一个
,
然后说网络信号不好,就发了一个文件夹过来,里面是这样的,
我下意识觉得遇到骗子,然后就和他扯了扯淡,然后他就给我拉到黑名单了。
然后,操起IDA,便有了这篇贴子。
代码不易排版,我只说一下这个程序的具体思路吧。
1.打开文件是加壳的,不是强壳,就直接脱了。
2.程序里面基本没有导入什么可用的API,而是把API加密成一个DWORD,然后去查IAT比对。像这样
push 7D40BEFDh ; 这个是加密过的API
push offset aWs2_32 ; "ws2_32"
call LoadLibrary
push eax ;MOdule Enterpoint Address 。
call Decrypted_API_fromdll; 这个是主要的解密函数,来得到API。
3.母体程序主要用到了下面这些API:
主要用到了,以下几个API:
ShellExecuteA,CreateFile,ReadFile, SetFilePointer,ExpandEnvironmentStringsA,CreateDirectory,WriteFile,CreateProcess
基本上可以猜到要干什么了,ShellExecuteA打开欺骗人的图片,就是那个小装备图标,先给人一种假象。
然后再去完成其它的工作,CreateFile得到图片的句柄 ,SetFilePointer定位到图片文件结尾,因为在图片文件结尾,有加密的真正的工作程序;然后再用解密函数把木马解密出来,解密算法很简单,下面是伪码。
char sKey[] = Key; 解密密钥
char *p = sDig;
while(pMem)
{
if(!p)p = sDig;
*pMem = *pMem xor *p + *p;
p++;pMem++;
}
4.WriteFile %programfiles%\\Storm\\StormUpdate.exe 和
%programfiles%\\Storm\\StormUpdate.DLL
5.CreateProcess %programfiles%\\Storm\\StormUpdate.exe,暴风开始执行,母体程序退出。
6.Stormupdate.exe是一个MFC程序,因为不太懂怎么跟MFC的程序,我就想了个笨法,里面的Sub不是特别多,我就逐个看了看,通过IDA的Ref找到根,差不多其它的Sub都被一个Sub调用,然后就在这个开始分析,程序加载的时候,执行这个SUB
7.Stormupdate.exe 加载Stormupdate.dll进来,GetprocAdress 得到里面的一个UPdate的Call,然后开始开始执行这个Call。
8.StormUpdate.dll是Debug版的,到处充斥着CheckEsp,这个Call的还是没有做什么实际作用,主要就是解密了另一个PE文件出来。
push offset a3142 ; "3142" ;这个是解密KEY
push 14000h ;size of encypted data
push offset dword_1000B218 ;Encrypted data
call Decrypted_coders_3_args ;解密Call,这个解密出来一个PE文件。
add esp, 0Ch
push offset a3537 ; "3537" ;KEY
push 40h ;Size
push offset q704126176_xicp_net ;这个是个解密出来的我改上去的,这个是上线地址,要是看到的话对号入座吧
call Decrypted_coders_3_args ;解密Call
add esp, 0Ch
push offset dword_1000B218 ;这个是解密出来的DLL地址
call Load_The_final_dll ;这个CAll分析了好久,最后发现是模拟了系统的PE加载过程,丫的。
add esp, 4
最后这个PE文件只出现在了内存中,然后自己实现了文件的加载,我在里面做了注释,一会能传附件的话,可以看一下。
9.然后就是从上面解密出来的最终的PE文件里Get到一个Run的CALL,然后才进入了主功能。
push offset aRun ; "Run" ;找到这个叫Run的导出函数
mov eax, [ebp+HEAP_0X14_size]
push eax
call GetTheExportFuncAddress
add esp, 8
mov [ebp+var_8], eax
mov esi, esp
mov ecx, dword_1000B200 ; 2710
push ecx
push offset dword_1000B1A0
push offset q704126176_xicp_net
call [ebp+var_8] ; Run ;到这才找到关键的CALL,功能应该在这里面了。
add esp, 0Ch
cmp esi, esp
call CheckEsp
loc_1002A1BD:
mov edx, [ebp+HEAP_0X14_size]
push edx
call CleanUP ; 收尾工作
10.下面再跟到Run-Call里面,它主要做了以下的工作。
SHGetSpecialFolderPathA 得到StartMenu的目录,并CreateDirectoryA一个007的folder
CreateMutexA 创建一个互斥量,看是不是已经启动了程序,启动了就退出
CreateThread 创建2个Thread
WaitForSingleObject 等待第一个线程的退出.
CloseHandle
11.再剩下的就是分析,两个线程了,第二个线程,好像用COM做了些工作,这个不懂,COM还没有去看,根据参数,可以DOWN掉Shell,删除掉自身文件。
12.第一个线程,是主工作线程,SetProcessWindowStation 为winsta0,做些初始化工作。创建一个隐形窗口来偷窥键盘消息,创建一个线程键盘记录的线程,
记录文件到%systemroot%\billlog.dat文件里,方法是用RegisterRawInputDevices注册一个RIDEV_INPUTSINK设备,然后用GetRawInputData来接收键盘消息。
最后是,初始化winsock,获取一些,基本的计算机信息,再创建一个线程,来与远程Client通信,socket这块没有再细分析,感兴趣的朋友,想看就看看吧。
新建文件夹.rar
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法