数
然后再修复,
这个程序输入表是没有加密的,但有一个地址要改一下。
在下面提到过的。
findoep.txt
-------------------------
var v1
eoe test1
test2:
run
test1:
mov v1,45f000
cmp [v1],77f4584b
jne test3
mov v1,eip
add v1,2
cmp [v1],855ccaef
jne test3
add v1,15
cmp [v1],C4380C
jne test3
bprm 401000,5e000 //设置内存断点
eob test4
esto
test3:
esto
test4:
bpmc 401000
cmt eip,"oep"
ret
--------------------------
修复被加密的代码:
因为调用的函数代码被抽了,所有修复起来有点困难
我们从401000开始一直向下找到 45f000
搜索call e20000
用脚本搜索速度太慢,所以直接在执行汇编代
码。asmcode.txt
由脚本调用。
------------
var StartCode //保存asm 代码起点
var tem //用做临时变量
var MyCode //
var oep //变量保存,原始eip
var n //保存未知的
mov oep,eip //这里保存
mov StartCode,11880 //这里是asmcode加载的起点地址。
mov n,0
mov eip,StartCode
mov tem,eip
add tem,19
bp tem //当找到加密代码时,会在这里断下
mov tem,eip
add tem,24
bp tem //当查代代码结束时断下
eob le1 //当发生中断时执行这里的脚本
run
le1:
mov tem,StartCode
add tem,19
cmp eip,tem //中断时比较是否为查加密代码处
je break0
cmp eip,MyCode//执行壳里面的代码之后会在这里
je break1
mov tem,StartCode
add tem,24
cmp eip,tem //比较搜索是否结束
je break2
mov eax,3
ret
break0:
mov MyCode,edx
mov eip,edx
sti //跟入壳代码
go edx //跳出来程序代码,壳会修改这里的地址。
break1:
sti //进入,进入解密后的call,
find eip,#68????????c3#//这里为push XX retn两步f8
cmp $RESULT,0
jne l2
find eip,#e9??????ff#//这里为jmp XX 只要一步f8
cmp $RESULT,0
jne l3
sub esp,4
run
ret
l2:
mov eip,$RESULT
sto
sto //进入下一个call,这里就可以读到输入表了
jmp le3
l3:
mov eip,$RESULT
sto //进入下一个call,这里就可以读到输入表了
jmp le3
le3:
find eip,#68????????c3#//这里是push ???? +retn
cmp $RESULT,0
jne le4
find eip,#c3#//如果没找到,就是retn
cmp $RESULT,0
jne le4
find eip,#c20400# //这里是retn 4 有几个函数后面是这样
子的
cmp $RESULT,0
jne le4
add n,1
add edx,5
mov tem,StartCode
add tem,5
mov eip,tem
run
ret
le4:
mov eip,$RESULT
mov tem,eip
add tem,1
mov tem,[tem]
mov ebx,eip
and ebx,ff
sub tem,ebx
mov eax,tem
mov tem,eip
sub tem,4
mov tem,[tem]
sub tem,ebx
mov edi,tem
add esp,4
mov tem,StartCode
add tem,26
mov eip,tem
run
ret
break2:
mov eip,oep
mov eax,n
ret
------------
asm.txt
-----------
BA 00 10 40 00 80 3A E8 75 11 8B 42 01 03 C2 83 C0 05
asmEx.txt
修复代码全被抽的call,不用手工了,
var StartCode //保存asm 代码起点 4167ef
var tem //用做临时变量
var MyCode //
var oep //变量保存,原始eip
var n //保存未知的
var address//用来保存call地址
mov oep,eip //这里保存
mov StartCode,11880 //
mov n,0
mov eip,StartCode
mov tem,eip
add tem,19
bp tem //当找到加密代码时,会在这里断下
mov tem,eip
add tem,24
bp tem //当查代代码结束时断下
eob le1 //当发生中断时执行这里的脚本
run
le1:
mov tem,StartCode
add tem,19
cmp eip,tem //中断时比较是否为查加密代码处
je break0
cmp eip,MyCode//执行壳里面的代码之后会在这里
je break1
mov tem,StartCode
add tem,24
cmp eip,tem //比较搜索是否结束
je break2
mov eax,3
ret
break0:
mov MyCode,edx
mov eip,edx
sti //跟入壳代码
go edx //跳出来程序代码,壳会修改这里的地址。
break1:
sti //进入,进入解密后的call,
find eip,#68????????c3#//这里为push XX retn两步f8
cmp $RESULT,0
jne l2
find eip,#e9??????ff#//这里为jmp XX 只要一步f8
cmp $RESULT,0
jne l3
sub esp,4
run
ret
l2:
mov eip,$RESULT
sto
sto //进入下一个call,这里就可以读到输入表了
jmp le3
l3:
mov eip,$RESULT
sto
jmp le3
le3://这下面是查找各个函数代码
find eip,#64A1180000008B4024C3#//GetCurrentThreadId 7C82BC6D
cmp $RESULT,0
jne a1
find eip,#83C8FFC3#//GetCurrentProcess 7C82EC9D
cmp $RESULT,0
jne a2
find eip,#64A1180000008B4020C3#//GetCurrentProcessId 7C827B9E
cmp $RESULT,0
jne a3
find eip,#6AFE58C3#//GetCurrentThread 7C82C212
cmp $RESULT,0
jne a4
find eip,#64A1180000008B80C4000000C3#//GetThreadLocale 7C82E15F
cmp $RESULT,0
jne a5
find eip,#A138B6887CC3#//GetOEMCP 7C80A67D
cmp $RESULT,0
jne a6
find eip,#A1D4B5887CC3#//GetCommandLineA 7C814A34
cmp $RESULT,0
jne a7
find eip,#64A1180000008B40300FB64002C3#//IsDebuggerPresent 7C824860
cmp $RESULT,0
jne a8
find eip,#A158B3887CC3#//GetACP 7C82C0B5
cmp $RESULT,0
jne a9
find eip,#8BFF558BECFF750864A1#//FreeEnvironmentStringsW 7C814B5D
cmp $RESULT,0
jne a10
find eip,#8BFF558BEC8B45085DC20400#//SetHandleCount 7C82DA8F
cmp $RESULT,0
jne a11
find eip,#B84A110000BA0003FE7FFF12C3#//CloseClipboard 77E3D354
cmp $RESULT,0
jne a12
var StartCode //保存asm 代码起点 4167ef
var tem //用做临时变量
var MyCode //
var oep //变量保存,原始eip
var n //保存未知的
var TemEsp
var sticode
var stisave
var EndOfCode
var aspCall
var EndOfAti
var Bk1
alloc 1000
mov sticode,$RESULT
mov stisave,sticode
mov n,0
mov eip,StartCode
mov tem,eip
add tem,19
bp tem //当找到加密代码时,会在这里断下
mov tem,eip
add tem,24
bp tem //当查代代码结束时断下
bphws Bk1, "x"
eob le1 //当发生中断时执行这里的脚本
run