jisheng 发表于 2006-8-17 16:02:36

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.
附件太大。。。我分。

ttn2003 发表于 2006-8-25 06:03:34

;P;P;P

ttn2003 发表于 2006-8-25 06:04:59

/:D/:D/:D/:D

ttn2003 发表于 2006-8-25 06:07:07

:$:$:$:$

awg 发表于 2006-9-12 20:00:48

/:? 附件在那呀,没见到.
页: [1]
查看完整版本: Epe 06 半完美脱壳机,主程序,教程