之前脱壳一直都在手脱,刚学了下写OD脚本,感觉蛮好玩的(虽然类汇编的代码写的感觉很不友好- - ! 感觉我这种强迫症下次的作品应该是C to OD脚本的编译器之类的东西吧T T)
应用的原理:
UPX壳解码代码在单独一个区段,解码后使用jmp指令跳到实际程序代码,这就使得这个jmp必然是一个跨区段的跳转,跳转幅度必然很大
程序逻辑:
扫描jmp指令,执行该jmp,比较跳转值是否超过阈值,如果超过视为到达OEP,如果没有则从该jmp的下一个指令开始寻找jmp直到到达OEP(或跑飞。。。)
代码如下
[Asm] 纯文本查看 复制代码 var lasteip
var laststop
var tmp
var val //跳转阈值
mov laststop,eip
mov val,1000
//从当前位置往下找大跳
LOOPSTEP:
add laststop,1
findop laststop,#e9#
go $RESULT
mov lasteip,eip
mov laststop,lasteip
sto
cmp lasteip,eip
ja Jlarge
jb Jless
//以下,大跳则视为到达OEP,否则继续找
Jlarge:
sub lasteip,eip
cmp lasteip,val
jb LOOPSTEP
jmp Jans
Jless:
mov tmp,eip
sub tmp,lasteip
cmp tmp,val
jb LOOPSTEP
jmp Jans
Jans:
msg "到了"
ret
|