|
首先开始是一次xor解密,每两个字节进行异或,而且每次异或的操作数随着改变。
00407000 > /EB 16 jmp short 00407018 ; (1)F8
00407002 |5B pop ebx ; (3)
00407003 |33C9 xor ecx, ecx
00407005 |66:B8 2245 mov ax, 4522
00407009 |66:31044B xor word ptr [ebx+ecx*2], ax ; xor解密
0040700D |41 inc ecx
0040700E |40 inc eax
0040700F |66:81F9 6201 cmp cx, 162
00407014 ^|7C F3 jl short 00407009 ; (4)循环,在下面一句F4
00407016 |EB 05 jmp short 0040701D ; (5)再F8一下,跳入解密后的代码
00407018 \E8 E5FFFFFF call 00407002 ; (2)F7
接下来是解密后的实际代码
首先是取得kernel32.dll中的API函数地址并填入后面的数据区。这里使用的是很常用的方法,通过PEB得到kernel32.dll的基址, 然后通过遍历其输出表,把每一函数名称字符串经过一个加密运算,再将结果与输入的值比较,进而找到符合的API函数位置。
0040701D E9 65020000 jmp 00407287 ; (6)解密后代码开头,往下跳到最后
00407022 5F pop edi ; (8)定位自身地址,此时为后面数据区地址
00407023 6A 30 push 30
00407025 59 pop ecx
00407026 64:8B01 mov eax, dword ptr fs:[ecx] ; _PEB
00407029 8B98 A8000000 mov ebx, dword ptr [eax+A8] ; _PEB.OSMijorVersion
0040702F 8B40 0C mov eax, dword ptr [eax+C]
00407032 8B70 1C mov esi, dword ptr [eax+1C]
00407035 AD lods dword ptr [esi]
00407036 8B68 08 mov ebp, dword ptr [eax+8] ; (9)kernel32.dll基址入ebp
00407039 8BF7 mov esi, edi
0040703B 81EC 00020000 sub esp, 200
00407041 85DB test ebx, ebx
00407043 75 07 jnz short 0040704C ; (10)判断是2000的系统还是XP,我这里是XP,直接跳走
00407045 C746 24 C9525E5>mov dword ptr [esi+24], 535E52C9 ; 如是2000系统,则修改下面的数据
0040704C 6A 09 push 9
0040704E 59 pop ecx
0040704F E8 EE010000 call 00407242 ; (11)这里F8就可以了,依照数据区开头的几个加密结果,遍历输出表找函数,把函数地址覆盖掉原来的加密结果
00407054 ^ E2 F9 loopd short 0040704F ; 循环,直接在下面F4
这里填入的API地址依次为(以此时相对esi的偏移,即下面调用时使用的[esi+XX]中的XX为序)
0×00 LoadLibraryA
0×04 GetTempPathA
0×08 DeleteFileA
0×0C CreateProcessInternalA
0×10 ExitThread,
0×14 VirtualProtect
0×18 CreateProcessInternalW
0×1C CompareFileTime
0×20 GetSystemTimeAsFileTime
接着搜索内存得到一个“retn”命令位置(实际上不一定是retn命令),用于后面的anti-debug。
00407056 40 inc eax ; GetSystemTimeAsFileTime
00407057 8038 C3 cmp byte ptr [eax], 0C3
0040705A ^ 75 FA jnz short 00407056 ; (12)循环搜索内存特征,其实是为了借用一个retn代码来改变程序流程反调试
0040705C 8946 30 mov dword ptr [esi+30], eax ; 这里搜索到的是7C801881
再接着遍历kernel32.dll的输入表,再取两个NATIVE API函数的地址。
0040705F 6A 02 push 2
00407061 59 pop ecx
00407062 E8 9E010000 call 00407205 ; 再次搜索输出表得到函数地址
00407067 ^ E2 F9 loopd short 00407062
这里取到的地址是(以此时相对esi的偏移,即下面调用时使用的[esi+XX]中的XX为序)
0×24 ZwCreateProcessEx
0×28 ZwWriteVirtualMemory
| 新云CMS Online.asp页面过滤不严 | 02-26 |
| 对网软网上购物系统的漏洞分析 | 01-09 |
| 测试SQL防注入脚本 | 12-21 |
| Google Xss又出跨站新漏洞 | 11-06 |
| 一次简单的html injection导致的 | 11-06 |
| 风讯、科讯漏洞利用 | 11-01 |
| Adobe pdf reader URI利用方式浅 | 10-23 |
| 超星阅览器的最新0DAY | 10-19 |
| 运用SQL Injection做数据库渗透的 | 09-22 |
| sa-blog 0day | 09-22 |
| HTML注入的一些简单想法 | 09-10 |
| 网站登陆接口的攻与防 | 09-04 |