欢迎来到 嗅灵易学

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

当当虾和豆豆虾crackcode突破25位限制的分享笔记 (9千字)

当当虾和豆豆虾crackcode突破25位限制的分享笔记 (9千字)

各位大虾好:
    我是当当虾,对了,那外号为"豆豆虾"的是我非常好的网友,最近他从事销售
要出远门,跑客户,所以不会常来,我暂时接替他。他一句话:都是为了生活。
生活本来就是很乱,的确啊!还是古人云的好:生活本来就是一团麻绳,理也理不清。
呵呵~~~但是有一点是使我本人都很欣慰的事情:很开心,而且有空的时间可以做
自己喜欢的事,一句话"走自己的路,让别人羡慕去吧!"(据说,这句话是出自一位
crack老前辈对新生辈出年代的询询教诲! )

        话说回来,想当初我的好友"豆豆虾",一来看雪论坛就"炸"道,我想也许是有
两点原因在这里解释一下:
1、无论如何,人都是有虚荣心,想出点小名很正常,其实一个主要原因想得到别人的认
可。我本人比较欣赏通过自己的实力去得到别人的认可。
2、"炸"道本身谐音,有点标新立异,其根本的就是在众目睽睽下,想吸引别人的注意。
芸芸众生过往云烟。所以啊!比如这一招式,在追女仔中非常常见,好好体会和掌握吧!
哈哈~~~ 我和"豆豆虾"都是光有理论无实践。 估计有人要吐啦。。。。哈哈~~
       
        我当当虾在这表示歉意。此次的目的,是想把"炸坏的道路给修一修",
"将功补过"吧!豆豆虾曾经把修改crackcode的过程讲述过,经过我的再跟踪,写写凑凑
一番,"文物"得以出土问世。哈哈~~~~
【如何突破crackcode的25位限制】
1、突破crackcode的25位限制的经过
    在论坛中,有一些贴子常提到crackcode存在25位的限制。可是rufeng又隐退江湖,
(江湖盛传他可能在修炼内功,准备东山再起)。于是好友豆豆虾(学过一点汇编,知道
一些常用工具的使用),凡心欲动,本意是想一一步分析,对代码原理有个总的了解。
然后再对证下药。所谓手到病除。他说如果一一分析下去,也许在作修改的时候,就不
会在一个数据结构上兜圈子,当时猜想rufeng是定义一个25位的字符数组,没有考虑到
获得的结果会超过25位的情况。 【爆破,可以采取直捣黄龙;作注册机,得看懂整个注册
码;修改代码,得看懂程序的实现原理,然后再OEM自己的思路。】    
2、为什么crackcode存在25位限制(打算介绍简单些,因为它牵扯到的面比较广)
        crackcode调用getthreadcontext函数,返回一个结构指针,利用其读取被跟踪
程序的寄存器(eax、edx...)中的值(这个函数的功能非常的棒)。rufeng巧妙的应用
了六个寄存器(Edi,Esi,Ebx,Edx,Ecx,Eax),返回它们注册码,一个寄存器
只能存4个字符,所以6*4=24,确切的说,crackcode取到的字符长度不能超过24个。
比如EAX=44324432--->储存"D2D2"四个字符。
3、如何突破它的限制??
    如果把程序通读一遍,似乎发现没有办法去突破这个限制,因为这是设计上的
失误。如果细细去琢磨crackcode,会发现它两次调用getthreadcontext函数。其实第
一次的时候,就可以得到要读取注册码的地址。根据crackcode.ini中Save_Code_Address
的值,对应寄存器储存的值。为什么crackcode要去两次调用getthreadcontext函数,其中
的奥秘,把程序认认真真的通读几遍(读到凌晨4点,窗外一片寂寂。在路灯下,几个清洁
工的身影,默默无闻的清洗大地,在我们匆匆来往的街道,还以清爽的感觉。)
好了!上面既然第一次调用的时候,已经能确定注册码的位置,何不拿它示问。于是可以
调用ReadProcessMemory,把注册码得到。
4、修改程序(代码修改位置401448---40149B)
    我这有豆豆虾修改时的草稿:
=========判断save_code_address需要读取的寄存器===========    
----deal with ebp----
mov ebx,40a64c  -------crackcode对save_code_address处理后存放的地址
mov ecx,40a1cc
mov al,byte ptr [ebx]
cmp al,0f5      -------为什么要进行这样比较,crackcode代码分享笔记(三)中
            有讲述。我把相关的部分放在附录中。
je final
----deal with eax----
sub ecx,4
cmp al,0f0
je final
----deal with ecx----
sub ecx,4
cmp al,0f1
je final
----deal with edx----
sub ecx,4
cmp al,0f2
je final
----deal with ebx----
sub ecx,4
cmp al,0f3
je final
----deal with esi----
sub ecx,4
cmp al,090
je final
----deal with edi----
sub ecx,4
//cmp al,0f7
==================================
==========以下为从内存中读取注册码,并显示========
final:
---deal with mem---
push 0
push 28 //size
push 409B80  //buffer    ======缓冲区
push d,[ecx] //baseaddr  ======存放注册码的地址。
push d,[40a410] //hprocess
call d,[405024]      ====调用ReadProcessMemory.从存放注册码的地址读入缓冲区
---deal with mem---
display:
  mov ebx,409B80  ===显示缓冲区
  jmp 40149c
