这几天在研究Crack,为了研究VB PCode Crack方法,就找了这个
开心斗地主的最新版本来试手。
开心斗地主1.6标准版,的确不错,挺好完的。它的保护方法也挺
乐的。刚安装上它的时候,你有30次使用次数,就为了保护这个次数
开心斗地主也完了不少花招,注册表里记录的是没用的,它在系统system
目录下生成两个文件Olive.DLL和Coierd.CPL,其中以Coierd.CPL为主。
实际上Coierd.CPL是Olive.DLL的内容以ASC码值存储。一但发现这些信息
不符,立即提示说非法注册,好阴险哦。
当然我们不会局限于这种修改,现在我们就开始用工具来获取真正的注册码。
先用fileinfo来检查一下开心斗地主是否加壳,哈哈,UPX V1.06几个大字显示眼前,
OK,UPX的-d选项来脱壳,好了,现在用W32Dasm来反汇编,看有没有什么收获,
嗯,这个字符串“UFO8769967”有点可疑,进入引用之处看看,啊哟,太多了,
引用它的地方太多了,算了,还是用TRW2000来对付它吧。
OK,先把MSVBVM50.dll,拷贝到TRW200的DLL目录下面,因为待会我们要用
rtcMsgBox来作断点。运行TRW2000,提示已经Load MSVBVM50.dll,现在读入
开心斗地主,到注册窗口,输入注册名,注册码,随便了。我输入Leafred及56376058,
按Ctrl+N到TRW2000,打入bpx rtcMsgBox,F5回到程序,按确定,被TRW2000中断,
按F2,在按F10来到调用处,发现在XXXX:004C16D5,好,现在再来到W32Dasm,从
XXXX:004C16D5,向上读,发现按钮处理入口在XXXX:004C0100,好,现在重新以
bpm 004C0100 X,作断点,重新注册,现在进入了TRW2000,好,追踪吧。
拿好纸和笔,以下要耐心,并不时D EAX、D EDX等等,检查什么时候,读取字符,什么时候
进行比较。我在下面列出部分:
用户名是否为空判断===》:
017F:004C07C6 PUSH EAX
======== 》》 EAX 是我们输入的用户名。
017F:004C07C7 PUSH DWORD 00440408 ====》》 为空
017F:004C07CC CALL `MSVBVM50!__vbaStrCmp` =====》》这里判断输入用户名是否为空。
017F:004C07D2 NEG EAX
====》》 你可以试试,把返回值改掉,会弹出提示请输入用户名。
017F:004C07D4 SBB EAX,EAX
017F:004C07D6 INC EAX
017F:004C07D7 NEG EAX
017F:004C07D9 MOV [EBP+FFFFFEAC],AX
017F:004C07E0 LEA ECX,[EBP-60]
017F:004C07E3 CALL `MSVBVM50!__vbaFreeStr`
017F:004C07E9 LEA ECX,[EBP-80]
017F:004C07EC CALL `MSVBVM50!__vbaFreeObj`
017F:004C07F2 MOVSX ECX,WORD [EBP+FFFFFEAC]
判断注册码是否为空===》:
017F:004C0A12 MOV EDX,[EBP-60]
017F:004C0A15 PUSH EDX
======》》EDX 输入的注册码。
017F:004C0A16 PUSH DWORD 00440408
017F:004C0A1B CALL `MSVBVM50!__vbaStrCmp`
017F:004C0A21 NEG EAX
017F:004C0A23 SBB EAX,EAX
017F:004C0A25 INC EAX
017F:004C0A26 NEG EAX
017F:004C0A28 MOV [EBP+FFFFFEAC],AX
其中某一判断===》》:
017F:004C0F5D MOV EDX,[EBP-60]
017F:004C0F60 PUSH EDX =======》》输入的用户名
017F:004C0F61 PUSH DWORD 004433C0 =======》》比较杂乱五章的字符,其实很有用。
017F:004C0F66 CALL `MSVBVM50!__vbaStrCmp`
017F:004C0F6C NEG EAX
017F:004C0F6E SBB EAX,EAX
017F:004C0F70 INC EAX
017F:004C0F71 NEG EAX
017F:004C0F73 AND BX,AX
017F:004C0F76 MOV EAX,[EBP-64]
017F:004C0F79 PUSH EAX =============》》 输入的注册码。
017F:004C0F7A PUSH DWORD 004433D0 =======》》“http://ufocn.coc.cc”
017F:004C0F7F CALL `MSVBVM50!__vbaStrCmp`
017F:004C0F85 NEG EAX
017F:004C0F87 SBB EAX,EAX
017F:004C0F89 INC EAX
017F:004C0F8A NEG EAX
017F:004C0F8C AND BX,AX
017F:004C0F8F MOV [EBP+FFFFFEA4],BX
此处对于破解非常重要====》:
017F:004C1373 MOV ECX,[EBP-6C]
017F:004C1376 PUSH ECX =======》输入的用户名
017F:004C1377 MOV EDX,[EBP-68]
017F:004C137A PUSH EDX ========》》一些字符。
017F:004C137B CALL `MSVBVM50!__vbaStrCmp`
017F:004C1381 NEG EAX
017F:004C1383 SBB EAX,EAX
017F:004C1385 INC EAX
017F:004C1386 NEG EAX
017F:004C1388 MOV [EBP+FFFFFEA0],AX
十日注册码之处====》:
017F:004C15CE MOV EDX,[EBP-70]
017F:004C15D1 PUSH EDX =======》 输入的注册码
017F:004C15D2 PUSH DWORD 00442B78 ===》“UFO8769967”
017F:004C15D7 CALL `MSVBVM50!__vbaStrCmp`
这里如果我们让他相等,则提示十日注册成功。
由此可以看出我们在W32Dasm中看到的“UFO8769967”是十日注册码。
现在我们已经有了十日注册码,可以用一阵子了。
下面再来找标准注册码,
我们已经看到
017F:004C1373 MOV ECX,[EBP-6C]
017F:004C1376 PUSH ECX =======》输入的用户名
017F:004C1377 MOV EDX,[EBP-68]
017F:004C137A PUSH EDX ========》》一些字符。
017F:004C137B CALL `MSVBVM50!__vbaStrCmp`
017F:004C1381 NEG EAX
现在肯定是不相等的,如果我们把这里改为相等,会怎么样呢,哈哈,注册成功。
但再运行时,有不行了。看来它每次重新比较。不过我们已经知道这里时比较关键了,
我们再试试改注册名和注册码,发现EDX里的值只随注册码而变化,这样我们就可以
随便输入注册码,然后获取注册用户,当然可以根据算法来根据注册名反算出注册码,
但我不想再去研究算法了。OK,现在,以bpm 4c1373 X,为断点,随便输入注册码,
输入:547865,中断后,运行到017F:004C137B,D EDX 发现了什么Txe,现在重新运行
程序,输入注册名Txe,注册码547865,哈哈,发现什么,恭喜、恭喜,注册成功!!
- 标 题:开心斗地主1.6标准版 注册码破解 (4千字)
- 作 者:Leafred
- 时 间:2001-4-25 21:33:04
- 链 接:http://bbs.pediy.com