• 标 题:Advanced Evaluator 3.5 (另一强大的科学计算器--注册运算也很强大哟)破解~~新手请进~~有详细注解~高手们做... (12千字)
  • 作 者:Sam.com
  • 时 间:2001-3-10 14:26:44
  • 链 接:http://bbs.pediy.com

标题: Advanced Evaluator 3.5 (另一强大的科学计算器--注册运算也很强大哟)破解~~新手请进~~有详细注解~高手们做个注册机吧~~~呵呵

内容:
差点就要放弃啦~~~~~~~


软件名称:Advanced Evaluator 3.5 (功能强大的科学计算器)
下载地址:http://61.134.4.193:8080/appsoftware/calculator/ae35.zip (708KB)
注册形式:Name & Key (我用了Name:Sam Von Key:67676767) 30天限制,过了30天就不能用了
破解原因:同上次一样,找了一大堆计算器想算注册码,这个也一样不合我心意,但它有注册保护,刚好可以练一下
          但这个比上次那个难多啦(对于我来说),看我的标题就知道啦,不过这次可增加了我不少经验值,顺便问
          下大家,有哪个计算器软件或其它工具可以进行汇编的shl,nor,rol,xor等这些逻辑运算的请告诉我下载
          地址~~~~谢谢大家~~~~

破解过程及心得:
        这次破解简直是瞎猫捉到死老鼠,一开始当然是例行公事一样的填入我的Name&Key,打开Trw2000,输入bpx hmemcpy,然后按确定,Booom~~~Trw拦下来啦,然后就bd、pmodule,来到了程序的代码中,呵呵~~~~有谁算过这个过程要多长时间。通常来说这时我都会看看各个寄存器的值,一般来说这时eax的值就是你Name or Key的长度,而我这里是我Name的长度7,好啦它读了我的Name,马上用s命令查找'Sam Von'(s命令会用吧,反正我刚学的时候就不怎么会用,谁不懂就问吧),找到啦,当然是“bpm 地址 rw”啦,这个命令很好用的,只要任何程序读写了存放我的Name的地址,Trw就会中断了,我的猜想是程序读我的Name作比较或者作运算或者把它放到第二个地址去,所以我通常有个习惯就是用bpm把所有存放我Name & Key的地址都设中断,反正程序一读我的Name&Key就是要做小动作啦,所以这样比较容易跟也容易找到核心,当程序再次中断时,我发现它在拿我的Name和sudi比较,但我用sudi来注册时一样出错,那这个可能是黑名单吧,这里应该不是重点,再跟~~~~~~~又发现程序在查我Name的二进制,要用到二进制来运算,麻烦啦,继续~~~~~~中间好多F8 F10的不停的按,反正要注意各寄存器的值,在Trw中的汇编代码窗口右上角的提示很重要,多多留意,一发现出现有疑的数据就要d来看看。其中有几个地方应该都是运算重点,但我没有贴出代码,只给出地址,有兴趣的就自己看看吧:在4027EC处程序用我Name的16进制加上某个地址再与另一地址比较;在478B1B处程序作了运算(用了除法等命令);在479471-->4794B0处程序将我Name的二进制连续放在内存中然后比较、查表、运算。最下面我贴出那些代码是对Key的比较运算,反正我再跟下去就晕啦,因为后面的call很多,运算也很复杂,我看不懂代码,但我想后面应该就是运算核心啦,高手们可以研究一下。上面的过程我花了两天时间,始终搞不懂,你一定想问我为什么不用反汇编呢,其实我一早用过啦,程序是Delphi写的,里面一点有用的字串都没有,只有十多行而已(BTW:为什么纯Delphi的程序用W32dasm反汇编后在字串表中都只有几行呢,是程序本身的设计还是Delphi的限制呢),我开始怀疑是否是我的起点过高呢~~~~~~~~~~~~呵呵
        眼花啦~~~~每次看下面运算的代码都不得重点,我实在看不懂运算的过程,而且后面的call太多啦,唉没心机啦,于是像傻子一样不停的按F10~~~~忽然在4799AB处停了下来,其实这里我以前也来过几次,不过总觉得比较语句应该是cmp al,01之类的才是重要的判断,不会同2比吧,给骗了~~~这时将al改为2就完全破解啦,这完全是我无路可走才想到乱改一气的,所以说捉到死老鼠啦~~~~~呵呵
        再说两句,破解真的好累,写文章就更累~~~~这是我写的第三篇,这几天都没精神啦,另外我写的可能很乱很罗嗦,请大家原谅,我文笔本来就不好,加上我写的这些都是想保留下来以后温习用的,所以写的很详细(因为我是一个新手,功力0.6级),记得我刚开始学破解时到处找教程,但几乎每个教程都那么简单,可能我人蠢吧,很多东西看不懂,所以我就将破解的过程整理后贴出来咯,希望能帮得了一些新手,也请高手指正,毕竟这些都是我自己理解的东西~~~~难免有错的~~~~谢了~~~~~~~~~~~~~


