首页
社区
课程
招聘
[原创]Epe 06 半完美脱壳机,主程序,教程。
发表于: 2006-5-31 20:01 100046

[原创]Epe 06 半完美脱壳机,主程序,教程。

2006-5-31 20:01
100046
如题。
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:[eax]
/*711E46FB*/  mov     fs:[eax], esp
/*711E46FE*/  xor     edi, edi
/*711E4700*/  test    bl, bl
/*711E4702*/  jnz     short 711E4711  //nop
/*711E4704*/  mov     edx, [ebp-8]
/*711E4707*/  mov     eax, [ebp-4]
/*711E470A*/  call    711DAE08 //这里取得正确的函数地址,所以上面我们要nop掉
/*711E470F*/  mov     edi, eax
/*711E4711*/  mov     [ebp-C], 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, [esi+368]
/*711E473C*/  call    71125BAC
/*711E4741*/  inc     eax
/*711E4742*/  push    eax
/*711E4743*/  lea     eax, [esi+368]
/*711E4749*/  mov     ecx, 1
/*711E474E*/  mov     edx, [711DFED4]
/*711E4754*/  call    71125D68
/*711E4759*/  add     esp, 4
/*711E475C*/  mov     eax, [esi+368]
/*711E4762*/  call    71125BAC
/*711E4767*/  mov     edx, [esi+368]
/*711E476D*/  mov     [edx+eax*4-4], ebx
/*711E4771*/  mov     byte ptr [ebx], 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     [esi], edx
/*711E4785*/  mov     byte ptr [ebx+5], 0FF
/*711E4789*/  mov     byte ptr [ebx+6], 25
/*711E478D*/  mov     esi, eax
/*711E478F*/  add     esi, 7
/*711E4792*/  add     eax, 0B
/*711E4795*/  mov     [esi], eax
/*711E4797*/  cmp     dword ptr [ebp-8], 0FFFF
/*711E479E*/  jbe     short 711E47B8
/*711E47A0*/  lea     eax, [ebp-10]
/*711E47A3*/  mov     edx, [ebp-8]
/*711E47A6*/  call    71124A00
/*711E47AB*/  mov     eax, [ebp-10]
/*711E47AE*/  call    71124AC8
/*711E47B3*/  cmp     eax, 64
/*711E47B6*/  jle     short 711E47C7
/*711E47B8*/  mov     edx, [ebp-8]
/*711E47BB*/  mov     eax, [ebp-4]
/*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, [ebp-4]
/*711E47D1*/  mov     [esi], edx
/*711E47D3*/  mov     esi, eax
/*711E47D5*/  add     esi, 13
/*711E47D8*/  lea     eax, [ebp-14]
/*711E47DB*/  mov     edx, [ebp-8]
/*711E47DE*/  call    71124A00
/*711E47E3*/  mov     eax, [ebp-14]
/*711E47E6*/  call    71124AC8
/*711E47EB*/  mov     ecx, eax
/*711E47ED*/  inc     ecx
/*711E47EE*/  mov     edx, [ebp-8]
/*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     [esi], edi
/*711E4808*/  mov     [ebp-C], eax
/*711E480B*/  cmp     dword ptr [ebp+C], 0
/*711E480F*/  je      short 711E483B
/*711E4811*/  xor     eax, eax
/*711E4813*/  push    ebp
/*711E4814*/  push    711E4831
/*711E4819*/  push    dword ptr fs:[eax]
/*711E481C*/  mov     fs:[eax], esp
/*711E481F*/  mov     esi, [ebp+C]
/*711E4822*/  mov     eax, [ebp-C]
/*711E4825*/  mov     [esi], eax //////////填入函数地址
/*711E4827*/  xor     eax, eax
/*711E4829*/  pop     edx
/*711E482A*/  pop     ecx
/*711E482B*/  pop     ecx
/*711E482C*/  mov     fs:[eax], 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:[eax], edx
/*711E4843*/  push    711E485D
/*711E4848*/  lea     eax, [ebp-14]
/*711E484B*/  mov     edx, 2
/*711E4850*/  call    71124834
/*711E4855*/  retn

