讨论
分析了一点点幻影,今天累了,改日继续:0
[ DBPE 2.33 -> Ding Boy ]部分分析
Written By LiNSoN
设置OllyDbg忽略所有异常,载入文件后不分析代码,使用IsDebuggerPresent插件隐藏调试器。
(仅跟踪Windows XP系统部分代码)
004FE000 EB 20 JMP SHORT dbpe.004FE022//--附加代码入口
004FE022 9C PUSHFD
004FE023 55 PUSH EBP
004FE024 57 PUSH EDI
004FE025 56 PUSH ESI
004FE026 52 PUSH EDX
004FE027 51 PUSH ECX
004FE028 53 PUSH EBX
004FE029 9C PUSHFD
//--保存初始状态标志、寄存器
004FE02A E8 00000000 CALL dbpe.004FE02F
004FE02F 5D POP EBP
004FE030 81ED 13694000 SUB EBP,dbpe.00406913
//--将004FE02F处指令的地址减去它的偏移量,附加代码自定位,防止寻址错误
004FE07A 50 PUSH EAX//--保存EAX
004FE097 8B85 D97D4300 MOV EAX,DWORD PTR SS:[EBP+437DD9]
004FE0B4 83F8 00 CMP EAX,0
004FE0BC 0F85 03030000 JNZ dbpe.004FE3C5
//--?
004FE0CC B8 DDF00200 MOV EAX,2F0DD
004FE0D6 83C0 10 ADD EAX,10
//--计算附加代码大小
004FE0F0 6A 04 PUSH 4//--Protect = PAGE_READWRITE
004FE0F2 68 00100000 PUSH 1000//--AllocationType = MEM_COMMIT
004FE0F7 50 PUSH EAX//--Size = 2F0ED (192749)
004FE0F8 6A 00 PUSH 0//--Address = NULL
004FE0FA FF95 F6844300 CALL DWORD PTR SS:[EBP+4384F6]//--VirtualAlloc
004FE12D 8BF0 MOV ESI,EAX
//--申请内存并将得到的内存首地址送入ESI
004FE14B 8D9D A96C4000 LEA EBX,DWORD PTR SS:[EBP+406CA9]
004FE156 50 PUSH EAX//--解码缓冲区
004FE157 53 PUSH EBX//--已压缩数据区
004FE158 E8 D7000000 CALL dbpe.004FE234//--UPX解码函数
004FE162 83C4 08 ADD ESP,8//--平衡堆栈
004FE181 56 PUSH ESI//--保存ESI(004FE1D3处REP指令会影响)
004FE1AF 8BC8 MOV ECX,EAX//--数据长度送入ECX
004FE1B6 8DBD A96C4000 LEA EDI,DWORD PTR SS:[EBP+406CA9]//--目标首地址指向已压缩数据区
004FE1D3 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]//--将UPX解码结果传送回已压缩数据区
004FE1DA 5E POP ESI//--恢复ESI
004FE1E5 68 00800000 PUSH 8000//--FreeType = MEM_RELEASE
004FE1EA 6A 00 PUSH 0//--Size = 0
004FE1EC 56 PUSH ESI//--Address = 00370000
004FE1ED FF95 F2844300 CALL DWORD PTR SS:[EBP+4384F2]//--VirtualFree
//--释放申请的缓冲区
004FE225 E9 9B010000 JMP dbpe.004FE3C5
004FE3DC 58 POP EAX//--恢复004FE07A处保存的EAX
004FE3E2 EB 43 JMP SHORT dbpe.004FE427
004FE427 60 PUSHAD
004FE428 83BD F06C4000 CMP DWORD PTR SS:[EBP+406CF0],0
004FE42F 75 00 JNZ SHORT dbpe.004FE431//--无聊指令
004FE431 61 POPAD
004FE47B 8985 DD7D4300 MOV DWORD PTR SS:[EBP+437DDD],EAX
//--?
004FE4B8 BE 447D4300 MOV ESI,dbpe.00437D44
004FE4D4 03F5 ADD ESI,EBP//--ESI指向一个pVersionInformation结构
004FE4DB C706 94000000 MOV DWORD PTR DS:[ESI],94//--Sizeof pVersionInformation
004FE50E 56 PUSH ESI//--pVersionInformation = dbpe.0052F460
004FE50F FF95 FA844300 CALL DWORD PTR SS:[EBP+4384FA]//--GetVersionExA
//--取操作系统版本
004FE52C 837E 10 02 CMP DWORD PTR DS:[ESI+10],2//--Platform_Windows_NT_2K_XP
004FE530 75 13 JNZ SHORT dbpe.004FE545//--去除花指令后回跳转到04FE54A处
004FE537 C685 D87D4300 01 MOV BYTE PTR SS:[EBP+437DD8],1//--设置Windows NT/2K/XP系列标志
004FE543 EB 11 JMP SHORT dbpe.004FE556//--跳出IF...ELSE结构
004FE54A C685 D87D4300 00 MOV BYTE PTR SS:[EBP+437DD8],0//--取消Windows NT/2K/XP系列标志
004FE577 8D85 F56C4000 LEA EAX,DWORD PTR SS:[EBP+406CF5]
004FE5B5 80BD D87D4300 0 CMP BYTE PTR SS:[EBP+437DD8],1
004FE5BC 0F85 F74A0000 JNZ dbpe.005030B9
