好友
阅读权限40
听众
最后登录1970-1-1
|
楼主|
小生我怕怕
发表于 2009-1-23 21:10
当我们拿到一个程序时,我们可以借助程序的支持库来判断程序是什么语言,由为明显的是VB的运行库和易语言的运行库,还有MFC的支持库当我们载入OD运行起程序,ait+e可以明显看出是
什么语言的支持库,从而判断出我们程序的编写语言,现在我们就来简单的熟悉下VB的入口特征熟悉VB语言入口特征的朋友都应该知道VB的入口是很容易发现的,下面我简单的找个VB的入口
来进行一个简单的比对
00401166 - FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>] ; MSVBVM60.ThunRTMain
0040116C > 68 147C4000 PUSH PACKME.00407C14 //很明显我们可以看得出VB上面有一堆JMP
00401171 E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100> //接着就是一个PUSH,一个CALL
00401176 0000 ADD BYTE PTR DS:[EAX],AL //而CALL的就是我们PUSH上面的一个JMP
00401178 0000 ADD BYTE PTR DS:[EAX],AL //好啦,现在我们开始正式脱壳,载入需脱壳文件
0040117A 0000 ADD BYTE PTR DS:[EAX],AL
0040117C 3000 XOR BYTE PTR DS:[EAX],AL
━━━━━━━━━━━━━━━━━━━━━━━━━━
00412DEC > 60 pushad //入口伪装了我们的UPX的入口
00412DED BE B4264000 mov esi,TrashReg.004026B4 //我们用Die64可以发现是C++写的
00412DF2 8DBE EBAFFFFF lea edi,dword ptr ds:[esi+FFFFAFEB] //简单的可以发现我们的程序还有不少伪装
00412DF8 57 push edi //下断bp VirtualAlloc
00412DF9 83CD FF or ebp,FFFFFFFF //shift+f9运行第九次时发现程序缓冲有些大
00412DFC EB 10 jmp short TrashReg.00412E0E
━━━━━━━━堆栈显示━━━━━━━━━━━━
0012FBE0 73444CBA /CALL 到 VirtualAlloc 来自 MSVBVM60.73444CB8 //当堆栈显示为这样时,我们可以ait+f9返回
0012FBE4 00000000 |Address = NULL
0012FBE8 00010000 |Size = 10000 (65536.)
0012FBEC 00002000 |AllocationType = MEM_RESERVE
0012FBF0 00000004 \Protect = PAGE_READWRITE
0012FBF4 7354EC40 MSVBVM60.7354EC40
━━━━━━━━━━━━━━━━━━━━━━━━━━
73653803 8BFF mov edi,edi //返回后我们还是停在了我们的系统领空
73653805 55 push ebp //ait+m打开我们的内存镜像
73653806 8BEC mov ebp,esp
73653808 E8 D90CFFFF call 736444E6
7365380D 85C0 test eax,eax
7365380F 74 11 je short 73653822
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 23 //在此F2下断,shift+f9运行
地址=00401000
大小=0006C000 (442368.)
物主=TrashReg 00400000
区段=.000000
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
734438E1 85C0 test eax,eax //此时注意我们的堆栈窗口
734438E3 8945 FC mov dword ptr ss:[ebp-4],eax
734438E6 7C 74 jl short MSVBVM60.7344395C
734438E8 F647 3C 01 test byte ptr ds:[edi+3C],1
734438EC 6A 02 push 2
734438EE 58 pop eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0012FEDC 00404BBC ASCII "VB5!6&*" //可以看到我们的push的地址
0012FEE0 7354E470 MSVBVM60.7354E470 //Ctrl+g查找00404bbc
0012FEE4 014D1E94
0012FEE8 00000000
0012FEEC /0012FF0C
━━━━━━━━━━━━━━━━━━━━━━━━━━
00404BBC 56 push esi //我们到了这里,右键Ctrl+b查找二进制FF25
00404BBD 42 inc edx
00404BBE 35 2136262A xor eax,2A263621
00404BC3 0000 add byte ptr ds:[eax],al
00404BC5 0000 add byte ptr ds:[eax],al
00404BC7 0000 add byte ptr ds:[eax],al
00404BC9 0000 add byte ptr ds:[eax],al
━━━━━━━━━━━━━━━━━━━━━━━━━━
004042DF 00FF add bh,bh //到了这里,我们向下拉到下面的第一个JMP
004042E1 25 68114000 and eax,401168
004042E6 - FF25 08124000 jmp dword ptr ds:[401208] ; MSVBVM60.__vbaExceptHandler
004042EC - FF25 38124000 jmp dword ptr ds:[401238] ; MSVBVM60.__vbaFPException
004042F2 - FF25 10114000 jmp dword ptr ds:[401110] ; MSVBVM60._adj_fdiv_m16i
004042F8 - FF25 D8104000 jmp dword ptr ds:[4010D8] ; MSVBVM60._adj_fdiv_m32
004042FE - FF25 A8124000 jmp dword ptr ds:[4012A8] ; MSVBVM60._adj_fdiv_m32i
━━━━━━━━━━━━━━━━━━━━━━━━━━
00404844 - FF25 04124000 jmp dword ptr ds:[401204] ; MSVBVM60.EVENT_SINK_QueryInterface
0040484A - FF25 7C114000 jmp dword ptr ds:[40117C] ; MSVBVM60.EVENT_SINK_AddRef
00404850 - FF25 EC114000 jmp dword ptr ds:[4011EC] ; MSVBVM60.EVENT_SINK_Release
00404856 - FF25 E4124000 jmp dword ptr ds:[4012E4] ; MSVBVM60.ThunRTMain
0040485C BC C094692B mov esp,2B6994C0 //这里就是我们的push
00404861 95 xchg eax,ebp //这里就是我们的CALL
00404862 F4 hlt //而我们的PUSH可以在堆栈里看到
00404863 E8 03610000 call TrashReg.0040A96B
00404868 0000 add byte ptr ds:[eax],al
0040486A 0000 add byte ptr ds:[eax],al
━━━━━━━━━━━━━━━━━━━━━━━━━━
0012FEDC 00404BBC ASCII "VB5!6&*" //这里就是我们的push
0012FEE0 7354E470 MSVBVM60.7354E470 //好补全我们的OEP吧
0012FEE4 014D1E94
0012FEE8 00000000
━━━━━━━━━━━━━━━━━━━━━━━━━━
00404850 - FF25 EC114000 jmp dword ptr ds:[4011EC] ; MSVBVM60.EVENT_SINK_Release
00404856 - FF25 E4124000 jmp dword ptr ds:[4012E4] ; MSVBVM60.ThunRTMain
0040485C 68 BC4B4000 push TrashReg.00404BBC ; ASCII "VB5!6&*"
00404861 E8 F0FFFFFF call TrashReg.00404856 ; jmp to MSVBVM60.ThunRTMain
00404866 90 nop //这里是补好的OEP
00404867 90 nop //CALL的地址是00404856,也就是最后的那个JMP
00404868 0000 add byte ptr ds:[eax],al //好记下我们需要修复的地址,在最后的JMP处下硬件访问断点
0040486A 0000 add byte ptr ds:[eax],al //点在00404856处,右键断点---设置硬件访问断点,
0040486C 3000 xor byte ptr ds:[eax],al //从新载入程序,shift+f9运行程序
0040486E 0000 add byte ptr ds:[eax],al
━━━━━━━━━━━━━━━━━━━━━━━━━━
00404856 - FF25 E4124000 jmp dword ptr ds:[4012E4] //程序停在这里,在下面的PUSH上,右键新建EIP
0040485C 68 BC4B4000 push TrashReg.00404BBC ; ASCII "VB5!6&*"
00404861 E8 F0FFFFFF call TrashReg.00404856 //补好后运行我们的LordPE把程序DUMP,当然也可以直接用importRCE去DUMP
00404866 90 nop //如果是LordPE去DUMP的,就还需要importRCE修复下
00404867 90 nop //到此脱壳结束
00404868 0000 add byte ptr ds:[eax],al
0040486A 0000 add byte ptr ds:[eax],al
[ 本帖最后由 小生我怕怕 于 2009-1-27 14:09 编辑 ] |
|