Epe 06 半完美脱壳机,主程序,教程
EncryptPE v2006.1.15 脱壳【作 者】: netsowell
【软件名称】:EncryptPE v2006.1.15
【下载地址】: http://www.encryptpe.com
【加壳方式】: 自己
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
EncryptPE简介:
1. EncryptPE 能加密保护常规PE文件(EXE、DLL、OCX等一般程序或NT服务程序),防静态分析修改,反动态跟踪调试,有效地保护软件,防止盗版。除常规的对抗调试器(SoftIce、TRW、OllyDbg等)、监视器、DUMP工具方法外,EncryptPE采用的加密保护的手段还有:随机加密算法、CRC校验、变形、代码替换、进程注入、APIHOOK、多线程、调试运行、全程监控等。
【详细过程】
写个教程不容易,再加上我现在只会用ABC了,难免有些地方会出点这样或者那样的Bug,尽请见谅。
初步的分析我就不用写了,EPE把壳的代码放到了一个DLL里面,运行的时候先解压这个DLL到%windir%\system32目录下,经过分析都是使用的标准windows api,windows api对于权限管理都是很严格的,所以我们可以通过修改这个DLL的属性来防止EPE一次次覆盖,然后我们就可以修改v2006115.EPE本身了。
V2006115.EPE是用upx加密的,至于怎么脱我就不介绍了,但是注意IAT修复的时候要注意IAT跳转表有两段,不然容易无法跨平台。效验我们就不说了,直接入壳最精彩的部分。
/*711E46F2*/push ebp
/*711E46F3*/push 711E4856
/*711E46F8*/push dword ptr fs:
/*711E46FB*/mov fs:, esp
/*711E46FE*/xor edi, edi
/*711E4700*/test bl, bl
/*711E4702*/jnz short 711E4711//nop
/*711E4704*/mov edx,
/*711E4707*/mov eax,
/*711E470A*/call 711DAE08 //这里取得正确的函数地址,所以上面我们要nop掉
/*711E470F*/mov edi, eax
/*711E4711*/mov , edi
/*711E4714*/test bl, bl
/*711E4716*/je 711E480B//magic jmp*** //直接jmp,IAT修复完毕
/*711E471C*/push 40
/*711E471E*/push 3000
/*711E4723*/push 78
/*711E4725*/push 0
/*711E4727*/call 7112724C
/*711E472C*/mov ebx, eax
/*711E472E*/test ebx, ebx
/*711E4730*/je 711E480B
/*711E4736*/mov eax,
/*711E473C*/call 71125BAC
/*711E4741*/inc eax
/*711E4742*/push eax
/*711E4743*/lea eax,
/*711E4749*/mov ecx, 1
/*711E474E*/mov edx,
/*711E4754*/call 71125D68
/*711E4759*/add esp, 4
/*711E475C*/mov eax,
/*711E4762*/call 71125BAC
/*711E4767*/mov edx,
/*711E476D*/mov , ebx
/*711E4771*/mov byte ptr , 0E8
/*711E4774*/mov eax, ebx
/*711E4776*/mov esi, eax
/*711E4778*/inc esi
/*711E4779*/mov edx, 711DB708
/*711E477E*/sub edx, esi
/*711E4780*/sub edx, 4
/*711E4783*/mov , edx
/*711E4785*/mov byte ptr , 0FF
/*711E4789*/mov byte ptr , 25
/*711E478D*/mov esi, eax
/*711E478F*/add esi, 7
/*711E4792*/add eax, 0B
/*711E4795*/mov , eax
/*711E4797*/cmp dword ptr , 0FFFF
/*711E479E*/jbe short 711E47B8
/*711E47A0*/lea eax,
/*711E47A3*/mov edx,
/*711E47A6*/call 71124A00
/*711E47AB*/mov eax,
/*711E47AE*/call 71124AC8
/*711E47B3*/cmp eax, 64
/*711E47B6*/jle short 711E47C7
/*711E47B8*/mov edx,
/*711E47BB*/mov eax,
/*711E47BE*/call 711DAE08
/*711E47C3*/mov edi, eax
/*711E47C5*/jmp short 711E47F8
/*711E47C7*/mov eax, ebx
/*711E47C9*/mov esi, eax
/*711E47CB*/add esi, 0F
/*711E47CE*/mov edx,
/*711E47D1*/mov , edx
/*711E47D3*/mov esi, eax
/*711E47D5*/add esi, 13
/*711E47D8*/lea eax,
/*711E47DB*/mov edx,
/*711E47DE*/call 71124A00
/*711E47E3*/mov eax,
/*711E47E6*/call 71124AC8
/*711E47EB*/mov ecx, eax
/*711E47ED*/inc ecx
/*711E47EE*/mov edx,
/*711E47F1*/mov eax, esi
/*711E47F3*/call 71127B00
/*711E47F8*/mov eax, ebx
/*711E47FA*/mov esi, eax
/*711E47FC*/add esi, 0B
/*711E47FF*/mov edx, eax
/*711E4801*/add edx, 5
/*711E4804*/xor edi, edx
/*711E4806*/mov , edi
/*711E4808*/mov , eax
/*711E480B*/cmp dword ptr , 0
/*711E480F*/je short 711E483B
/*711E4811*/xor eax, eax
/*711E4813*/push ebp
/*711E4814*/push 711E4831
/*711E4819*/push dword ptr fs:
/*711E481C*/mov fs:, esp
/*711E481F*/mov esi,
/*711E4822*/mov eax,
/*711E4825*/mov , eax //////////填入函数地址
/*711E4827*/xor eax, eax
/*711E4829*/pop edx
/*711E482A*/pop ecx
/*711E482B*/pop ecx
/*711E482C*/mov fs:, edx
/*711E482F*/jmp short 711E483B
/*711E4831*/jmp 71123E78
/*711E4836*/call 711241E0
/*711E483B*/xor eax, eax
/*711E483D*/pop edx
/*711E483E*/pop ecx
/*711E483F*/pop ecx
/*711E4840*/mov fs:, edx
/*711E4843*/push 711E485D
/*711E4848*/lea eax,
/*711E484B*/mov edx, 2
/*711E4850*/call 71124834
/*711E4855*/retn
于是乎,IAT处理完毕。由于效验我们都去完了,所以效验我们就不管拉。
/*711E6749*/call 7112C7D4
/*711E674E*/mov eax,
/*711E6753*/cmp byte ptr , 0
/*711E6756*/jnz short 711E676E
/*711E6758*/add edi, 14
/*711E675B*/inc dword ptr
/*711E675E*/cmp dword ptr , 0
/*711E6762*/jbe short 711E676E
/*711E6764*/cmp dword ptr , 0
/*711E6768*/ja 711E64EE//IAT是否处理完毕。
/*711E676E*/push 0
/*711E6770*/lea eax,
/*711E6773*/mov ecx, 1
/*711E6778*/mov edx,
/*711E677E*/call 71125D68
/*711E6783*/add esp, 4
/*711E6786*/xor eax, eax
/*711E6788*/call 711E6DB4
/*711E678D*/test al, al
/*711E678F*/jnz short 711E679C
/*711E6791*/xor eax, eax
/*711E6793*/call 711DFBD4
下面开始精彩部分,MOV和其他代码加密
/*711E67E6*/mov edx,
/*711E67EC*/mov , edx
/*711E67EF*/mov edx,
/*711E67F5*/mov , edx
/*711E67F8*/test edi, edi
/*711E67FA*/jle 711E6AD5//判断加密地址数目。
/*711E6800*/mov eax,
/*711E6805*/mov eax,
/*711E6808*/add eax,
/*711E68E5*/sub ebx, 2
/*711E68E8*/mov ax, //IAT跳转表加密的三种类型的处理
/*711E68EB*/sub ax, 0CCE9//cmp ax,cce9 //CCE9型 对应 jmp
/*711E68EF*/je short 711E68FF
/*711E68F1*/sub ax, 1BA7//cmp ax,90e8 //90E8 型对应 call
/*711E68F5*/je short 711E693B
/*711E68F7*/sub ax, 100
/*711E68FB*/je short 711E693B//cmp ax,90e9 对应 jmp
/*711E68FD*/jmp short 711E6976
/*711E68FF*/call 711DBBD0//申请一段内存
/*711E6904*/mov word ptr , 25FF //放如正确的跳转指令到申请的内存。所以我们在这里动手,修改为
mov word ptr ,25ff
add ebx,2
mov dword ptr ,esi
下面的代码没用了,所以跳开
Jmp 711e6a9d
/*711E6909*/mov , esi //esi里面有正确的函数跳转地址
/*711E690C*/mov edx, eax
/*711E690E*/mov ebx,
/*711E6911*/add ebx, 6
/*711E6914*/mov eax,
/*711E6917*/add eax, eax
/*711E6919*/add ebx, eax
/*711E691B*/mov eax,
/*711E691E*/mov eax,
/*711E6920*/movzx ecx, word ptr
/*711E6923*/sub ecx, 3000
/*711E6929*/add eax, ecx
/*711E692B*/add eax,
/*711E692E*/dec eax
/*711E692F*/sub edx, eax
/*711E6931*/sub edx, 4
/*711E6934*/mov , edx
/*711E6936*/jmp 711E6A9D
/*711E693B*/call 711DBBD0//同样申请内存
/*711E6940*/mov word ptr , 25FF//这里有所不同,应为call 和jmp 都在这里处理了,所以我们要先判断。
修改为
cmp byte ptr , 0E9
je short 711E6948
mov word ptr , 15FF//是call
jmp short 711E694D
mov word ptr , 25FF //是 jmp
mov , esi
jmp 711E6A9D
/*711E6945*/mov , esi
/*711E6948*/mov edx, eax
/*711E694A*/mov ebx,
/*711E694D*/add ebx, 6
/*711E6950*/mov eax,
/*711E6953*/add eax, eax
/*711E6955*/add ebx, eax
/*711E6957*/mov eax,
/*711E695A*/mov eax,
/*711E695C*/movzx ecx, word ptr
/*711E695F*/sub ecx, 3000
/*711E6965*/add eax, ecx
/*711E6967*/add eax,
/*711E696A*/sub edx, eax
/*711E696C*/sub edx, 4
/*711E696F*/mov , edx
/*711E6971*/jmp 711E6A9D
/*711E6976*/mov edx,
/*711E697C*/mov edx,
下面还有一些类型的加密,包括MOV,但是我们不需要了解其详细,直接命中要害。
/*711E69BA*/cmp ax, 500
/*711E69BE*/je short 711E6A0C
/*711E69C0*/cmp ax, 1500
/*711E69C4*/je short 711E6A0C
/*711E69C6*/cmp ax, 2500
/*711E69CA*/je short 711E6A0C
/*711E69CC*/cmp ax, 3500
/*711E69D0*/je short 711E6A0C
/*711E69D2*/cmp ax, 0D00
/*711E69D6*/je short 711E6A0C
/*711E69D8*/cmp ax, 1D00
/*711E69DC*/je short 711E6A0C
/*711E69DE*/cmp ax, 2D00
/*711E69E2*/je short 711E6A0C
/*711E69E4*/cmp ax, 3D00
/*711E69E8*/je short 711E6A0C
/*711E69EA*/mov ax,
/*711E69ED*/and ax, 0FF00
/*711E69F1*/cmp ax, 8000
/*711E69F5*/jb 711E6A9D
/*711E69FB*/mov ax,
/*711E69FE*/and ax, 0FF00
/*711E6A02*/cmp ax, 0C000
/*711E6A06*/jnb 711E6A9D
/*711E6A0C*/mov ax,
/*711E6A0F*/and ax, 0FF
/*711E6A13*/cmp ax, 89
/*711E6A17*/je short 711E6A26
/*711E6A19*/mov ax,
/*711E6A1C*/and ax, 0FF
/*711E6A20*/cmp ax, 8B
/*711E6A24*/jnz short 711E6A9D
/*711E6A26*/call 711DBBD0
/*711E6A2B*/mov dx,
/*711E6A2E*/and dx, 0FF
/*711E6A33*/cmp dx, 89
/*711E6A38*/jnz short 711E6A4C
/*711E6A3A*/mov dx,
/*711E6A3D*/and dx, 0FF00
/*711E6A42*/add dx, 8B
/*711E6A47*/mov , dx
/*711E6A4A*/jmp short 711E6A5C
/*711E6A4C*/mov dx,
/*711E6A4F*/and dx, 0FF00
/*711E6A54*/add dx, 89
/*711E6A59*/mov , dx //这里写如加密代码。我们在这里动手
// 修改为mov ,dx
/*711E6A5C*/mov , esi
//修改为 mov ,esi
于是乎。基本信息处理完毕。现在往下找OEP.
/*711E6A5F*/mov word ptr , 0E990
/*711E6A65*/mov edx, ebx
/*711E6A67*/sub edx, eax
/*711E6A69*/sub edx, 6
/*711E6A6C*/mov , edx
/*711E6A6F*/mov edx, eax
/*711E6A71*/mov word ptr , 0E990
/*711E6A76*/mov ebx,
到达
/*711E4DEE*/cmp eax, 0//判断OEP是否为0, 是就出错。
/*711E4DF1*/je short 711E4E45
/*711E4DF3*/mov bl, //是否是S加密方式。
/*711E4DF9*/call V2200611.05007EC0
/*711E4DFE*/xor eax, FFFFFFFF//如果是,解密OEP
/*711E4E03*/mov , eax
/*711E4E07*/add esp, 10
/*711E4E0A*/pop dword ptr fs:
/*711E4E11*/pop eax
/*711E4E12*/and eax, 100
/*711E4E17*/cmp eax, 100
/*711E4E1C*/je short 711E4E45
/*711E4E1E*/call 711DB074 //飞向光明之颠。(盗版一下fly老大的。)
/*711E4E23*/jmp short 711E4E45
/*711E4E25*/mov , eax //如果不是,那么用4个int3 通知explorer里面的处理过程,OEP 到了。OEP加密方式,仍然为xor oep,ffffffff
/*711E4E29*/add esp, 10
/*711E4E2C*/pop dword ptr fs:
/*711E4E33*/pop eax
/*711E4E34*/and eax, 100
/*711E4E39*/cmp eax, 100
/*711E4E3E*/je short 711E4E45
/*711E4E40*/call 711DB150
/*711E4E45*/call 711DD288
/*711E4E4A*/push 10
/*711E4E4C*/mov eax,
于是乎,强制结束程序,然后再运行。dump,修复IAT,优化,收工。有SDK的,记得再在IAT添加一个v22006114.epe如果有。没有就用原版的v22006115.epe 附上主脱后的主程序和修改后的dll.
附件太大。。。我分。 ;P;P;P /:D/:D/:D/:D :$:$:$:$ /:? 附件在那呀,没见到.
页:
[1]