结束语:所有的人都恐惧孤独,但唯有在孤独之中,我们才能学会了解自己,学习如何处理
我们自己永恒的孤独。 :)
【爆破,可以采取直捣黄龙;作注册机,得看懂整个注册码;
修改代码,得看懂程序的实现原理,然后再OEM自己的思路。】
       
                                                                                    当当虾      耗时:6小时
                            2001年8月24日 18:07 
附录:
* Possible StringData Ref from Data Obj ->"EAX"
                                  |
:004011A7 68AC614000              push 004061AC
:004011AC 56                      push esi      --》"Save_Code_Address"
:004011AD E81E080000              call 004019D0
:004011B2 59                      pop ecx
:004011B3 85C0                    test eax, eax
:004011B5 59                      pop ecx
:004011B6 7511                    jne 004011C9
:004011B8 C605609740008B          mov byte ptr [00409760], 8B
:004011BF C7054CA64000F0909090    mov dword ptr [0040A64C], 909090F0
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011B6(C)
|
* Possible StringData Ref from Data Obj ->"EBX"
                                  |
:004011C9 68A8614000              push 004061A8
:004011CE 56                      push esi
:004011CF E8FC070000              call 004019D0
:004011D4 59                      pop ecx
:004011D5 85C0                    test eax, eax
:004011D7 59                      pop ecx
:004011D8 7511                    jne 004011EB
:004011DA C605609740008B          mov byte ptr [00409760], 8B
:004011E1 C7054CA64000F3909090    mov dword ptr [0040A64C], 909090F3
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011D8(C)
|
* Possible StringData Ref from Data Obj ->"ECX"
                                  |
:004011EB 68A4614000              push 004061A4
:004011F0 56                      push esi
:004011F1 E8DA070000              call 004019D0
:004011F6 59                      pop ecx
:004011F7 85C0                    test eax, eax
:004011F9 59                      pop ecx
:004011FA 7511                    jne 0040120D
:004011FC C605609740008B          mov byte ptr [00409760], 8B
:00401203 C7054CA64000F1909090    mov dword ptr [0040A64C], 909090F1
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011FA(C)
|
* Possible StringData Ref from Data Obj ->"EDX"
                                  |
:0040120D 68A0614000              push 004061A0
:00401212 56                      push esi
:00401213 E8B8070000              call 004019D0
:00401218 59                      pop ecx
:00401219 85C0                    test eax, eax
:0040121B 59                      pop ecx
:0040121C 7511                    jne 0040122F
:0040121E C605609740008B          mov byte ptr [00409760], 8B
:00401225 C7054CA64000F2909090    mov dword ptr [0040A64C], 909090F2
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040121C(C)
|
* Possible StringData Ref from Data Obj ->"EDI"
                                  |
:0040122F 689C614000              push 0040619C
:00401234 56                      push esi
:00401235 E896070000              call 004019D0
:0040123A 59                      pop ecx
:0040123B 85C0                    test eax, eax
:0040123D 59                      pop ecx
:0040123E 7511                    jne 00401251
:00401240 C605609740008B          mov byte ptr [00409760], 8B
:00401247 C7054CA64000F7909090    mov dword ptr [0040A64C], 909090F7
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040123E(C)
|
* Possible StringData Ref from Data Obj ->"ESI"
                                  |
:00401251 6898614000              push 00406198
:00401256 56                      push esi
:00401257 E874070000              call 004019D0
:0040125C 59                      pop ecx
:0040125D 85C0                    test eax, eax
:0040125F 59                      pop ecx
:00401260 7511                    jne 00401273
:00401262 C6056097400090          mov byte ptr [00409760], 90
:00401269 C7054CA6400090909090    mov dword ptr [0040A64C], 90909090
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401260(C)
|
* Possible StringData Ref from Data Obj ->"EBP"
                                  |
:00401273 6894614000              push 00406194
:00401278 56                      push esi
:00401279 E852070000              call 004019D0
:0040127E 59                      pop ecx
:0040127F 85C0                    test eax, eax
:00401281 59                      pop ecx
:00401282 7511                    jne 00401295
:00401284 C605609740008B          mov byte ptr [00409760], 8B
:0040128B C7054CA64000F5909090    mov dword ptr [0040A64C], 909090F5
====以上程序是对处理Save_Code_Address不同值,做相应的处理======
相当于
switch( Save_Code_Address )
{
    case 'EAX':
        code1=8B;
    code2=909090F0;
    break;
    case 'EBX':
        code1=8B;
    code2=909090F0;
    break;
    case 'EC':
        code1=8B;
    code2=909090F0;
    break;
    case 'EDX':
        code1=8B;
    code2=909090F0;
    break;
    case 'EDI':
        code1=8B;
    code2=909090F0;
    break;
    case 'ESI':
        code1=90;
    code2=909090F0;
    break;
    case 'EBP':
        code1=8B;
    code2=909090F0;
    break;
}

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

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

0 0 0 举报
复制成功