设置SOD全选项 载入 停在TLS入口

引用:
007CD65E    55              push ebp
007CD65F    8BEC            mov ebp,esp
007CD661    81EC 94000000   sub esp,94
007CD667    57              push edi
007CD668    50              push eax
007CD669    B8 09563412     mov eax,12345609
007CD66E    58              pop eax
007CD66F    C745 B4 DE3A7C0>mov dword ptr ss:[ebp-4C],7C3ADE
007CD676    50              push eax
007CD677    B8 0C563412     mov eax,1234560C
在.text下内存写入断点,中断后取消 停在

引用:
007CC6E6    8801            mov byte ptr ds:[ecx],al
单步到

引用:
007CC6BB    3B4D CC         cmp ecx,dword ptr ss:[ebp-34]
007CC6BE    73 5B           jnb short 007CC71B                       ; 007CC71B
判断是否解码完毕 直接在007CC71B F4一下 再在.text段下内存访问断点

把0063B1C0 当做OEP好了

引用:
0063B1C0    8BFF              mov edi,edi                              ; ntdll.7C930041
0063B1C2    55                push ebp
0063B1C3    8BEC              mov ebp,esp
0063B1C5    E8 1B69EBFF       call 004F1AE5                            ; 004F1AE5
0063B1CA    E8 11000000       call 0063B1E0                            ; 0063B1E0
0063B1CF    5D                pop ebp
0063B1D0    C3                retn
壳模拟了2个DLL KERNEL32.DLL和USER32.DLL
模拟后基址为00D60000和00E80000

随便跟一个FF15看看 找004FF171 这个好了

引用:
007C482B   /74 09           je short 007C4836                        ; 007C4836
007C482D   |8B47 24         mov eax,dword ptr ds:[edi+24]            ; 甲壳试用.004E9741
007C4830   |8800            mov byte ptr ds:[eax],al
007C4832   |C647 23 01      mov byte ptr ds:[edi+23],1
007C4836   \807F 21 01      cmp byte ptr ds:[edi+21],1
007C483A    75 05           jnz short 007C4841                       ; 007C4841
007C483C    E8 0DFBFFFF     call 007C434E                            ; 007C434E
007C4841    807F 22 01      cmp byte ptr ds:[edi+22],1
007C4845    75 05           jnz short 007C484C                       ; 007C484C
007C4847    E8 02FBFFFF     call 007C434E                            ; 007C434E
007C484C    58              pop eax
007C484D    2B07            sub eax,dword ptr ds:[edi]
007C484F    99              cdq
007C4850    B9 06000000     mov ecx,6
007C4855    F7F9            idiv ecx
007C4857    8B4F 04         mov ecx,dword ptr ds:[edi+4]
007C485A    8B0481          mov eax,dword ptr ds:[ecx+eax*4]
007C485D    8B4F 1C         mov ecx,dword ptr ds:[edi+1C]
007C4860    8B57 18         mov edx,dword ptr ds:[edi+18]
007C4863    8B7F 14         mov edi,dword ptr ds:[edi+14]
007C4866    FFE0            jmp eax
在007C4866这里 EAX指向模拟函数或者正常函数 壳中还有部分函数没有加密
写脚本

引用:
var fi
var tmpesp
var oep
var tmp

bphwc
bc

bphws 007C4866,"x"
bphws 0063B1C0 ,"x"
esto
mov fi,004E6000 //.text段VA
mov oep,eip
mov tmpesp,esp

loop:
mov esp,tmpesp
inc fi
find fi,#FF15# 
cmp $RESULT,0
je exit
mov fi,$RESULT
gci fi,DESTINATION
mov tmp,$RESULT
find tmp,#E8#,1//防出错处理
cmp $RESULT,0
je loop
cmp tmp,62C20000 //跟第一个系统DLL基址比较 跳过不加密的
jae loop 
mov eip,fi
esto
cmp eax,62C20000//跟第一个系统DLL基址比较
ja fixnormal
cmp eax,00D60000
jb error //出错处理
cmp eax,00e80000 //USER32.DLL模拟后基址
ja fixuser32

fixkernel32:
sub eax,00D60000
add eax,7c800000 //系统KERNEL32.DLL基址
mov tmp,[fi+2]
mov [tmp],eax
jmp loop

fixuser32:
sub eax,00E80000
add eax,77D10000 //系统USER32.DLL基址
mov tmp,[fi+2]
mov [tmp],eax
jmp loop

fixnormal:
mov tmp,[fi+2]
mov [tmp],eax
jmp loop

error:
msg "RP不好  出错了"
pause


exit:
mov eip,oep
mov esp,tmpesp
bphwc
ret
转悠一圈回来 脚本跑完了 IAT分布比较散 用UIF放到.idata段里 DUMP
IMPORTREC修复 清空TLS,重定位,调试,延迟等目录 修改下区段虚拟大小和物理大小
简单优化下 2.39M 原版6.88
收工
附件为脱壳后主程序
上传的附件 tuotuotuo.rar [附件请到论坛下载:http://bbs.pediy.com/showthread.php?t=96308 ]