以下为核心判断的call

* Referenced by a CALL at Addresses:
|:00478C93  , :00478CA2  , :00479039  , :00479049  , :0047974C 
|:00479780  , :004799A6 
|
:00478A48 53                      push ebx
:00478A49 56                      push esi
:00478A4A 57                      push edi
:00478A4B 55                      push ebp
:00478A4C 8BEA                    mov ebp, edx
:00478A4E B202                    mov dl, 02        <----dl=2 此为注册标志想办法保持这个数就行啦
:00478A50 8B7504                  mov esi, dword ptr [ebp+04]<---[C60994]=252E---假密码
:00478A53 8B4804                  mov ecx, dword ptr [eax+04]<---[C67F88]=1CD3---真密码
-------------------------------------------------------------------------------------------------
To:新手~~~~~~~~~~
我不知道程序将我的Name和Key作了什么运算,反正到了此处程序就拿这两个数作比较,我就称它们为真假密码吧,请留意程序并没有将密码连续放在内存中,而是分散的,它的存放是这样的[ebp(eax)]是密码的基地址,[ebp(eax)+4]是密码的值,[ebp(eax)+8]是下一个密码的基地址,程序先比较第一个密码,不等的话还会去比较第二个,这一点我就不明白啦,第一个不等就算啦嘛,为何还做下面的比较,就算后面的密码相等bl也不可能变为2呀,这是我第一次碰到的情况,所以我把它记了下来,不要说我罗嗦呀~~~~~~~~~~
-------------------------------------------------------------------------------------------------
:00478A56 3BF1                    cmp esi, ecx
:00478A58 7D04                    jge 00478A5E      <---此处esi>ecx所以跳啦
:00478A5A 33D2                    xor edx, edx      <---不跳的话edx就被清为0啦
:00478A5C EB20                    jmp 00478A7E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A58(C)
|
:00478A5E 3BF1                    cmp esi, ecx      <----再比不等dl就变为1啦
:00478A60 7E1C                    jle 00478A7E
:00478A62 B201                    mov dl, 01
:00478A64 EB18                    jmp 00478A7E      <----一定跳啦,不过dl为1啦

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A90(C)
|
:00478A66 8BC6                    mov eax, esi    <----基地址
:00478A68 8BEF                    mov ebp, edi
:00478A6A 8B7504                  mov esi, dword ptr [ebp+04]<----第二个密码22B4
:00478A6D 8B4804                  mov ecx, dword ptr [eax+04]<----211
:00478A70 3BF1                    cmp esi, ecx
:00478A72 7D04                    jge 00478A78  <------看~~就算相等也没用,刚才dl已经为1啦
:00478A74 33D2                    xor edx, edx       
:00478A76 EB06                    jmp 00478A7E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A72(C)
|
:00478A78 3BF1                    cmp esi, ecx
:00478A7A 7E02                    jle 00478A7E
:00478A7C B201                    mov dl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00478A5C(U), :00478A60(C), :00478A64(U), :00478A76(U), :00478A7A(C)
|
:00478A7E 8B7008                  mov esi, dword ptr [eax+08]<----下一个密码的基地址
:00478A81 85F6                    test esi, esi
:00478A83 0F95C1                  setne cl    <----在Trw中此句是"setnz cl" 所以cl=1
:00478A86 8B7D08                  mov edi, dword ptr [ebp+08]<----下一个密码的基地址
:00478A89 85FF                    test edi, edi
:00478A8B 0F95C3                  setne bl    <----bl=1,第二次到此bl=0下面就不跳啦共比较了四次
:00478A8E 22CB                    and cl, bl
:00478A90 75D4                    jne 00478A66 <----在Trw中此句是jnz 所以跳了
:00478A92 8B7808                  mov edi, dword ptr [eax+08]
:00478A95 85FF                    test edi, edi
:00478A97 0F94C1                  sete cl
:00478A9A 8B7508                  mov esi, dword ptr [ebp+08]
:00478A9D 85F6                    test esi, esi
:00478A9F 0F95C3                  setne bl
:00478AA2 22CB                    and cl, bl
:00478AA4 7402                    je 00478AA8
:00478AA6 B201                    mov dl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478AA4(C)
|
:00478AA8 85F6                    test esi, esi
:00478AAA 0F94C1                  sete cl
:00478AAD 85FF                    test edi, edi
:00478AAF 0F95C0                  setne al
:00478AB2 22C8                    and cl, al
:00478AB4 7402                    je 00478AB8
:00478AB6 33D2                    xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478AB4(C)
|                                                  上面的代码没能将dl=02
:00478AB8 8BC2                    mov eax, edx <---此处edx=0所以al=0 注意ret后就是比较啦
:00478ABA 5D                      pop ebp
:00478ABB 5F                      pop edi
:00478ABC 5E                      pop esi
:00478ABD 5B                      pop ebx
:00478ABE C3                      ret