于是乎,IAT处理完毕。由于效验我们都去完了,所以效验我们就不管拉。
/*711E6749*/  call    7112C7D4
/*711E674E*/  mov     eax, [711FFB9C]
/*711E6753*/  cmp     byte ptr [eax], 0
/*711E6756*/  jnz     short 711E676E
/*711E6758*/  add     edi, 14
/*711E675B*/  inc     dword ptr [ebp-1C]
/*711E675E*/  cmp     dword ptr [edi+C], 0
/*711E6762*/  jbe     short 711E676E
/*711E6764*/  cmp     dword ptr [edi+10], 0
/*711E6768*/  ja      711E64EE  //IAT是否处理完毕。
/*711E676E*/  push    0
/*711E6770*/  lea     eax, [ebp-40]
/*711E6773*/  mov     ecx, 1
/*711E6778*/  mov     edx, [711E501C]
/*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, [eax+80]
/*711E67EC*/  mov     [ebp-34], edx
/*711E67EF*/  mov     edx, [eax+84]
/*711E67F5*/  mov     [ebp-30], edx
/*711E67F8*/  test    edi, edi
/*711E67FA*/  jle     711E6AD5//判断加密地址数目。
/*711E6800*/  mov     eax, [71200710]
/*711E6805*/  mov     eax, [eax+3C]
/*711E6808*/  add     eax, [71200710]

/*711E68E5*/  sub     ebx, 2
/*711E68E8*/  mov     ax, [ebx] //IAT跳转表加密的三种类型的处理
/*711E68EB*/  sub     ax, 0CCE9  //cmp ax,cce9 //CCE9型 对应 jmp [xxxx]
/*711E68EF*/  je      short 711E68FF
/*711E68F1*/  sub     ax, 1BA7  //cmp ax,90e8 //90E8 型  对应 call [xxxxx]
/*711E68F5*/  je      short 711E693B
/*711E68F7*/  sub     ax, 100
/*711E68FB*/  je      short 711E693B  //cmp ax,90e9 对应 jmp [xxxxx]
/*711E68FD*/  jmp     short 711E6976
/*711E68FF*/  call    711DBBD0  //申请一段内存
/*711E6904*/  mov     word ptr [eax], 25FF //放如正确的跳转指令到申请的内存。所以我们在这里动手,修改为
mov word ptr [ebx],25ff
add ebx,2
mov dword ptr [ebx],esi
下面的代码没用了,所以跳开
Jmp 711e6a9d
/*711E6909*/  mov     [eax+2], esi //esi里面有正确的函数跳转地址
/*711E690C*/  mov     edx, eax
/*711E690E*/  mov     ebx, [ebp-10]
/*711E6911*/  add     ebx, 6
/*711E6914*/  mov     eax, [ebp-18]
/*711E6917*/  add     eax, eax
/*711E6919*/  add     ebx, eax
/*711E691B*/  mov     eax, [ebp-10]
/*711E691E*/  mov     eax, [eax]
/*711E6920*/  movzx   ecx, word ptr [ebx]
/*711E6923*/  sub     ecx, 3000
/*711E6929*/  add     eax, ecx
/*711E692B*/  add     eax, [ebp-20]
/*711E692E*/  dec     eax
/*711E692F*/  sub     edx, eax
/*711E6931*/  sub     edx, 4
/*711E6934*/  mov     [eax], edx
/*711E6936*/  jmp     711E6A9D
/*711E693B*/  call    711DBBD0//同样申请内存
/*711E6940*/  mov     word ptr [eax], 25FF//这里有所不同,应为call [xxxx]和jmp [xxxx]都在这里处理了,所以我们要先判断。
修改为
cmp     byte ptr [ebx+1], 0E9
je      short 711E6948
mov     word ptr [ebx], 15FF//是call [xxxx]
jmp     short 711E694D
mov     word ptr [ebx], 25FF //是 jmp [xxxx]
mov     [ebx+2], esi
jmp     711E6A9D

