• 标 题:开心斗地主1.6标准版 注册码破解 (4千字)
  • 作 者:Leafred
  • 时 间:2001-4-25 21:33:04
  • 链 接:http://bbs.pediy.com

这几天在研究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,哈哈,发现什么,恭喜、恭喜,注册成功!!