Themida 初步研究(ANTI篇)
某些马甲靠themida来赚钱的,我很生气,搞技术就搞技术,骂人在论坛真恶心.刚好200篇水贴,凑一篇水贴作为纪念.
我说了themida在ANTI上很弱很弱,可以说,浪费了我的时间,我不想学它的VM方式
用不上那么夸张,我写花指令垃圾可以写上10000M,那么,我们看看它的ANTI.
在OD中打开无效和特权指令异常.它仅仅2个anti,都是解码后出现的,我现在明白了
为什么它不解码就可以跳过的BUG问题出在什么地方了.它的调试字符串不值得提,老掉牙了
多话不说了,我们先将themida的anti选项都选择上,别看它花里胡哨的那么多,基本
是花瓶,一碰就破的.
将虚拟机放到最小,其它选择都关了,我的是笔记本在跑,不想和它比机器占用率.
将entry point 放到0,这篇是玩它的ANTI的,这些后面的干扰手段我们先不用.
有空我们再一篇一篇的肢解它..
将themida给记事本加壳,轰轰烈烈的又是算VM(基本的)又是拆setion,最后加上了.
不知道为什么,我的ODbgScript 1.47有问题,下内存写断点变成了内存读断点,我晕
第一个异常:
011ADA34 59 pop ecx ; 0007FFE0
011ADA35 40 inc eax
011ADA36 0F3F ??? ; 未知命令
011ADA38 07 pop es
看SEH句柄过
第二个异常:
011ADBA2 81EA E85F3400 sub edx,345FE8
011ADBA8 ED in eax,dx
011ADBA9 81FB 68584D56 cmp ebx,564D5868
同样看SEH句柄过
过2个异常后,下VirtualAllocEx断点三次(它将虚拟机解出来),
011B3FE6 68 1541672C push 2C674115
011B3FEB ^ E9 29BAFFFF jmp 011AFA19
011B3FF0 68 99C1004D push 4D00C199 ; 从系统区返回这里
011B3FF5 ^ E9 1FBAFFFF jmp 011AFA19
011B3FFA 68 C8AC9D17 push 179DACC8
011B3FFF ^ E9 15BAFFFF jmp 011AFA19
011B4004 68 60F14E17 push 174EF160
011B4009 ^ E9 0BBAFFFF jmp 011AFA19
011B400E 68 91C85221 push 2152C891
011B4013 ^ E9 01BAFFFF jmp 011AFA19
011B4018 68 A2EE450D push 0D45EEA2
下LoadLibraryA断点,返回壳代码区
011B9F08 FF95 25073509 call near dword ptr [ebp+9350725]; kernel32.LoadLibraryA
011B9F0E 66:8BF0 mov si,ax ;返回这里
011B9F11 8D9D EB774009 lea ebx,dword ptr [ebp+94077EB]
直接在用户代码区下内存写断点.断在这里,取消内存写断点
011EA3FD 8BFA mov edi,edx
011EA3FF 8BF1 mov esi,ecx
011EA401 8BD1 mov edx,ecx
011EA403 8BC8 mov ecx,eax
011EA405 F3:A4 rep movsb //断在这里
011EA407 C685 55253509 5>mov byte ptr [ebp+9352555],56
这里就是将解码后的代码放回,过这里后,看ESP,[ESP+1C]就是它要去的OEP,这里下硬件写断点
将停在这里.
011F5FFC 8BC0 mov eax,eax
011F5FFE 61 popad
011F5FFF 68 9D730000 push 739D ;看见了么,这个是什么
011F6004 9C pushfd
011F6005 6A 00 push 0
011F6007 50 push eax
F7过一步,继续断这里,它肯定要加上段地址
011F6849 5D pop ebp
011F684A F5 cmc
011F684B 014424 08 add dword ptr [esp+8],eax 又断在这里,eax==01000000
011F684F 6A 00 push 0
011F6851 52 push edx ;
(它的最后去OEP是这样的)
011F689D 9D popfd
011F689E C3 retn ;刚才将OEP算出来了压在堆栈,飞去OEP了
好了OEP出来了,就这样简单.直接下断到OEP.
飞到光明地方,DUMP出来,IAT修复,砍掉壳区,88K!!
再次同样选项测试regedit.exe 一模一样,再次增减各个选项测试,一模一样,收工...
这就是它第一项花里胡哨的东西,我写脚本和文章时间超过我跟踪它这些选项的时间.切........
最近老有活,不然有空把它虚拟机的东西也写了,它的API复制就不用写了,完全没有技术含量,复制后插花罢了.
代码重放其实也不很复杂,绕点弯弯..
////////////////////////////////////////////////////
// XXXXX OEP查找脚本
// Written by hnhuqiong
// Email:hnhuqiong@126.com
// OS : Win XP SP1,OllyICE 1.10,ODbgScript v1.47
// Data: 2006-01-30
// NOTE:
// 晕死了,为什么我的脚本下内存写断点断不上.
//
// Thanks!:
// OLLYICE (OLLYDBG patch V1.10 and HideOD plugin V0.13 by PEDIY )
// ODbgScript plugin by E3
// bbs.pediy.com(看雪学院)
////////////////////////////////////////////////////
initialization: //初始化
dbh
var cbase
var csize
var tmp
var oep
gmi eip,CODEBASE
mov cbase,$RESULT
gmi eip,CODESIZE
mov csize,$RESULT
pretreatment: //预处理
cmp $VERSION, "1.47"
jb version_above_147
msgyn "请设置忽略所有的中断,除了无效或者特权指令,继续?"
cmp $RESULT,1
je Start
jmp end
Start:
run
mov tmp,[esp+4]
bp tmp
esto tmp //过第一个SEH
bc tmp
run
mov tmp,[esp+4]
bp tmp //过第二个SEH
esto tmp
bc tmp
gpa "VirtualAllocEx","Kernel32.dll"
mov tmp,$RESULT
bp tmp
run
run
run //过三次
bc tmp
rtu
gpa "LoadLibraryA","Kernel32.dll"
mov tmp,$RESULT
bp tmp
// run
run
bc tmp
rtu
----------对不起大家了,后面的我ODbgScript 有问题,内存写断点变性....
bpwm cbase,csize
run
bpmc
mov tmp,eip
add tmp,2
go tmp
mov tmp,esp
add tmp,1C
bphws tmp,"w"
esto //求出OEP的AV
bphwc
sti
bphws tmp,"w"
esto //加上段地址,得出RAV
bphwc
mov tmp,esp
add tmp,8
mov tmp,[tmp]
bp tmp
esto
bc tmp
end:
ret // 结束脚本
/////////////////////////
//一些判断和提示信息
////////////////////////
version_above_147:
msg "请下载最新的ODbgScript 1.47以上版本,Script by hnhuqiong,Thank you for using my script!"
jmp end
error_all:
msg "错误,请联系脚本作者hnhuqiong@126.com"
jmp end
error_bpint:
msg "断点错误,请联系脚本作者hnhuqiong@126.com"
jmp end
error_function:
msg "查找不到函数地址,请联系脚本作者hnhuqiong@126.com!"
jmp end
errror_bpint:
msg "查找不到断点,请联系脚本作者hnhuqiong@126.com"
jmp end
//////////////////结束//////////////////////////////