【成长快乐】一个菜鸟是如何分析这个病毒的
先声明,本人菜鸟一枚,今天刚入吾爱,接触逆向这一块只有很短的时间,且也不熟悉windows编程,但希望仅仅以此贴为代表,以后会以【成长快乐】为标题,跟和我一样初入逆向这条道的朋友们分享我的经验,大家一起交流,一起成长。大牛们觉得无聊可以直接无视我们,当然,要是能给我们这些初学者一些建议那就最好不过了。正题开始。
样本信息:
Borland Delphi v6.0 - v7.0
Size:1.11 MB
MD5: 06D9AE18F911FFCBE9A57A4565E8A8F6
不知道大家有没有这样的感觉,作为我这样一个初学者,拿到一个样本往往无从下手,往往查完壳之后就不知道怎么开始入手了。我的经验是(当然我这属于菜鸟级别的经验,大牛莫笑),先看看字符串,看看导入表,大体的猜猜这个程序是干什么的,这样非常利于之后的详细分析。于是我找到了以下敏感字符:
AsciiHz offset:000b1658==> 订单详情
AsciiHz offset:000b166c==>订单详情 加载订单
AsciiHz offset:000b1688==>订单详情
AsciiHz offset:000b16a8==>J-getPrice
AsciiHz offset:000b16cc==>您已成功付款
AsciiHz offset:000b16e4==>已收到您的付款
AsciiHz offset:000b1710==>转账成功
AsciiHz offset:000b1724==>转账拦截成功
AsciiHz offset:000b173c==>pay-record
AsciiHz offset:000b1750==>class=ft-orange
AsciiHz offset:000b1768==>ft-orange
AsciiHz offset:000b178c==>元可选择其他
AsciiHz offset:000b17a4==>剩余可选择其他
AsciiHz offset:000b17bc==>pay-total
AsciiHz offset:000b17d0==>LABEL
AsciiHz offset:000b17f0==>J-bank-amount
AsciiHz offset:000b1808==>https://cashier.alipay.com/standard/gateway/ebankPay.htm
AsciiHz offset:000b184c==>银行
AsciiHz offset:000b186c==>余额网银同时支付
AsciiHz offset:000b1888==>使用即时到账
AsciiHz offset:000b18a0==>转账到银行卡
AsciiHz offset:000b18b8==>orderDetail-base
AsciiHz offset:000b18e0==>刷新</A>
AsciiHz offset:000b1904==>网银支付中
看到这里便猜测到这可能是一个与网银相关的木马,接下来我又看到了:
AsciiHz offset:000b4318==>7A666662283D3D62736B3C686675737F773C717D7F3D63747B7E7E74607D7F70737C793C627A62
AsciiHz offset:000b4380==>64737E7B76736677717D76774D747B7E7E70737C79
AsciiHz offset:000b43c4==>61777E4D78604D7B7C626766
AsciiHz offset:000b43e8==>7371717D677C664D747B7E7E70737C79
AsciiHz offset:000b4444==>ACCCDAD9C0FEA1B13F2A
AsciiHz offset:000b44f8==>D5F9D6E8DDDADAA5DADDC0C6DDD0A1F6C4A7C2D7DDB0
AsciiHz offset:000b4530==>ACCCDAD9DEF3D8AC50
AsciiHz offset:000b45a4==>bank
AsciiHz offset:000b45b4==>70737C79
AsciiHz offset:000b45c8==>ACCCDAD9C0FEA1B13F27
AsciiHz offset:000b45e8==>7C776A664D70667C
一大堆奇怪的字符串,猜测肯定是一些经过加密了的敏感的字符串,分析的时候一定要留意哪些地方调用了这些,是不是在用之前都call了一个解密的函数。
之后我又看到了很多有关IE的字符串,包括还有注册表,心里默默急着,等会分析的时候看看。
之后又看了看导入表,由于对windows编程不熟悉,只能知道其中部分API是干嘛的,其余都是看名字猜的,有对文件操作的,还有一些对窗口操作的,没办法了,只能遇到了现查。-_-!
接下来我在虚拟机里运行了这个程序,因为有时候看行为能帮你省不少事,但是用MD看了下发现没什么反应,心想会不会是有反虚拟机的玩意,于是我又查了一篇文章http://bbs.pediy.com/showthread.php?t=119969 用ida看了下应该是没有的,猜测应该是在一定条件下才能触发行为。
前戏做的差不多了,ida来看看:
打开IDA就发现一个问题,我从未学过delphi,IDA打开后一堆@system的东西让我感到很茫然,于是我去查了资料,查到了这篇文章http://bbs.pediy.com/showthread.php?p=957532 看过之后对这个是有了一定了了解,硬着头皮继续
结构很复杂,于是我准备先从字符串入手,字符串如果都解开了的话,后面光看字符串都能知道它是干嘛的了。
对着一个奇怪的字符串,我按下了Ctrl+X:
CODE:004B6880 lea edx,
CODE:004B6886 mov eax, offset aC3fbc4b6d0f9_1 ; "C3FBC4B6D0F9A6FFDCE1B1BE"
CODE:004B688B call decode
CODE:004B6890 mov eax,
CODE:004B6896 push eax
CODE:004B6897 push offset _str____________4.Text
CODE:004B689C lea edx,
CODE:004B68A2 mov eax, offset _str_C5B0A0F3A1DBABB.Text
CODE:004B68A7 call decode
CODE:004B68AC mov ecx,
CODE:004B68B2 mov edx, 1Eh
CODE:004B68B7 mov eax,
CODE:004B68BA call sub_4ABFAC
CODE:004B68BF test eax, eax
CODE:004B68C1 jnz short loc_4B6903
CODE:004B68C3 lea edx,
CODE:004B68C9 mov eax, offset _str_A1BED8A34A4A.Text
CODE:004B68CE call decode
CODE:004B68D3 mov eax,
CODE:004B68D9 call sub_4A9C08
CODE:004B68DE mov eax, offset dword_4D0B88
CODE:004B68E3 call @System@@LStrClr$qqrpv ; System::__linkproc__ LStrClr(void *)
CODE:004B68E8 push 40030h ; uType
CODE:004B68ED push offset asc_4B6DFC ; "来自?
CODE:004B68F2 push offset asc_4B6E0C ; "?
CODE:004B68F7 push 0 ; hWnd
CODE:004B68F9 call MessageBoxA_0
CODE:004B68FE jmp loc_4B6331
这里我已经标注了decode,大家在做的时候最好也是分析完了一定要标注一下,否则跳出这个函数了就忘了,因为看到几乎所有的这种奇葩字符串后面要call的时候都调用了这个函数,确定为解密代码,进入后是一大堆的代码。实在是不想看,但是没有办法,不一句一句的看永远也成长不了,于是我硬着头皮读了下去,还是感觉很吃力,于是我用了笨办法,动态调试。边按F8边观察各个寄存器的状况,遇到不会的指令就现查。
以下是我做的标注,各位勿喷。。-_-!
丫的,分析了好久,才发现它其实干的事情很简单,就是把字符串每次取2个字符,然后把它转换为整数,再对12做xor运算,结果再转换为字符,然后把它们再strcat起来。
于是我写了对应的C程序,很久以前学习的C语言,而且学的很渣,语法什么的早已忘记,而且本人的编程能力实在是渣的不行,以下代码几乎都是先查语法写的,各位勿喷-_-!
#include<stdio.h>
#include<string.h>
void decode(char* input)
{
int length = strlen(input);
int i;
char tmp;
int number;
for(i=1;i<length;i++){
int index = 2*i -2 ;
if(index<length){
tmp = input;
tmp = input;
tmp = '\0';
sscanf(tmp, "%x",&number);
number = number ^ 0x12;
printf("%c",number);
}
}
int main(int argc,char *argv[])
{
char* result;
printf("%s",argv);
printf("\n");
result = decode(argv);
return 0;
}
由于本人不会idc脚本,所以还是用笨办法,自己一个一个的手动标注,有了标注就好看多了。打开一看:
有好多银行的url.接着看:
CODE:004CBC10 push 0FFh ; nMaxCount
CODE:004CBC15 lea eax,
CODE:004CBC1B push eax ; lpClassName
CODE:004CBC1C push esi ; hWnd
CODE:004CBC1D call GetClassNameA
CODE:004CBC22 push 0FFh ; nMaxCount
CODE:004CBC27 lea eax,
CODE:004CBC2D push eax ; lpString
CODE:004CBC2E push esi ; hWnd
CODE:004CBC2F call GetWindowTextA
CODE:004CBC34 lea edx,
CODE:004CBC37 mov eax, offset _str_46567756775F737.Text ; TDeDeMainForm
CODE:004CBC3C call decode
CODE:004CBC41 lea edx,
CODE:004CBC44 mov eax, offset _str_41626B3939.Text ; Spy++
CODE:004CBC49 call decode
CODE:004CBCB4 loc_4CBCB4: ; CODE XREF: sub_4CBBC0+CAj
CODE:004CBCB4 push 0 ; bEnable
CODE:004CBCB6 push esi ; hWnd
CODE:004CBCB7 call EnableWindow
CODE:004CBCBC push esi ; hWnd
CODE:004CBCBD call CloseWindow
CODE:004CBCC2 push 0 ; uCmdShow
CODE:004CBCC4 push offset CmdLine; "shutdown -r -t 2"
CODE:004CBCC9 call WinExec
CODE:004CBCCE push 3E8h ; dwMilliseconds
CODE:004CBCD3 call Sleep_0
CODE:004CBCD8 mov ds:byte_4D0C10, 1
CODE:004CBCDF lea edx,
CODE:004CBCE5 mov eax, offset _str_71284E707D7D663.Text ; c:\boot.ini
CODE:004CBCEA call decode
CODE:004CBCEF mov eax,
CODE:004CBCF5 call @Sysutils@DeleteFile$qqrx17System@AnsiString ; Sysutils::DeleteFile(System::AnsiString
发现窗口有TDeDeMainForm SPY++就让你重启,还删你boot.ini.防分析的。接下来:
CODE:004CBF92 mov eax, offset _str_537E7B7B7F41737.Text ; AliimSafe.exe
CODE:004CBF97 call decode
CODE:004CBF9C mov eax,
CODE:004CBF9F call callTerminateProcess
CODE:004CBFA4 cmp ds:byte_4D0B80, 0
CODE:004CBFAB jnz short loc_4CBFEC
CODE:004CBFAD lea edx,
CODE:004CBFB0 mov eax, offset _str_434350607D65617.Text ; QQBrowser.exe
CODE:004CBFB5 call decode
CODE:004CBFBA mov eax,
CODE:004CBFBD call callTerminateProcess
CODE:004CBFC2 lea edx,
CODE:004CBFC5 mov eax, offset _str_212422717A607D7.Text ; 360chrome.exe
CODE:004CBFCA call decode
CODE:004CBFCF mov eax,
CODE:004CBFD2 call callTerminateProcess
CODE:004CBFD7 lea edx,
CODE:004CBFDA mov eax, offset _str_7E7B7770737D3C7.Text ; liebao.exe
CODE:004CBFDF call decode
CODE:004CBFE4 mov eax,
CODE:004CBFE7 call callTerminateProcess
杀掉这些进城要干嘛?继续分析:
CODE:004AAB09 mov eax, offset _str_C__WINDOWS_syst.Text ; C:\WINDOWS\system32\ProcessProtection.dll
CODE:004AAB0E call @Sysutils@FileExists$qqrx17System@AnsiString ; Sysutils::FileExists(System::AnsiString)
CODE:004AAB13 test al, al
CODE:004AAB15 jz short loc_4AAB31
CODE:004AAB17 push 1 ; nShowCmd
CODE:004AAB19 push 0 ; lpDirectory
CODE:004AAB1B push offset aCWindowsSyst_0 ; C:\WINDOWS\system32\ProcessProtection.dll /u /s
CODE:004AAB20 push offset File ; "Regsvr32"
CODE:004AAB25 push offset Operation ; Open
CODE:004AAB2A push 0 ; hwnd
CODE:004AAB2C call ShellExecuteA
发现有文件C:\WINDOWS\system32\ProcessProtection.dll直接Regsvr32 C:\WINDOWS\system32\ProcessProtection.dll /u /s 查了下/u是卸载 /s是不带提示隐藏的操作 这玩意是中国银行的一个插件,看名字是保护你使用网银的。继续分析:
CODE:004AB519 push 0FFh ; nMaxCount
CODE:004AB51E lea eax,
CODE:004AB524 push eax ; lpClassName
CODE:004AB525 push edi ; hWnd
CODE:004AB526 call GetClassNameA
CODE:004AB52B test eax, eax
CODE:004AB52D jle loc_4AB5BF
CODE:004AB533 lea eax,
CODE:004AB539 lea edx,
CODE:004AB53F mov ecx, 100h
CODE:004AB544 call unknown_libname_86 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:004AB549 mov eax,
CODE:004AB54F mov edx, offset _str_Internet_Explor_3.Text
CODE:004AB554 call @System@@LStrCmp$qqrv ; System::__linkproc__ LStrCmp(void)
CODE:004AB559 jnz short loc_4AB5BF
CODE:004AB55B push 0FFh ; nMaxCount
CODE:004AB560 lea eax,
CODE:004AB566 push eax ; lpString
CODE:004AB567 push edi ; hWnd
CODE:004AB568 call GetWindowTextA
它又在看用户是不是在使用IE了,之前杀掉了那些其他浏览器的进程,看来是这玩意只写了针对IE的,接着看:
CODE:004AA065 push offset aOleacc_dll ; "Oleacc.dll"
CODE:004AA06A call LoadLibraryA
CODE:004AA06F mov , eax
CODE:004AA072 push offset aObjectfromlres ; "ObjectFromLresult"
CODE:004AA077 mov eax,
CODE:004AA07A push eax ; hModule
CODE:004AA07B call GetProcAddress_0
CODE:004AA080 mov esi, eax
CODE:004AA082 mov ebx, esi
CODE:004AA084 test esi, esi
CODE:004AA086 jz loc_4AA149
CODE:004AA08C xor edx, edx
CODE:004AA08E push ebp
CODE:004AA08F push offset loc_4AA142
CODE:004AA094 push dword ptr fs:
CODE:004AA097 mov fs:, esp
CODE:004AA09A push offset aWm_html_getobj ; "WM_HTML_GETOBJECT"
CODE:004AA09F call RegisterWindowMessageA
CODE:004AA0A4 lea edx,
CODE:004AA0A7 push edx ; lpdwResult
CODE:004AA0A8 push 3E8h ; uTimeout
CODE:004AA0AD push 2 ; fuFlags
CODE:004AA0AF push 0 ; lParam
CODE:004AA0B1 push 0 ; wParam
CODE:004AA0B3 push eax ; Msg
CODE:004AA0B4 push edi ; hWnd
CODE:004AA0B5 call SendMessageTimeoutA
这点着实不知道干嘛的,从名字也猜不出来,查了下资料。它是要调用系统动态库Oleacc.dll,获取导出函数ObjectFromLresult, 注册WM_HTML_GETOBJECT消息,为了获得HTMLDocument2接口。还是不知道要干嘛,继续查,得知有这玩意就可以实现修改用户网页内容。而前面已经发现有大量网银页面的链接,猜测它可能是判断到正在上那些网站就会修改页面的内容来搞钱。继续分析:
发现其会对不同的网站做不同的处理,其中一个:
对弹出来的窗口发消息,或隐藏,或诱导你点u盾。
发现工作量实在是有点大,而且本人技术是在太菜,之后还有很多内容正在分析,因此还没发出来大家勿喷-_-!
如果还有像我这样的新手喜欢的话我会继续直播,跟大家一起进步。【成长快乐】 :)
我用的是火眼文件检测!! 比我厉害多了。。。 这还是菜鸟吗》》》 占楼,那份走起! 小呀小菜鸟 发表于 2014-9-13 22:11
比我厉害多了。。。
一起加油一起成长: ) 很明显是大神嘛 旋冰 发表于 2014-9-13 22:36
我用的是火眼文件检测!!
这个我没用过唉 菜鸟①号 发表于 2014-9-13 22:43
这还是菜鸟吗》》》
真的是菜鸟 才学习这些东西不到3个月的时间 2217936322 发表于 2014-9-13 23:02
占楼,那份走起!
感谢您的支持 {:1_918:}