好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 H夜 于 2019-6-6 18:17 编辑
本节对生成的播放器(LOADER)进行分析。双击LOADER后,直接运行了播放器。前面讲过播放器是写在LOADER尾部,现在双击直接运行了播放器,就说明它读取了播放器并创建了新进程,用到的函数:ReadFile、CreateProcess
同样把生成的播放器加载到OD里,查找下字符串看能发现些什么:
我们看到该LOADER里有这些API,应该是做了提权、注入、创建新进程、进程遍历、生成文件等操作从路径来看,程序是由VS2010生成的。
现在我们直接对ReadFile函数下断,F9运行程序。看它断下来读什么东西
[Asm] 纯文本查看 复制代码 0020EDC0 010434BB /CALL 到 ReadFile 来自 JDPlayer.010434B5
0020EDC4 00000114 |hFile = 00000114 (window)
0020EDC8 044B0000 |Buffer = 044B0000
0020EDCC 01CA4000 |BytesToRead = 1CA4000 (30031872.)
0020EDD0 0020EDE8 |pBytesRead = 0020EDE8
0020EDD4 00000000 \pOverlapped = NULL
0020EDD8 0060AFB0
0020EDDC /0020F0A8
0020EDE0 |010320A3 返回到 JDPlayer.010320A3 来自 JDPlayer.01043494
它在从LOADER自身读取播放器。为了更清晰的分析它的过程,我们在堆栈中对红色右键 反汇编跟随后,找到段首下断,在重新运行播放器
[Asm] 纯文本查看 复制代码 0020EDE0 |010320A3 返回到 JDPlayer.010320A3 来自 JDPlayer.01043494 段首位置下断:
F9运行,F8走下如下图:它在获取系统路径,并和一常量拼接。
[Asm] 纯文本查看 复制代码 01031F30 |. 68 04010000 push 0x104 ; /BufSize = 104 (260.)
01031F35 |. 8D8C24 A00100>lea ecx,dword ptr ss:[esp+0x1A0] ; |
01031F3C |. 51 push ecx ; |Buffer
01031F3D |. FF15 0C541501 call dword ptr ds:[<&KERNEL32.GetSystemD>; \GetSystemDirectoryA
01031F43 |. 68 08DB1701 push JDPlayer.0117DB08 ; \JDPlayer.exe
01031F48 |. 8D9424 A00100>lea edx,dword ptr ss:[esp+0x1A0]
01031F4F |. 68 04010000 push 0x104
01031F54 |. 52 push edx
01031F55 |. E8 BBF60F00 call JDPlayer.01131615
01031F5A |. 83C4 0C add esp,0xC
01031F5D |. 68 03010000 push 0x103
01031F62 |. 8D8424 990000>lea eax,dword ptr ss:[esp+0x99] F8继续往下走,它进行了内存空间申请操作 F8走,下面位置进行了文件偏移:001E6800
[Asm] 纯文本查看 复制代码 00AD208F |. E8 8F140100 call JDPlayer.00AE3523
0111352E |. FF75 10 push [arg.3] ; /Origin
01113531 |. 8BF1 mov esi,ecx ; |
01113533 |. 8B4D 0C mov ecx,[arg.2] ; |
01113536 |. 894D FC mov [local.1],ecx ; |
01113539 |. 8D4D FC lea ecx,[local.1] ; |
0111353C |. 51 push ecx ; |pOffsetHi
0111353D |. 50 push eax ; |OffsetLo
0111353E |. FF76 04 push dword ptr ds:[esi+0x4] ; |hFile
01113541 |. 8945 F8 mov [local.2],eax ; |
01113544 |. FF15 3C532201 call dword ptr ds:[<&KERNEL32.SetFilePoi>; \SetFilePointer 同样采用该偏移我们在文件中支看下是什么内容:
对,正是播放器的二进制代码。
F8继续。。。。。。。。把播放器读出来放在申请的空间里,它在系统目录中创建了一个“JDPlayer.exe“的程序,并且是系统隐藏文件。
创建成功后,把读取的播放器直接成出到文件里。后进行了清尾工作。
F8往下走,它在次获取系统目录,和一个常量字符串拼接,然后又释放了一个DLL文件在系统目录下
[Asm] 纯文本查看 复制代码 00AD2113 |. 68 04010000 push 0x104 ; /BufSize = 104 (260.)
00AD2118 |. 68 F853C400 push JDPlayer.00C453F8 ; |Buffer = JDPlayer.00C453F8
00AD211D |. FF15 0C54BF00 call dword ptr ds:[<&KERNEL32.GetSystemD>; \GetSystemDirectoryA
00AD2123 |. 68 34DBC100 push JDPlayer.00C1DB34 ; \sunflover.dll
00AD2128 |. 68 04010000 push 0x104
00AD212D |. 68 F853C400 push JDPlayer.00C453F8 ; ASCII "C:\Windows\system32\sunflover.dll"
00AD2132 |. E8 DEF40F00 call JDPlayer.00BD1615 ; 拼接
00AD2137 |. 83C4 0C add esp,0xC
00AD213A |. E8 21FBFFFF call JDPlayer.00AD1C60 ;释放DLL
00AD213F |. 85C0 test eax,eax
00AD2141 |. 0F85 89000000 jnz JDPlayer.00AD21D0
00AD2147 |. 50 push eax 释放DLL文件: [Asm] 纯文本查看 复制代码 00AD1C8D |> \53 push ebx
00AD1C8E |. 57 push edi ; /hResource
00AD1C8F |. 56 push esi ; |hModule
00AD1C90 |. C745 FC 00000>mov [local.1],0x0 ; |
00AD1C97 |. FF15 2C54BF00 call dword ptr ds:[<&KERNEL32.LoadResour>; \LoadResource
00AD1C9D |. 50 push eax ; /hResource
00AD1C9E |. FF15 2854BF00 call dword ptr ds:[<&KERNEL32.LockResour>; \LockResource
00AD1CA4 |. 57 push edi ; /hResource
00AD1CA5 |. 56 push esi ; |hModule
00AD1CA6 |. 8BD8 mov ebx,eax ; |
00AD1CA8 |. FF15 2454BF00 call dword ptr ds:[<&KERNEL32.SizeofReso>; \SizeofResource
00AD1CAE |. 6A 00 push 0x0 ; /hTemplateFile = NULL
00AD1CB0 |. 6A 06 push 0x6 ; |Attributes = HIDDEN|SYSTEM
00AD1CB2 |. 6A 02 push 0x2 ; |Mode = CREATE_ALWAYS
00AD1CB4 |. 6A 00 push 0x0 ; |pSecurity = NULL
00AD1CB6 |. 6A 07 push 0x7 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE|4
00AD1CB8 |. 68 00000040 push 0x40000000 ; |Access = GENERIC_WRITE
00AD1CBD |. 68 F853C400 push JDPlayer.00C453F8 ; |FileName = "C:\Windows\system32\sunflover.dll"
00AD1CC2 |. 8BF8 mov edi,eax ; |
00AD1CC4 |. FF15 5452BF00 call dword ptr ds:[<&KERNEL32.CreateFile>; \CreateFileA
00AD1CCA |. 6A 00 push 0x0 ; /pOverlapped = NULL
00AD1CCC |. 8BF0 mov esi,eax ; |
00AD1CCE |. 8D45 FC lea eax,[local.1] ; |
00AD1CD1 |. 50 push eax ; |pBytesWritten
00AD1CD2 |. 57 push edi ; |nBytesToWrite
00AD1CD3 |. 53 push ebx ; |Buffer
00AD1CD4 |. 56 push esi ; |hFile
00AD1CD5 |. FF15 2054BF00 call dword ptr ds:[<&KERNEL32.WriteFile>>; \WriteFile
00AD1CDB |. 5B pop ebx
00AD1CDC |. 83FE FF cmp esi,-0x1
00AD1CDF |.^ 74 A4 je XJDPlayer.00AD1C85
00AD1CE1 |. 56 push esi ; /hObject
00AD1CE2 |. FF15 7454BF00 call dword ptr ds:[<&KERNEL32.CloseHandl>; \CloseHandle
00AD1CE8 |. 5F pop edi
00AD1CE9 |. B8 01000000 mov eax,0x1
00AD1CEE |. 5E pop esi
00AD1CEF |. 8BE5 mov esp,ebp
00AD1CF1 |. 5D pop ebp
F8在走,它开始创建进程了:
[Asm] 纯文本查看 复制代码 0031ED2C 0031EEF0 |ModuleFileName = "C:\Windows\system32\JDPlayer.exe"
0031ED30 00000000 |CommandLine = NULL
0031ED34 00000000 |pProcessSecurity = NULL
0031ED38 00000000 |pThreadSecurity = NULL
0031ED3C 00000000 |InheritHandles = FALSE
0031ED40 00000004 |CreationFlags = CREATE_SUSPENDED
0031ED44 00000000 |pEnvironment = NULL
0031ED48 00000000 |CurrentDir = NULL
0031ED4C 0031EDA0 |pStartupInfo = 0031EDA0
0031ED50 0031ED90 \pProcessInfo = 0031ED90 创建了一个挂起的进程。而后进行了对该进程提权并注入生成的DLL文件,恢复进程。 [Asm] 纯文本查看 复制代码 00AD22A7 |> \8B4C24 44 mov ecx,dword ptr ss:[esp+0x44]
00AD22AB |. 51 push ecx
00AD22AC |. E8 8FF8FFFF call JDPlayer.00AD1B40 ; 提权,注入DLL
00AD22B1 |. 83C4 04 add esp,0x4
00AD22B4 |. 85C0 test eax,eax
00AD22B6 |. 75 0C jnz XJDPlayer.00AD22C4
00AD22B8 |. 50 push eax
00AD22B9 |. 50 push eax
00AD22BA |. 68 7CDBC100 push JDPlayer.00C1DB7C ; DLL注入失败!
00AD22BF |.^ E9 8AFEFFFF jmp JDPlayer.00AD214E
00AD22C4 |> 68 8CDBC100 push JDPlayer.00C1DB8C ; /CreateProcess JDPlayer.exe \r\n
00AD22C9 |. FF15 0054BF00 call dword ptr ds:[<&KERNEL32.OutputDebu>; \OutputDebugStringA
00AD22CF |. 8B5424 40 mov edx,dword ptr ss:[esp+0x40]
00AD22D3 |. 52 push edx ; /hThread
00AD22D4 |. FF15 F453BF00 call dword ptr ds:[<&KERNEL32.ResumeThre>; \ResumeThread
00AD22DA |. 68 ACDBC100 push JDPlayer.00C1DBAC ; /ResumeThread JDPlayer.exe \r\n
00AD22DF |. FF15 0054BF00 call dword ptr ds:[<&KERNEL32.OutputDebu>; \OutputDebugStringA
后面做清理工作。。。。。。。。。。。。。。。。。。。。。。
到此该LOADER的执行就分析完了。
总结:
1、从尾部读取播放器,并生成到系统目录下面。播放器的大小就是LOADER总大小减支偏移量就是视频大小。
2、释放一个DLL文件也生成到系统目录下。
3、创建新进程,挂起后。将生成的DLL文件注入到播放器。恢复进程。
4、完工
继续走,2018SS替换机器码的功能应该是在这生成的DLL里面。具体怎么实现,我们后面在分析该DLL功能。 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|