最初由 王仁军 发布
我前面那个是很简单,在我编好之后,不加壳就非法操作,加壳之后才可以正常运行,我原以为被脱之后也会非法操作。看到大家脱了没事,我才自己去脱了一下,果然不是我想要的结果:没有非法操作。
现在我改过,自己也脱过,试了试,和我想的一样,有非法操作。有兴趣的再去试试。
成绩统计.exe
既然楼主说了,增加了自校验,那校验无非主就是检查文件的大小,时间(创建、修改、访问),名称,安装路径等等,我就拿最常用的校验文件大小的方法来测试。
脱壳前大小:457728=6FC00
脱壳后大小:917504=E0000
搜索 “6FC00”
OD调入脱壳后的程序,停在下面。
00427570 >/$ 55 push ebp
00427571 |. 8BEC mov ebp,esp
00427573 |. 6A FF push -1
00427575 |. 68 B8884600 push 成绩统计.004688B8
0042757A |. 68 94EB4200 push 成绩统计.0042EB94 ; SE handler installation
0042757F |. 64:A1 00000000 mov eax,dword ptr fs:[0]
00427585 |. 50 push eax
00427586 |. 64:8925 00000000 mov dword ptr fs:[0],esp
0042758D |. 83EC 58 sub esp,58
00427590 |. 53 push ebx
CPU窗口中搜索常数6FC00,选中“整个段块”,找到三处,看来作者采用的就是校验文件大小的方法来防止脱壳。
全部下断,F9运行。
0042261D |. 3D 00FC0600 cmp eax,6FC00
004229EA |. 3D 00FC0600 cmp eax,6FC00
00422B3F BA 00FC0600 mov edx,6FC00
00422610 |. E8 B6350000 call 成绩统计.00425BCB
00422615 |. 8D4D C0 lea ecx,dword ptr ss:[ebp-40]
00422618 |. E8 05380000 call 成绩统计.00425E22
0042261D |. 3D 00FC0600 cmp eax,6FC00 ////////////// ; 断在这里,第一处校验。F8单步两次后出错异常。
00422622 76 10 jbe short 成绩统计.00422634 //// ; 因此这里必须跳,不跳就出错异常退出! 改为jmp
00422624 |. CC int3
00422625 |> 68 E02A8F00 /push 8F2AE0
0042262A |. E8 8FD00100 |call 成绩统计.0043F6BE
0042262F |. 83C4 04 |add esp,4
00422632 |.^ EB F1 \jmp short 成绩统计.00422625
00422634 |> \53 push ebx
00422635 |. 57 push edi
F9程序正常运行,弹出注册窗口。由于内存出现明码,再复杂的算法都没什么意义,因此略过算法分析。用Ultra string 插件收索
注册错误提示下断,断下后在椎栈中找到正确注册码,我找到的是 D8DCC6A9-6340b89b-D83BC78A,注册后断在下面:
004229E5 |. E8 38340000 call 成绩统计.00425E22
004229EA |. 3D 00FC0600 cmp eax,6FC00 /////////////////; 断在这里。第二处校验,如果eax不为6FC00,即使你追出正确注册码也不能注册成功.
004229EF 0F87 97000000 ja 成绩统计.00422A8C //////////; 这里不能跳!跳则无任何提示退出.6个字节全nop掉。
004229F5 |. 8B45 94 mov eax,dword ptr ss:[ebp->
004229F8 |. 33C9 xor ecx,ecx
004229FA |. 50 push eax ; /Arg3 = 000E0000
004229FB |. 68 2C6A4700 push 成绩统计.00476A2C ; |Arg2 = 00476A2C ASCII "Key"
00422A00 |. 8B78 F8 mov edi,dword ptr ds:[eax-> ; |
00422A03 |. 68 B4584700 push 成绩统计.004758B4 ; |Arg1 = 004758B4 ASCII "Settings"
00422A08 |. 85FF test edi,edi
00422A0A |. 0F94C1 sete cl
00422A0D |. 898E E4000000 mov dword ptr ds:[esi+E4],>
F9程序运行,注册成功了,出现每日一贴。如果到这里就收工的话,下次运行你会发现问题依旧,所以我们继续跟踪。点确定后断
在下面:
00422B3F BA 00FC0600 mov edx,6FC00 //////////////// ; 第三处校验,用eax值替换6FC00,eax=E0000
00422B44 |. 3BD0 cmp edx,eax
00422B46 |. 1BF6 sbb esi,esi ;
00422B48 |. 46 inc esi ;
00422B49 |> 8D4D F0 lea ecx,dword ptr ss:[ebp-10]
00422B4C |. C645 FC 04 mov byte ptr ss:[ebp-4],4
F9运行,这次程序没有错误了,复制到可执行文件,全部修正保存收工。
注册码保存在下面的注册表键,删除后可能继续调试。算法大牛冷血书生已经分析过了,有兴趣的朋友可以跟一下。
[HKEY_USERS\Software\WangRenJun\学生成绩统计\Settings]
"Key"="D8DCC6A9-6340b89b-D83BC78A"
"窗口状态"=hex:2c,00,00,00,00,00,00,00,01,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,\
ff,ff,ff,ff,ff,ff,8d,00,00,00,5c,00,00,00,8d,03,00,00,77,02,00,00
"新建文档"=dword:00000000
总结:没什么技术含量,就不多说了。
给楼主的建议:
1、三处校验均为检查文件大小,可偿试多用几种。
2、第二处校验思路比较好,如果不出现明码,再把算法弄强一些,就更好了。
3、至少要让用户试用吧,否则只会让用的人产生厌恶,然后想办法破。。。