=================================================================================================

:0047999A 8B45EC                  mov eax, dword ptr [ebp-14]
:0047999D 8945F0                  mov dword ptr [ebp-10], eax
:004799A0 8B55F4                  mov edx, dword ptr [ebp-0C]
:004799A3 8B45F0                  mov eax, dword ptr [ebp-10]
:004799A6 E89DF0FFFF              call 00478A48 <----上面的代码
:004799AB 3C02                    cmp al, 02    <----呵呵~~~~~~~看下面的代码,根本没有跳转语句,跟
                                                    进后面的call找不到重点,所以说我是瞎撞的
-------------------------------------------------------------------------------------------------
在此如果将al改成02就OK啦(这里看起来很简单,当然啦这是结果,但想想之前的过程真的很恐怖,好多次想放弃啦,有耐心才会成功的,不过还要有点运气,有时按着F8就睡着啦,等你睡醒后看一眼,可能关键处就在那等左你呢~~~~~~哈哈)NAG消失,进入程序,再次运行,完全没问题,看看About没我的名字,Why??程序怎么判断我注册呢?注册表???好了,Regmon出手,程序读了HKEY_CURRENT_USER\AppEvents\precomp,好啦,试试改名,呵呵~~~~~~~出来啦,要我注册,其实程序并没有保存我的Name&Key只是如果不注册,此键值就有个标志,注册了就改为另一个标志(都不是明文,记不下来),气死我啦,把它改为Sam.com~~~~咦!!眼花了????怎么没叫我注册呢?再改为Sam Von~~~~我拷~~~还是进去了,原来程序只有一个不注册的标志,只要键值不是它就行啦,这东西注册挺贵的,不会这么儿戏吧,不过这鍵不是这么容易就能找得到的(找到也不敢乱动它吧呵呵~~~~~~~~~~~~),而且它的注册码算法很复杂(个人认为),请留意下面我提供的算法代码,注册码保护得这么好这里却~~~~~这该怎么形容呀~~~~哈哈哈哈~~~想不起~~~我语文很差的~~~~呵呵
-------------------------------------------------------------------------------------------------
                                 
:004799AD 8B4508                  mov eax, dword ptr [ebp+08]
:004799B0 0F9400                  sete byte ptr [eax]
:004799B3 8D45F0                  lea eax, dword ptr [ebp-10]
:004799B6 E869EEFFFF              call 00478824
:004799BB 8D45F4                  lea eax, dword ptr [ebp-0C]
:004799BE E861EEFFFF              call 00478824
:004799C3 33C0                    xor eax, eax
:004799C5 5A                      pop edx
:004799C6 59                      pop ecx
:004799C7 59                      pop ecx
:004799C8 648910                  mov dword ptr fs:[eax], edx
:004799CB 68E5994700              push 004799E5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004799E3(U)
|
:004799D0 8D45F8                  lea eax, dword ptr [ebp-08]
:004799D3 BA02000000              mov edx, 00000002
:004799D8 E8AF9FF8FF              call 0040398C
:004799DD C3                      ret


以下应该是注册码算法的核心开始,想研究密码算法的请看看吧,我功力还不够~~~~~~~~~~~

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00479592(C)
|
:0047956D 8D45F8                  lea eax, dword ptr [ebp-08]
:00479570 8B55FC                  mov edx, dword ptr [ebp-04]<---此行运行过后d edx=>[edx]=67676767                                                                是我输入的注册码,已变为Hex的啦
:00479573 4E                      dec esi
:00479574 3B72FC                  cmp esi, dword ptr [edx-04]
:00479577 7205                    jb 0047957E
:00479579 E80697F8FF              call 00402C84

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00479577(C)
|
:0047957E 46                      inc esi
:0047957F 0FB65432FF              movzx edx, byte ptr [edx+esi-01]<---注册码第一位edx=67
:00479584 8B9495F8FBFFFF          mov edx, dword ptr [ebp+4*edx-00000408]<--注意edx参与了运算我猜                                                      它在查表,过了这行就d edx,二进制??算一算原来
                                                    是67的二进制,所以我开始怕了,这两个call我跟进                                                      去却搞不懂,头晕啦,高手请吧
:0047958B E85CA6F8FF              call 00403BEC
:00479590 46                      inc esi
:00479591 4B                      dec ebx
:00479592 75D9                    jne 0047956D
:00479594 EB12                    jmp 004795A8  <---这里跳过去后应该就是算法的核心,高手研究一下吧

这段代码要运行好几次,因为注册码和姓名的每一位查表运算都要经过这里,我觉得好复杂呀,后面的代码我就不贴了,因为有很多call很难写清楚,请大家反汇编后找一找吧~~~~~~~~不说啦~~~~~~我开始眼花啦~~~~~~~


                                                                              13:33 2001-3-10