首页
社区
课程
招聘
[原创]易语言自校验解除(文件大小校验)
发表于: 2007-12-14 17:21 12235

[原创]易语言自校验解除(文件大小校验)

2007-12-14 17:21
12235

【文章标题】: 易语言自校验解除办法(文件大小校验)
【文章作者】: 阳小子
【作者邮箱】: yangxiaozi@qq.com
【软件名称】: 阳小子emvⅠ(正式版)
【下载地址】: http://bbs.pediy.com/attachment.php?attachmentid=10090&d=1196590361
【保护方式】: Anti Debug、文件大小校验
【加壳方式】: 北斗、FSG2.0
【编写语言】: 易语言
【操作平台】: Win2000/XP
【作者声明】: 我是一只小菜鸟,偶得一点心得,愿与大家分享
----------------------------------------------------
【详细过程】: 
    大家好,这次我的第一次写文章,如果文中有什么不足的地方还请多多指教!
由于本人比较菜,没有什么好东西拿出来给大家,所以只好拿出自己写的东西出来砸了,首先这个CrackME是我用易语言写的,但是之
前我没有分析过,我写好了就发布出来给大家玩,直到ayan兄弟把我的CM给蹂躏了(这里膜拜一下ayan大虾!)但是ayan兄弟没有把他相关的分析写出来,这让我觉得太对不起于我等的菜鸟拉,所以就有了今天的这篇文章·!

首先拿出PEID侦察,NsPack V2.X -> LiuXingPing   * Sign.By.fly * 北斗壳  那是我为了写校验时用的北斗4.1破解版加的第一层壳

OD载入程序:

00425D0B >  9C            PUSHFD                //第一层北斗壳入口
00425D0C    60            PUSHAD
00425D0D    E8 00000000   CALL emvⅠ.00425D12   //ESP定律,ESP值=0012FFA0
00425D12    5D            POP EBP
00425D13    B8 07000000   MOV EAX,7
00425D18    2BE8          SUB EBP,EAX
00425D1A    8DB5 F1FEFFFF LEA ESI,DWORD PTR SS:[EBP-10F]
00425D20    8A06          MOV AL,BYTE PTR DS:[ESI]
00425D22    3C 00         CMP AL,0
00425D24    74 12         JE SHORT emvⅠ.00425D38
00425D26    8BF5          MOV ESI,EBP
00425D28    8DB5 19FFFFFF LEA ESI,DWORD PTR SS:[EBP-E7]
00425D2E    8A06          MOV AL,BYTE PTR DS:[ESI]
00425D30    3C 01         CMP AL,1
00425D32    0F84 42020000 JE emvⅠ.00425F7A
00425D38    C606 01       MOV BYTE PTR DS:[ESI],1
00425D3B    8BD5          MOV EDX,EBP
00425D3D    2B95 ADFEFFFF SUB EDX,DWORD PTR SS:[EBP-153]
00425D43    8995 ADFEFFFF MOV DWORD PTR SS:[EBP-153],EDX
00425D49    0195 DDFEFFFF ADD DWORD PTR SS:[EBP-123],EDX
00425D4F    8DB5 21FFFFFF LEA ESI,DWORD PTR SS:[EBP-DF]
00425D55    0116          ADD DWORD PTR DS:[ESI],EDX
00425D57    60            PUSHAD

ESP定律后来到如下:

00425F8F    9D              POPFD                //F8单步
00425F90  - E9 BFA1FDFF     JMP emvⅠ.00400154   //这里跳向第二层壳FSG 2.0
但是这里不明白单步后弹出如图1所示:



不过它的提示倒让我有了解决办法,我们看这句   JMP emvⅠ.00400154

00400154这里不正是跳向第二层壳的入口点吗?我们就在这里下断,运行终于暂停下了,下面是第二层壳的入口点。

00400154    8725 604B4200   XCHG DWORD PTR DS:[424B60],ESP  //第二层壳 FSG 2.0 入口点
0040015A    61              POPAD
0040015B    94              XCHG EAX,ESP //F8到这里的时候在堆栈窗口里出现了程序的入口点,如下所示                      
0040015C    55              PUSH EBP                                                          

00424B64   004001E8  emvⅠ.004001E8
00424B68   004001DC  emvⅠ.004001DC
00424B6C   004001DE  emvⅠ.004001DE
00424B70   00401000  emvⅠ.00401000   //LoadLibraryA函数的上一个数值00401000
00424B74   7C801D77  kernel32.LoadLibraryA
00424B78   7C80ADA0  kernel32.GetProcAddress

