首页
社区
课程
招聘
[分享]exeshield 3.8脱壳
发表于: 2006-8-16 21:59 12426

[分享]exeshield 3.8脱壳

2006-8-16 21:59
12426
最近好象没出什么新壳来玩,没事做,于是下了个exeshield 3.8版本
(下载地址:http://www.onlinedown.net/soft/24640.htm)的看了看,
在论坛里只找到几篇英文教程(http://bbs.pediy.com/showthread.php?s=&threadid=13915&highlight=exeshield)
对于英文不太好的朋友,我就写写简略脱壳过程:

exeshield加壳的程序其实是一种双进程壳(主程序例外,是单进程,和压缩壳差不太多), 它首先还原一部分代码,并将代码写入当前目录下的一

个.tmp文件(tmp文件有一段代码没有解出来),然后创建调试进程,并还原没解密的代码

0.首先你要有个exeshield加了壳的程序,我是给记事本加了个壳(选项全为默认)

1.忽略所有异常

2.下断:bp CreateProcessA,shift+f9 通过异常,如果出现试用对话框,点击try,直到在createprocessa中断,取消断点,这时查看堆栈:
0186E188   0046FFD1  /CALL to CreateProcessA from NOTEPAD.0046FFCC
0186E18C   00000000  |ModuleFileName = NULL
0186E190   013691F8  |CommandLine = "C:\Program Files\ExeShield\xshld5878.tmp "
0186E194   00000000  |pProcessSecurity = NULL
0186E198   00000000  |pThreadSecurity = NULL
0186E19C   00000000  |InheritHandles = FALSE
0186E1A0   00000002  |CreationFlags = DEBUG_ONLY_THIS_PROCESS
0186E1A4   00000000  |pEnvironment = NULL
0186E1A8   00000000  |CurrentDir = NULL
0186E1AC   018CFF34  |pStartupInfo = 018CFF34
0186E1B0   018CFF24  \pProcessInfo = 018CFF24

看到那个.tmp文件没有,把它复制出来,将文件名改为xshld5878.exe,图标就出来了,而且OEP也是对的,不要着急去运行,因为这个程序代码段中

大部分代码都被"偷"了,这时的程序是不能运行的。

3.下断:bp VirtualProtectEx,f9运行,断下来取消断点,查看堆栈
0186E19C   004701D6  /CALL to VirtualProtectEx from NOTEPAD.004701D1
0186E1A0   000000F8  |hProcess = 000000F8 (window)
0186E1A4   01001000  |Address = 01001000
0186E1A8   0000776A  |Size = 776A (30570.)
0186E1AC   00000040  |NewProtect = PAGE_EXECUTE_READWRITE
0186E1B0   018CFF78  \pOldProtect = 018CFF78

记下address和size两行,我们知道了被偷代码的虚拟地址:1001000,和大小:776A (重要)

4.下断:bp WriteProcessMemory,f9运行,断下来取消断点,查看堆栈
0186E19C   0047024B  /CALL to WriteProcessMemory from NOTEPAD.00470246
0186E1A0   000000F8  |hProcess = 000000F8 (window)
0186E1A4   01001000  |Address = 1001000
0186E1A8   0047CB00  |Buffer = NOTEPAD.0047CB00
0186E1AC   0000776A  |BytesToWrite = 776A (30570.)
0186E1B0   018CFF84  \pBytesWritten = 018CFF84

记下buffer那一行,那就是最终解密出的代码的虚拟地址:47CB00,我们剩下来要做的就是将解密出的代码还原到.tmp文件中去.

在OD中选取47CB00到48426A(48426A=47CB00+776A)的代码,右键选择二进制-二进制复制,复制完,这个OD就可以关掉了。
用OD打开xshld5878.exe(别告诉我不知道这个文件怎么来的),选取1001000 -100876A(100876A=1001000+776A)这一段,
右键选择二进制-二进制粘贴,粘贴完,就可以dump了,dump下的程序不用修复输入表,直接可以运行。

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ToT
2
学生
2006-8-17 00:01
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
新的出了破解版?

2006-8-17 17:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
大部分代码都被"偷"了,这时的程序是不能运行的。
2006-8-18 08:30
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
exeshield 3.8脱壳脚本
#log
sto
sto
var a
mov a,esp
bphws a,"r"
lop:
esto
var b
mov b,eip
mov b,
and b,FFFF
cmp b,E0FF  //jmp eax
jne lop
bphwc a
sto

msgyn "是否主程序"  //主程序要进行特殊函数处理,exitprocess,getcommandlinea/w
cmp $RESULT,0
je lot
sto
sto
var a
mov a,esp
bphws a,"r"
var cb
gmi eip,CODEBASE
cmp $RESULT,0
je err
mov cb,$RESULT
lis:
find cb,#85C075028BC2# //test eax,eax;jnz ;mov eax,edx
cmp $RESULT,0
je hoho
mov cb,$RESULT
add cb,2
mov [cb],#9090# //把所有符合条件的jnz都nop掉
log cb
jmp lis
hoho:
gpa "GetProcAddress","kernel32.dll"
cmp $RESULT,0
je err
bp $RESULT  //下getprocaddress断点
esto
bc $RESULT
rtu
rtr
sto
mov [eip],#EB# //getprocaddress单独处理,绕开加密
esto
bphwc a
sto
sto
sto
lot:
var c
mov c,eip
mov c,[c]
and c,FF
cmp c,55
je out
sto
sto
var a
mov a,esp
bphws a,"r"
esto
bphwc a
sto
sto
sto
jmp lot

out:
msg "如果是主程序则脱壳完毕"
mov a,eip
sub a,6000
find a,#85C0762C#  //anti magic jmp(findwind)
cmp $RESULT,0
je end
add $RESULT,2
mov [$RESULT],#EB#
bp $RESULT
esto
bc eip

gpa "CreateProcessA","kernel32.dll"
cmp $RESULT,0
je err
bp $RESULT
esto
msg "注意堆栈中这个.tmp文件复制出来"
bc $RESULT

gpa "VirtualProtectEx","kernel32.dll"
cmp $RESULT,0
je err
bp $RESULT
los:
esto
var a
mov a,esp
add a,4
mov a,[a]
cmp a,FFFFFFFF
je los
bc $RESULT
var target
var size
mov a,esp
add a,8
mov target,[a]
add a,4
mov size,[a]
log target
log size
gpa "WriteProcessMemory","kernel32.dll"
cmp $RESULT,0
je err
bp $RESULT
esto
bc $RESULT
mov a,esp
add a,C
mov a,[a]
//dm a,size,"c:\pase.bin"  //dm有BUG
var start
mov start,a
log start
var end
mov end,a
add end,size
log end

msg "自己查看日志,将指定区域复制到.tmp文件中"
msg "将start到end的那段内存复制到.tmp文件中虚拟地址从target开始的区域中"

end:

ret
err:
msg "Error"
ret
2006-8-18 09:43
0
雪    币: 1242
活跃值: (696)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你好,我回来学习的时候发现Address = 01001000这里我没有显示地址,而是程序名xxx.moduleentrypoint,,小白一个,想请教这是怎么回事
2022-5-17 11:44
0
游客
登录 | 注册 方可回帖
返回
//