/*711E6945*/  mov     [eax+2], esi
/*711E6948*/  mov     edx, eax
/*711E694A*/  mov     ebx, [ebp-10]
/*711E694D*/  add     ebx, 6
/*711E6950*/  mov     eax, [ebp-18]
/*711E6953*/  add     eax, eax
/*711E6955*/  add     ebx, eax
/*711E6957*/  mov     eax, [ebp-10]
/*711E695A*/  mov     eax, [eax]
/*711E695C*/  movzx   ecx, word ptr [ebx]
/*711E695F*/  sub     ecx, 3000
/*711E6965*/  add     eax, ecx
/*711E6967*/  add     eax, [ebp-20]
/*711E696A*/  sub     edx, eax
/*711E696C*/  sub     edx, 4
/*711E696F*/  mov     [eax], edx
/*711E6971*/  jmp     711E6A9D
/*711E6976*/  mov     edx, [711FFD94]
/*711E697C*/  mov     edx, [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, [ebx]
/*711E69ED*/  and     ax, 0FF00
/*711E69F1*/  cmp     ax, 8000
/*711E69F5*/  jb      711E6A9D
/*711E69FB*/  mov     ax, [ebx]
/*711E69FE*/  and     ax, 0FF00
/*711E6A02*/  cmp     ax, 0C000
/*711E6A06*/  jnb     711E6A9D
/*711E6A0C*/  mov     ax, [ebx]
/*711E6A0F*/  and     ax, 0FF
/*711E6A13*/  cmp     ax, 89
/*711E6A17*/  je      short 711E6A26
/*711E6A19*/  mov     ax, [ebx]
/*711E6A1C*/  and     ax, 0FF
/*711E6A20*/  cmp     ax, 8B
/*711E6A24*/  jnz     short 711E6A9D
/*711E6A26*/  call    711DBBD0
/*711E6A2B*/  mov     dx, [ebx]
/*711E6A2E*/  and     dx, 0FF
/*711E6A33*/  cmp     dx, 89
/*711E6A38*/  jnz     short 711E6A4C
/*711E6A3A*/  mov     dx, [ebx]
/*711E6A3D*/  and     dx, 0FF00
/*711E6A42*/  add     dx, 8B
/*711E6A47*/  mov     [eax], dx
/*711E6A4A*/  jmp     short 711E6A5C
/*711E6A4C*/  mov     dx, [ebx]
/*711E6A4F*/  and     dx, 0FF00
/*711E6A54*/  add     dx, 89
/*711E6A59*/  mov     [eax], dx //这里写如加密代码。我们在这里动手
// 修改为mov [ebx],dx

/*711E6A5C*/  mov     [eax+2], esi
//修改为 mov [ebx+2],esi
于是乎。基本信息处理完毕。现在往下找OEP.
/*711E6A5F*/  mov     word ptr [eax+6], 0E990
/*711E6A65*/  mov     edx, ebx
/*711E6A67*/  sub     edx, eax
/*711E6A69*/  sub     edx, 6
/*711E6A6C*/  mov     [eax+8], edx
/*711E6A6F*/  mov     edx, eax
/*711E6A71*/  mov     word ptr [ebx], 0E990
/*711E6A76*/  mov     ebx, [ebp-10]
到达
/*711E4DEE*/  cmp     eax, 0//判断OEP是否为0, 是就出错。
/*711E4DF1*/  je      short 711E4E45
/*711E4DF3*/  mov     bl, [7121272B] //是否是S加密方式。
/*711E4DF9*/  call    V2200611.05007EC0
/*711E4DFE*/  xor     eax, FFFFFFFF//如果是,解密OEP
/*711E4E03*/  mov     [esp+34], eax
/*711E4E07*/  add     esp, 10
/*711E4E0A*/  pop     dword ptr fs:[0]
/*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     [esp+34], eax //如果不是,那么用4个int3 通知explorer里面的处理过程,OEP 到了。OEP加密方式,仍然为xor oep,ffffffff
/*711E4E29*/  add     esp, 10
/*711E4E2C*/  pop     dword ptr fs:[0]
/*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, [711FFBB4]

于是乎,强制结束程序,然后再运行。dump,修复IAT,优化,收工。有SDK的,记得再在IAT添加一个v22006114.epe如果有。没有就用原版的v22006115.epe 附上主脱后的主程序和修改后的dll.
附件太大。。。我分。

[课程]Linux pwn 探索篇!

收藏
免费 7
支持
分享
最新回复 (193)
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
2
第一部分。
上传的附件:
2006-5-31 20:03
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
3
11111111111
上传的附件:
2006-5-31 20:04
0
雪    币: 319
活跃值: (2404)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
4
学习学习!
2006-5-31 20:10
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
5
顺便再说一下使用方法,首先解压,点setup.bat, 如果说有文件在使用当中,那么结束下explorer.exe进程。 然后再点。复制成功后。运行你要脱得程序。如果是DLl请装入。会提示你OEP,然后用process explorer结束你程序的每个线程。知道进程终止。然后再运行程序,提示OEP 时。用lordpe dump,然后用RECImport填入OEP,得到IAT,然后修复你dump出来的文件。没有SDK的就OK了,有SDK的自己添加v22006115.epe到IAT.
2006-5-31 20:10
0
雪    币: 93908
活跃值: (200199)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
2006-5-31 20:10
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Support strongly!!!
2006-5-31 20:10
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
8
Let me test.Thinks!
2006-5-31 20:15
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
太强了,重新再加一便就是破解版了.完全不懂,学习!
2006-5-31 20:23
0
雪    币: 2199
活跃值: (1975)
能力值: ( LV12,RANK:810 )
在线值:
发帖
回帖
粉丝
10
佩服!
2006-5-31 20:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
著著~~~!!

我也???
2006-5-31 21:02
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
严重支持!
2006-5-31 22:21
0
雪    币: 127
活跃值: (1765)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
佩服!
2006-5-31 22:53
0
雪    币: 2003
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
实在是太强大了 man
2006-5-31 23:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
佩服!
2006-5-31 23:18
0
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
16
了不起,学习~
2006-5-31 23:27
0
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
17
完全支持,学习.
2006-6-1 07:26
0
雪    币: 224
活跃值: (75)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
强啊。向牛人学习。。
2006-6-1 07:29
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
最初由 netsowell 发布
顺便再说一下使用方法,首先解压,点setup.bat, 如果说有文件在使用当中,那么结束下explorer.exe进程。 然后再点。复制成功后。运行你要脱得程序。如果是DLl请装入。会提示你OEP,然后用process explorer结束你程序的每个线程。知道进程终止。然后再运行程序,提示OEP 时。用lordpe dump,然后用RECImport填入OEP,得到IAT,然后修复你dump出来的文件。没有SDK的就OK了,有SDK的自己添加v22006115.epe到IAT.


怎么我用你的方法"RECImport填入OEP,得到IAT"的时候就是得不到IAT???
2006-6-1 07:44
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
20
最初由 tobby 发布
怎么我用你的方法"RECImport填入OEP,得到IAT"的时候就是得不到IAT???

搜索不到就自己定位RVA.如果电脑够强悍,就搜索整个镜像好了。
2006-6-1 07:47
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
太强了 佩服!
2006-6-1 08:38
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
22
支持再进一步, 继续更新!
2006-6-1 09:06
0
雪    币: 2223
活跃值: (866)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
呵呵
看来老王又要升级了
2006-6-1 09:16
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
厉害啊,学习学习,我是新人
2006-6-1 09:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
呵呵,确实,一带猛壳结束了。套用某大哥的话。:)
2006-6-1 09:41
0
游客
登录 | 注册 方可回帖
返回
//