既然知道了程序的入口点了的话,那么我们Ctrl+G输入00401000 在这里F4,程序终于停下了!分析后如下所示

00401000    E8 06000000     CALL emvⅠ.0040100B          //这里我们可以脱壳了
00401005    50              PUSH EAX
00401006    E8 BB010000     CALL emvⅠ.004011C6    ; JMPkernel32.ExitProcess
0040100B    55              PUSH EBP
0040100C    8BEC            MOV EBP,ESP
0040100E    81C4 F0FEFFFF   ADD ESP,-110
00401014    E9 83000000     JMP emvⅠ.0040109C

脱壳后运行出错如图2所示:



看来得修复一下啊,修改后程序大小为216kb(221,184 字节),运行下看看,没有反映,一般出现此状态的多数是采用了自校验,不过校验的办法有很多,而我这里采用的是文件大小校验。那么该怎么去掉这个校验呢?为此我又写了个同样的校验程序来测试,看看如何解决,这也是另我写这篇文章的主要原因,下面是我的分析!

OD载入修改后的程序如下

E语言的通用入口点

00401000 >  E8 06000000     CALL 1000_.0040100B             //F7
00401005    50              PUSH EAX
00401006    E8 BB010000     CALL <JMP.&kernel32.ExitProcess>
0040100B    55              PUSH EBP
0040100C    8BEC            MOV EBP,ESP
0040100E    81C4 F0FEFFFF   ADD ESP,-110
00401014    E9 83000000     JMP 1000_.0040109C                             //F7后到这里,这里又跳到下面这里:

0040109C    8D85 FCFEFFFF   LEA EAX,DWORD PTR SS:[EBP-104]
004010A2    50              PUSH EAX
004010A3    E8 44010000     CALL 1000_.004011EC
004010A8    68 19104000     PUSH 1000_.00401019          ; ASCII "krnln.fnr"
004010AD    8D85 FCFEFFFF   LEA EAX,DWORD PTR SS:[EBP-104]
004010B3    50              PUSH EAX
004010B4    E8 25010000     CALL <JMP.&kernel32.lstrcat>
004010B9    50              PUSH EAX
004010BA    E8 19010000     CALL <JMP.&kernel32.LoadLibraryA>
004010BF    85C0            TEST EAX,EAX //这里测试支持库加载是否成功,成功就使下一句跳转
004010C1    0F85 9E000000   JNZ 1000_.00401165 //这里不成功就从注册表中找E程序的安装目录

00401165    8985 F8FEFFFF   MOV DWORD PTR SS:[EBP-108],EAX           ; krnln.10000000
0040116B    68 2D104000     PUSH 1000_.0040102D                      ; ASCII "GetNewSock"
00401170    50              PUSH EAX
00401171    E8 5C000000     CALL <JMP.&kernel32.GetProcAddress>
00401176    85C0            TEST EAX,EAX
00401178    74 20           JE SHORT 1000_.0040119A
0040117A    68 E8030000     PUSH 3E8
0040117F    FFD0            CALL EAX
00401181    85C0            TEST EAX,EAX
00401183    74 15           JE SHORT 1000_.0040119A
00401185    E8 00000000     CALL 1000_.0040118A
0040118A    810424 761E0000 ADD DWORD PTR SS:[ESP],1E76
00401191    FFD0            CALL EAX     //到这里就是加载E格式进行本地封装等操作,F7进去
00401193    6A 00           PUSH 0
00401195    E8 2C000000     CALL <JMP.&kernel32.ExitProcess>
0040119A    FFB5 F8FEFFFF   PUSH DWORD PTR SS:[EBP-108]
004011A0    E8 27000000     CALL <JMP.&kernel32.FreeLibrary>
004011A5    6A 10           PUSH 10
004011A7    68 96104000     PUSH 1000_.00401096                      ; ASCII "Error"
004011AC    68 57104000     PUSH 1000_.00401057                      ; ASCII "Not found the kernel library or the kernel library is invalid!"
004011B1    6A 00           PUSH 0
004011B3    E8 08000000     CALL 1000_.004011C0
004011B8    B8 FFFFFFFF     MOV EAX,-1
004011BD    C9              LEAVE
004011BE    C3              RETN

F7进去后如下:

100298BA    55              PUSH EBP
100298BB    8BEC            MOV EBP,ESP
100298BD    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
100298C0    50              PUSH EAX
100298C1    B9 10DB0E10     MOV ECX,krnln.100EDB10
100298C6    E8 04F5FFFF     CALL krnln.10028DCF       //F7再进去
100298CB    5D              POP EBP
100298CC    C2 0400         RETN 4

