• 标 题:在转贴一个,谁的?JOJO的!!! (6千字)
  • 作 者:8086[CCG]
  • 时 间:2001-7-25 19:16:15
  • 链 接:http://bbs.pediy.com

漫谈CrackMe之三
                          试谈TEXme v1.0的破解

    大家好,又见面了。不知大家看了上篇文章是否对KEY文件认证有些心得。今天我们看看
另一种风格的CRACKME软件。这次我们分析的是TEX99的TEXme v1.0版本。等级2级。虽然2
级,但加密去着实不弱。软件可以到下面地址下载。



    此CRCAKME属于循环运算,在程序被展开后就开始循环计算NAME和SERIAL,等你添入正
确的NAME和SERIAL显示"YES! You found your serial!!"循环停止,否则显示
"Your serial is not valid."。这可以从下面的分析中看到。

    我们先来看看破解的思路,先用W32反编译程序。查找有关的字串,这里就不再累述过程。
然后向上找可疑跳转,确定断点后用ICE动态分析,最终找到正确的SERIAL。

    首先用W32载入texme.exe,老步骤,打开“REFS”查找字符串"YES! You found your serial!!",找到了双击。看到以下程序:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004012B6(C)  ;这里有情况,说明这里是由004012B6处跳转来的。
|

* Possible StringData Ref from Data Obj ->"YES! You found your serial!!"
                                  |
:004012CE 687F304000              push 0040307F
:004012D3 FF357C314000            push dword ptr [0040317C]

* Reference To: USER32.SetWindowTextA, Ord:0221h
                                  |
:004012D9 E850020000              Call 0040152E
:004012DE 33C0                    xor eax, eax
:004012E0 C9                      leave
:004012E1 C21000                  ret 0010

    查找004012B6,看到以下程序:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004012A6(C)  ;这里同上,说明这里是由004012A6处跳转来的。
|
:004012AE A267314000              mov byte ptr [00403167], al
:004012B3 83F810                  cmp eax, 00000010  ;在这里。
:004012B6 7416                    je 004012CE ;不跳就失败了。

* Possible StringData Ref from Data Obj ->"Your serial is not valid."
                                  |
:004012B8 6865304000              push 00403065
:004012BD FF357C314000            push dword ptr [0040317C]

* Reference To: USER32.SetWindowTextA, Ord:0221h
                                  |
:004012C3 E866020000              Call 0040152E
:004012C8 33C0                    xor eax, eax
:004012CA C9                      leave
:004012CB C21000                  ret 0010


    我们修改004012B6处"je"成"jnz"。程序被暴力破解。可是CRACKME是不准打补丁的。
我们只好继续分析了。查找"004012A6",找到,看到以下程序:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401274(C)      ;我们先不向上看了。
|
:0040128D 3D13010000              cmp eax, 00000113  ;这里断一下试一试
:00401292 7550                    jne 004012E4
:00401294 E8BA010000              call 00401453      ;Call里是什么呢?
:00401299 0FBE0566314000          movsx eax, byte ptr [00403166]
:004012A0 3A0567314000            cmp al, byte ptr [00403167]
:004012A6 7506                    jne 004012AE
:004012A8 33C0                    xor eax, eax
:004012AA C9                      leave
:004012AB C21000                  ret 0010

    用ICE中的Symbol Loader载入程序,运行,中断在程序入口处。BPX 40128D,然后
F5,程序被中断,F5又中断,程序已经进入循环。证明我们还是没有找错。BD *,F5。添
入NAME和SERIAL,Ctrl+D,BE *,F5,程序被中断。待程序运行到00401294处F8进入,
看到以下程序:

:00401453 55                      push ebp
:00401454 8BEC                    mov ebp, esp
:00401456 83C4FC                  add esp, -4
:00401459 8925A0314000            mov dword ptr [004031A0], esp
:0040145F 8D2552314000            lea esp, dword ptr [00403152]
:00401465 0FBE0566314000          movsx eax, byte ptr [00403166]
:0040146C 03E0                    add esp, eax
:0040146E C3                      ret  ;关键是RET后到哪里。

    RET后程序到这里:

:00401361 8D3D8C314000            lea edi, dword ptr [0040318C]
:00401367 0FBE0568314000          movsx eax, byte ptr [00403168]
:0040136E 03F8                    add edi, eax
:00401370 FE0568314000            inc byte ptr [00403168]
:00401376 A188314000              mov eax, dword ptr [00403188]
:0040137B 8B25A0314000            mov esp, dword ptr [004031A0]
:00401381 40                      inc eax ;加1
:00401382 FF0588314000            inc dword ptr [00403188] ;迷惑项
:00401388 3307                    xor eax, dword ptr [edi]
:0040138A A388314000              mov dword ptr [00403188], eax
:0040138F 803D6831400010          cmp byte ptr [00403168], 10
:00401396 7507                    jne 0040139F
:00401398 80056631400004          add byte ptr [00403166], 04
:0040139F C9                      leave
:004013A0 C3                      ret  ;出去还会回来的。呵呵。 

  这段是程序的关键所在,如果你看得懂,程序就破解一半了。基本是这样的,D 40318C
你可以看到你输入的NAME,过401376程序段后 ? EAX后可以看到你输入的SERIAL,而
403168则是一个计数器,它的值到16后就跳转出循环。程序在循环中这样取NAME的字符
ASCII码,不足16位以ASCII码"00"补齐。比如我的NAME:jojo[CCG],先取"j"的ASCII
值与你的SERIAL值加1后相异或,也就是00401382程序段。然后把结果送到403188中再把
"o"的ASCII值与上次相异或的结果加1后再相异或。结果再送到403188中,一直循环16次,
然后出循环。

  出循环会到哪里呢?中断程序段0040128D,按F5,观察EAX的值,会有2次"111",2次
"138"后,出现"113",这时单步走没有多久可以看到以下程序:

:0040149C A188314000              mov eax, dword ptr [00403188]
:004014A1 0578241109              add eax, 09112478
:004014A6 85C0                    test eax, eax 
:004014A8 7509                    jne 004014B3  ;如果不跳就万事大吉了

  我们来算个算术题:0-09112478=F6EEDB88,就是说我们刚才异或半天的值等于
F6EEDB88就不会跳转,这样就使以下程序:

:004012AE A267314000              mov byte ptr [00403167], al
:004012B3 83F810                  cmp eax, 00000010  ;在这里。
:004012B6 7416                    je 004012CE ;不跳就失败了。

成功跳转,注册成功!

    这样我们依此反推就可以得到正确的SERIAL。如果大家嫌太麻烦就自己做一个注册机吧。

    好了,今天就到这里吧!休息、休息一下!!!对,差一点忘了,我的

    NAME:jojo[CCG]  SERIAL:3635081415

    谨以此文献给我们可爱的CCG,希望它蒸蒸日上!


                                              jojo [CCG]
                                                2000.5.9

#################################
#  欢迎光临【密界寻综】JOJO的家    #
#                              #
#      jojocrack@371.net      #
#    http://jojohome.126.com    #
# http://grwy.sqinfo.ha.cn/jojo #
#################################