欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

在转贴一个,谁的?JOJO的!!! (6千字)

在转贴一个,谁的?JOJO的!!! (6千字)

漫谈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 #
#################################

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功