【文章标题】: 对Themida1.9.1.0的通法破解一文的补充修正
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
前几天我的《Themida 1.9.1.0的通法破解》一文的脚本对VC++程序的解密存在一些问题(对汇编程序正常)。主要是解密后,函数在程序中的地址张冠李戴,脱壳后程序不能运行。当时实验的主程序是针对汇编的,附带实验了VC++。由于VC++动辄几百个函数,多则上千不可能一一核对其地址,故疏漏了一个大问题。
原来Themida v1.9.1.0加密程序时,对函数的“序列号装载”或“函数名装载”是分别在不同的地址中显示其真实地址的(与1.8.5.5版不同),而我的脚本1搜索到2个(Addr_1)地址,因汇编程序无序列号装载,另一个Addr_1根本就不调用,故删除了,这就是问题所在。
一、Themida v1.9.1.0通法破解的再修定
不好意思的一而再再而三的修定,Themida的反跟踪能力比想象中的强,一个不起眼的“单步异常”常常让你的断点乱套,你不知道他什么时候跳出单步SEH,为了通用性只好加强防范了。
这次给出的“脚本1(断点侦测)”(兼容版)在与单步中断周旋上作了较大改进,同时也摘除了相应代码段的“代码扫描”,让侦测能够进行到底。改进后,用于在我收集的Themida加密软件中还没有出现“搜索失败”的提示。(1.8.0.0以前的版本没有试验)
再就是发现:mov eax,ecx 的汇编代码既可以是“01 C8”,也可以是“03 C1”,所以使一些程序失败,现在增加了对03C1 的搜索。
修改后的脚本如下:
-------------------------------
//Themida v1.8.0.0--1.9.1.0兼容的断点设置脚本
data:
var memory
var csize
var tmp
var temp
var tmpbp1
var tmpbp2
var mem
var mem0
var mem1
var mem2
var mem3
var mem4
var mem5
var Str0
var Str3
var Str4
var Str5
var Str1
var Str2
var Str11
star:
gmi eip,CODEBASE
mov memory,$RESULT
gmi eip,CODESIZE
mov csize,$RESULT
add csize,memory
find memory,#0000000000000000000000000000000000000000000000#
cmp $RESULT,0
jz stop2
mov tmp,$RESULT
bphws tmp,"w"
esto
esto
esto
bphwc tmp
mov temp,eip
C0:
sto
cmp eip,temp //与单步SEH周旋
jz C0
find memory,#0000000000000000000000000000000000000000000000#
mov tmp,$RESULT
sub csize,tmp
find memory,#909090909090909090909090909090909090#
cmp $RESULT,0
jz stop2
mov temp,$RESULT+8
bphws temp,"w"
mov temp,eip
C1:
run
cmp eip,temp+2 //若是单步,则再run
jz C1
bphwc temp
mov Str0,"断点地址:"
add Str0,#0D0A#
mov mem,eip
mov mem4,eip //eip=Addr_4
itoa eip
mov Str4,"Addr_4="
add Str4,$RESULT
add Str4,#0A0D#
find mem4,#83BD????????000F84??0000003007#
cmp $RESULT,0
jz stop2
mov mem5,$RESULT //Addr_5
bp mem5
itoa mem5
mov Str5,"Addr_5="
add Str5,$RESULT
sub mem,4000
find mem,#83BD????????640F82????0000#
cmp $RESULT,0
jz stop2
mov mem0,$RESULT+7 //Addr_0
mov [mem0],#90E9# //改jb为jmp,摘除断点扫描
itoa mem0
add Str0,"Addr_0="
add Str0,$RESULT
add Str0,#0D0A#
find mem0,#C1C003#
find $RESULT,#0385????????#,40
cmp $RESULT,0
jz stop2
mov mem3,$RESULT+6 //Addr_3
itoa mem3
mov Str3,"Addr_3="
add Str3,$RESULT
add Str3,#0D0A#
mov mem4,0 //mem4改为计数
mov mem2,mem0
findon:
find mem0,#AD# //从Addr_0开始查找
cmp $RESULT,0
jz stop
mov mem0,$RESULT
find mem0,#01C8#,40 //还有可能是#03C1#
cmp $RESULT,0
jnz findoff
find mem0,#03C1#,40
cmp $RESULT,0
jnz findoff
add mem0,40
cmp mem0,mem5
ja stop //超过Addr_5后停止
jmp findon
findoff:
cmp mem4,0
jnz D1
mov tmpbp1,$RESULT
bp $RESULT
inc mem4
add mem0,40
jmp findon
D1:
mov tmpbp2,$RESULT
bp $RESULT
add mem0,40
jmp findon
stop:
cmp mem4,0
jz stop2
B2:
run
cmp eip,tmpbp1 //若是单步,则再run
jz C2
cmp eip,tmpbp2
jz C2
jmp B2
C2:
bc eip
@1:
sti
gn eax
cmp $RESULT,0
jz @1
itoa eip
mov mem1,$RESULT
mov Str1,"Addr_1_0="
add Str1,$RESULT
add Str1,#0D0A#
bpwm tmp,csize
run
@3:
sti
cmp [eax],ecx
jnz @3
itoa eip
mov Str2,"Addr_2="
add Str2,$RESULT
add Str2,#0A0D#
mov $RESULT,mem1
bpmc
B3:
run
cmp eip,tmpbp1 //若是单步,则再run
jz C3
cmp eip,tmpbp2
jz C3
cmp eip,mem5
jz @4
jmp B3
C3:
bc eip
@2:
sti
gn eax
cmp $RESULT,0
jz @2
itoa eip
@4:
mov Str11,"Addr_1_1="
add Str11,$RESULT
add Str11,#0D0A#
add Str0,Str1
add Str0,Str11
add Str0,Str2
add Str0,Str3
add Str0,Str4
add Str0,Str5
msg Str0
bc
pause
stop2:
msg "查找失败"
bc
pause
二、网友们反映脚本不能运行的问题
脚本和提供的附件是经过无数次的实验运行的,绝对不是脚本的问题。唯一不同的是OD版本号,插件的使用。请下载我上文提到的版本和插件。okdodo的插件“invisible”很管用,无须更改OD的类名称“AAAMAIN”。
特别提醒:运行脚本,必须用“ODbgScript”打开,绝不能用“OllyScript”打开。若没有ODbgScript,请立即下载该插件。
须要注意的是,电脑中不能运行softIce,不能同时运行两个OD(不管是不是加载同一程序)。操作系统不应该是问题。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年09月25日 22:35:21
- 标 题:对Themida1.9.1.0的通法破解一文的补充(再修正)
- 作 者:wulje
- 时 间:2008-09-25 23:33:41
- 链 接:http://bbs.pediy.com/showthread.php?t=73425