【文章标题】: 易语言自校验解除办法(文件大小校验)
【文章作者】: 阳小子
【作者邮箱】: 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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!