F7进去后如下:

10028DCF    55              PUSH EBP
10028DD0    8BEC            MOV EBP,ESP
10028DD2    83EC 08         SUB ESP,8
10028DD5    53              PUSH EBX
10028DD6    56              PUSH ESI
10028DD7    57              PUSH EDI
10028DD8    894D F8         MOV DWORD PTR SS:[EBP-8],ECX
10028DDB    FF15 E0230C10   CALL DWORD PTR DS:[<&KERNEL32.GetProcess>; kernel32.GetProcessHeap
10028DE1    8B4D F8         MOV ECX,DWORD PTR SS:[EBP-8]
10028DE4    8981 50040000   MOV DWORD PTR DS:[ECX+450],EAX
10028DEA    8B55 08         MOV EDX,DWORD PTR SS:[EBP+8]
10028DED    8B42 30         MOV EAX,DWORD PTR DS:[EDX+30]
10028DF0    83E0 01         AND EAX,1
10028DF3    85C0            TEST EAX,EAX
10028DF5    75 10           JNZ SHORT krnln.10028E07
10028DF7    8B4D 08         MOV ECX,DWORD PTR SS:[EBP+8]
10028DFA    51              PUSH ECX
10028DFB    8B4D F8         MOV ECX,DWORD PTR SS:[EBP-8]
10028DFE    E8 FDFB0200     CALL krnln.10058A00
10028E03    FFE0            JMP EAX      //这里跳向易语言编译的入口点,当时我编译的时候是直接编译,直接编译跟独立编译不同

004144B0    E8 5C000000     CALL 1000_.00414511
004144B5    83C4 18         ADD ESP,18
004144B8    8BE5            MOV ESP,EBP
004144BA    5D              POP EBP
004144BB    C3              RETN
004144BC    C3              RETN
004144BD    C3              RETN

004144BE    FC              CLD           //易语言编译的真正入口点,一般如果有字符串之类的,到了这里就可以搜索的到的拉。
004144BF    DBE3            FINIT
004144C1    E8 F6FFFFFF     CALL 1000_.004144BC
004144C6    68 BD444100     PUSH 1000_.004144BD
004144CB    B8 03000000     MOV EAX,3
004144D0    E8 36000000     CALL 1000_.0041450B
004144D5    83C4 04         ADD ESP,4
004144D8    E8 81FFFFFF     CALL 1000_.0041445E
004144DD    68 01000152     PUSH 52010001
004144E2    E8 1E000000     CALL 1000_.00414505
004144E7    83C4 04         ADD ESP,4
004144EA    6A 00           PUSH 0
004144EC    E8 0E000000     CALL 1000_.004144FF
004144F1    E8 03000000     CALL 1000_.004144F9

就在易语言编译的真正入口点的地方往上找,一般校验都有个比较的语句,格式大概如下:

CMP DWORD PTR SS:[EBP-8],0EA60    //这个是比较程序的大小16进制值
JL emvⅠ.0041365C                 //下面这句一般是小于或者大于等等之类的语句

往上翻了一会而找到如下语句:

00413629    817D F8 60EA000>CMP DWORD PTR SS:[EBP-8],0EA60   //第一处
00413630    0F8C 26000000   JL 1000_.0041365C

004136AA    817D F8 78E6000>CMP DWORD PTR SS:[EBP-8],0E678  //第二处
004136B1    0F8C 26000000   JL 1000_.004136DD

0041372B    817D F8 E8FD000>CMP DWORD PTR SS:[EBP-8],0FDE8 //第三处
00413732    0F8C 21000000   JL 1000_.00413759

把以上的JL全部修改为JMP无条件跳转语句或者修改为JG大于就跳转也可以!

修改完毕可以正常运行起来拉,至于算法分析大家可以去找ayan大牛(^_^)

                     本文到此结束,谢谢观看。

----------------------------------------------------
【版权声明】: 本文原创    , 转载请注明作者并保持文章的完整, 谢谢!

                               2007-12-14 4:25:56


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
学习学习.......
2007-12-15 10:26
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
3
正在写注册机,=我出破文吧
2007-12-15 16:57
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
4
顶啊,不过我在OD中F9就挂了-_-
2007-12-15 17:57
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习一下啊!
2007-12-15 19:21
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
6
好像有些问题~~~
2007-12-20 12:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
只能说学习了、、、、
原来入口还有真假之分啊  
2007-12-28 05:44
0
游客
登录 | 注册 方可回帖
返回
//