首页
社区
课程
招聘
[原创]1-Click PC Tuneup软件-破解实录-[上][中][下]-(图文+算法+注册机源码)
发表于: 2013-10-15 13:53 17933

[原创]1-Click PC Tuneup软件-破解实录-[上][中][下]-(图文+算法+注册机源码)

2013-10-15 13:53
17933

标 题: 【原创】1-Click PC Tuneup软件-破解实录-[上][中][下]-图文并茂
作 者: 猪头三
网 站: http://www.x86asm.com
时 间: 2013-10-15 13:53:35
链 接: http://bbs.pediy.com/showthread.php?t=180072

[序言]
脱离玩破解已经好几年了, 由于前段时间在休息, 闲来玩玩, 随便找了一款国外软件1-click pc tuneup软件下手. 本人玩破解的原则是: 随便玩玩, 不跟经济利益挂钩, 选择无壳软件. 破解的目的是复习和巩固逆向思维, 而不是耗费时间和生命去研究各种刁蛮的加壳, 用自动脱壳工具就Ok了.

[本文介绍]
本文章一共分为10部分, 完全图文并茂, 分享在破解过程中的思维想法, 阅读本文需要一定的汇编语言, C/C++语言, 程序运行原理, 有开发软件实际经验, 熟悉Windows操作系统理论, 有基本的算法理论基础, 技术难度中等偏上.
1> 初步了解破解环境的部署
2> 初步了解1-click pc tuneup软件的主程序基本特征
3> 利用ollydbg定位你的处理注册号的函数
4> 多次陷入困境
5> 通过Qt类库的QString类相关函数找到处理注册号的函数
6> 开始分析处理注册号的函数
7> 不要满足直接获取注册号码
8> 分析注册号的输入规则 
9> 分析注册号码的生成算法
10> 为1-click pc tuneup软件写注册机


[请做好基础知识储备]
上面已经提到需要相关的基础知识, 如果您在阅读文章之前基础不扎实, 有可能你不会明白文章所要表达的含义. 破解领域太广太深, 接触和学习破解之前, 最好都需要会编程, 这是必须要具备的技能.

>>>>>>>>>>>>>>> 第一部分: 初步了解破解环境的部署 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

要破解一款软件(主要目的是获取该款软件的注册号码), 不光需要扎实的汇编语言, C/C++语言, 程序运行原理, 熟悉Windows操作系统理论, 最好能具备有一定的软件开发经验, 以及基本的算法理论基础. 假设你这些技能都具备了, 那么我们可以选择3个工具来进行破解某款软件:
1. ollydbg : 一款Windows操作系统平台上, 针对32位汇编的分析调试工具. 在没有源码可参考的情况下,用来分析二进制代码有着非常强大的优势和好处. 该款软件属于动态分析范畴



2. ida pro : 一款支持Windows、Mac Os X 和 Linux的多平台反编译和调试工具. 该款软件属于静态分析工具, 但随着功能的不断强大, 已经支持动态分析.



3. Detect it Easy : 一款专门分析程序文件格式的软件. 当然还有其他相关的代替软件比如: PeID



其实破解一款软件需要的工具不止上面提到的3款, 这里仅仅只介绍了重要的也是不可缺少的. 如果你需要破解一个复杂度较高的软件, 那么应该根据实际情况考虑使用多种辅助破解工具来配合. 但这里就不做详细介绍了, 因为不是本文的核心.

>>>>>>>>>>>>>>> 第二部分: 初步了解1-click pc tuneup软件的主程序基本特征 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

今日我们随便选择了一款国外软件名为1-click pc tuneup, 这是一款Windows操作系统维护工具, 虽然破解的目标软件已经选择好了, 但这款软件是否符合我的能力范围来进行破解呢?大家都知道, 矛与盾都是对立发展的, 我作为破解方那就是"矛", 1-click pc tuneup这款软件就是被破解方也就是“盾”。如果这个“盾”过于强大, 而我的"矛"过去脆弱, 那就是我的破解能力还达不到击破这个软件的水平. 因此要破解一款软件, 首先要衡量自己是实力, 你当前的实力能破解到哪种类型的软件. 因此根据这个思考原则, 我目前的实力也就只能破解那些采用Delphi VC++工具开发的软件, 并且还没有进行二次解密过的软件, 也就说我们通常说的"加壳". 



下面我们就通过Detect it Easy这款程序来了解1-click pc tuneup这款软件的基本特征, 也就是需要了解这个软件是用什么工具开发的, 并且到底这个程序是否被加过密(加壳).
1. 启动 Detect it Easy -> 单击右下角"Open PE"按钮 -> 选择1-click pc tuneup软件的主程序"PCtuneup.exe"
这时候你会发现Detect it Easy已经侦测并分析出1-click pc tuneup这款是用什么开发工具写的, 以及是否被加过密(加壳), 很幸运的是1-click pc tuneup这款软件没有加过密(加壳)而且还是VC++开发的, 这完全符合我的破解能力范围.



>>>>>>>>>>>>>>> 第三部分: 利用ollydbg定位处理注册号的函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

一般来说破解目标软件并获取正确的注册号码, 我们第一步会尝试先输入一个无效的测试注册号并观察目标软件会什么反应, 比如: 错误提示信息, 是否弹出错误提示对话框. 那么我们就会通过这2个重要的信息定位到目标软件处理注册号的函数, 一旦定位成功, 那么就表示破解已经迈向成功的第一步了.

1. 下面我们开始启动ollydbg, 选择"File"->"Open", 弹出文件选择对话框之后, 找到1-click pc tuneup软件的主程序"PCtuneup.exe"并按下"打开按钮".



2. 然后在ollydbg的菜单上,选择"Debug"->"Run", 这时我们可以看到1-click pc tuneup软件已经运行起来了, 这就意味着ollydbg已经在调试1-click pc tuneup软件, 里面的汇编代码就是1-click pc tuneup软件由C/C++语言开发并被反编译过后的汇编代码.



3. 单击1-click pc tuneup软件界面右上角的下拉按钮, 选择"Activate Procude",这时就弹出注册号输入对话框. 此时我们尝试输入一个错误的测试注册号, 比如: 123456789 然后按下"Activate Now"之后会提示一个错误信息"Invaild registion code! Please make sure your regisratin code matches the current version. "



4. 好了, 现在我们有了这个长长错误信息提示字符串, 有什么作用呢? 其实原理很简单, 如果我们有软件开发经验的话, 我们脑海会马上浮现出这样一个验证注册号码的代码逻辑:
 
   char *pchar_input_key = null ;
   pchar_input_key = get_input_key() // 获取用户输入注册号码
   
   bool bool_IsValid = true ;
   bool_IsValid = check_input_key(pchar_input_key) ; // 校验注册号码的合法性
   if (bool_IsError == false)
   {
      // 注册失败
      ShowMsg("Invaild registion code!") // 注册号错误
   }
   else
   {
      // 注册成功
   }


通过上面的代码逻辑, 我们很清楚的知道只要能找到"Invaild registion code!"这个字符串的显示位置, 那么我们就很快在当前的位置附近发现校验注册号正确性的函数, 比如check_input_key()这个函数. 有了这个思路之后, 我们如何通过ollydbg定位到"Invaild registion code! Please make sure your regisratin code matches the current version. "这个错误信息字符串呢?

5. 定位错误信息字符串: 用鼠标右键单击ollydbg界面上的汇编代码区域, 然后选择”Ultra String Reference“->"1 Find ASCII" 或者 ”2 Find UNICODE“都可以, 这时会弹出"Ultra String Reference Plugin"窗口并显示1-click pc tuneup软件在运行过程中所需要到的字符串.




可是很遗憾的事情发生了, 我们并未找到"Invaild registion code! Please make sure your regisratin code matches the current version. "这个错误信息提示字符串, 估计软件的作者针对这个错误信息作了加密处理让我们不能这么简单的找到这个字符串, 也就意味着我们很难通过这样的方式来定位到处理注册号的函数.

>>>>>>>>>>>>>>> 第四部分: 多次陷入困境 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

既然错误信息提示字符串定位的方式行不通, 那还有什么其他方法可以定位到处理注册号的函数吗? 当然有, 只要我们有基本的软件开发经验, 那么还是有办法的, 比如通过找C/C++标准的字符串处理函数来定位到处理注册号的函数. 因此我们只需要思考假设要写一个验证注册号码的函数check_input_key()的时候可能会需要到什么字符串处理呢?肯定会需要 stricmp() strcat() strstr() 这类字符串, 比如假设下面的伪代码

bool check_input_key(char *pchar_param_Input)
{
   if(stricmp("123456789", "xxxxxxxxxxxx") <> 0)
   {
       // 错误的注册号
      return false; 
    }
   return ture ;
}


通过上面的伪代码可知, stricmp()是用来跟正确的注册号比较, 如果不等于0, 那么就说明”123456789“不是正确的注册号. 同理根据这样的思路, 只要我们通过ollydbg找到这个stricmp()所在的位置, 那么就相当于找到处理注册号的函数, 而且还是处理注册号的函数的内部, 这样更加可以直接看到校验注册号的具体代码, 比利用错误信息字符串提示的方式来定位, 更加精确.

1. 定位类似stricmp()函数: 用鼠标右键单击ollydbg界面上的汇编代码区域, 然后选择”Search for“->"All intermodular calls", 这时会弹出"Found intermodular calls"窗口并显示1-click pc tuneup软件在运行过程中所需要到的所有函数. 
  




2. 赶紧查看是否有stricmp() strcat() strstr()有没有这类字符串处理函数, 但完全傻眼了, 完全没有调用到这类字符串处理函数, 反而全部大量充斥着QtCrot4.??xxxxxxxxxxx、QtGui.??xxxxxxxxxxxx等等这些带有Qt标示符的函数, 我们又一次陷入的僵局.

>>>>>>>>>>>>>>> 第五部分: 通过Qt类库的QString类相关函数找到处理注册号的函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

大家如果看到这里, 可能有点迷茫了, QtCrot4.??xxxxxxxxxxx、QtGui.??xxxxxxxxxxxx 这些到底是什么函数呢?其实我们可以通过google搜索就知道这些就是Qt开发类库, 是用C++编写的, 由此可以证明1-click pc tuneup这款软件是用Qt类库开发的. 那么既然是用Qt库开发的, 此时用于处理字符串的Qt类库到底是什么呢?是不是我们可以认为只要知道Qt类库的字符串处理函数, 就可以定位到处理注册号的函数的内部呢?如同>>>第四部分: 多次陷入困境<<<描述哪样. 经过google搜索, 我们知道Qt类库处理字符串是由QString类来处理的, 因此我们只需要通过ollydbg对1-click pc tuneup软件内部所有用到Qstring类的代码都下个"断点", 那么就有可能会定位到处理注册号的函数, 而且还是处理注册号的函数的内部.

1. 定位Qstring类的所有相关函数: 用鼠标右键单击ollydbg界面上的汇编代码区域, 然后选择”Search for“->"All intermodular calls", 这时会弹出"Found intermodular calls"窗口并显示1-click pc tuneup软件在运行过程中所需要到的所有函数.

2. 在"Found intermodular calls"窗口单击有包含有"QtCore4.??0QString@@QAE@ABV0@@Z"字符串的其中一行, 然后右键选择: “Set breakpoint on every call to ??QString@@QAE@ABV0@@Z”



3. 按照第2步的方式, 也对包含有"QtCore4.??0QString@@QAE@PBD@Z"字符串或者包含有“QtCore4.??0QString@@QAE@XZ“进行处理.



4. 就这样通过上面3步介绍, 已经对QString类的所有函数进行了"断点"设置, 然后返回1-click pc tuneup软件的注册对话框, 再次按下"Activate Now", 此时ollydbg就会停顿(断下)在第一个调用QString类相关字符串处理函数的代码行. 那么我们如何确定断下来的代码行, 就是处在处理注册号的函数的附近呢?这就要观察ESP和EBP这2个堆栈显示的信息是否包含有你的测试注册号"123456789"了, 如果有, 就表明我们已经处在处理注册号的函数的附近, 如果没有, 就在继续按下F9之后, 再一次会调用QString类相关字符串处理函数的代码行, 这时你再一次观察ESP和EBP这2个堆栈显示的信息是否包含有你的测试注册号"123456789",依次反复进行, 直至看到测试注册号"123456789"为止. (重要: ollydbg每停顿(断下)一个调用QString类相关字符串处理函数时,你就必须观察ESP和EBP这2个堆栈框口, 在观察的时候小范围的用鼠标中间滚动, 上下查看数据)



通过上图的显示, 我们就可以知道

000D48DB   .  FF15 F8F20E00 CALL DWORD PTR [<&QtCore4.??0QString@@QA>;  QtCore4.??0QString@@QAE@PBD@Z

这行代码就是处在处理注册号的函数的附近.

5. 找到这行代码之后, 我们就顺着这行代码往上一行一行看, 直至看到: 

000D4720   >  55            PUSH EBP

这样代码, 就可以确认为从地址0x000D4720处开始就是处理注册号的起始地址, 也就是处理注册号的函数的第一行代码. 这里大家会有一个疑问:为什么一定要找 push ebp 这行代码呢? 这是因为push ebp是一个函数的入口点, 大多数情况都是这样. 因此整个处理注册号的函数全部汇编代码如下:

000D4720   >  55            PUSH EBP              // 处理注册号的函数的第一行代码 也是我们后期进步分析注册号处理函数时, 需要经常来到的代码处
000D4721   .  8BEC          MOV EBP,ESP
000D4723   .  6A FF         PUSH -1
000D4725   .  68 64B60D00   PUSH PCtuneup.000DB664
000D472A   .  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
000D4730   .  50            PUSH EAX
000D4731   .  83EC 30       SUB ESP,30
000D4734   .  53            PUSH EBX
000D4735   .  56            PUSH ESI
000D4736   .  57            PUSH EDI
000D4737   .  A1 1CC50E00   MOV EAX,DWORD PTR [EC51C]
000D473C   .  33C5          XOR EAX,EBP
000D473E   .  50            PUSH EAX
000D473F   .  8D45 F4       LEA EAX,DWORD PTR [EBP-C]
000D4742   .  64:A3 0000000>MOV DWORD PTR FS:[0],EAX
000D4748   .  8BF1          MOV ESI,ECX
000D474A   .  C745 E8 00000>MOV DWORD PTR [EBP-18],0
000D4751   .  51            PUSH ECX
000D4752   .  8D45 0C       LEA EAX,DWORD PTR [EBP+C]
000D4755   .  8BCC          MOV ECX,ESP
000D4757   .  8965 E0       MOV DWORD PTR [EBP-20],ESP
000D475A   .  BF 01000000   MOV EDI,1
000D475F   .  50            PUSH EAX
000D4760   .  897D FC       MOV DWORD PTR [EBP-4],EDI
000D4763   .  FF15 C4F20E00 CALL DWORD PTR [<&QtCore4.??0QString@@QA>;  QtCore4.??0QString@@QAE@ABV0@@Z
000D4769   .  8BCE          MOV ECX,ESI
000D476B   .  E8 8ECAFEFF   CALL PCtuneup.000C11FE
000D4770   .  84C0          TEST AL,AL
000D4772   .  0F84 59010000 JE PCtuneup.000D48D1
000D4778   .  8D4D E4       LEA ECX,DWORD PTR [EBP-1C]
000D477B   .  51            PUSH ECX
000D477C   .  8BCE          MOV ECX,ESI
000D477E   .  E8 1AD1FEFF   CALL PCtuneup.000C189D
000D4783   .  6A 00         PUSH 0
000D4785   .  57            PUSH EDI
000D4786   .  50            PUSH EAX
000D4787   .  8D4D D4       LEA ECX,DWORD PTR [EBP-2C]
000D478A   .  C645 FC 02    MOV BYTE PTR [EBP-4],2
000D478E   .  FF15 C8F00E00 CALL DWORD PTR [<&QtCore4.??0QSettings@@>;  QtCore4.??0QSettings@@QAE@ABVQString@@W4Format@0@PAVQObject@@@Z
000D4794   .  8D4D E4       LEA ECX,DWORD PTR [EBP-1C]
000D4797   .  C645 FC 04    MOV BYTE PTR [EBP-4],4
000D479B   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D47A1   .  68 4C620E00   PUSH PCtuneup.000E624C                   ;  yyyy-MM-dd
000D47A6   .  8D4D EC       LEA ECX,DWORD PTR [EBP-14]
000D47A9   .  FF15 F8F20E00 CALL DWORD PTR [<&QtCore4.??0QString@@QA>;  QtCore4.??0QString@@QAE@PBD@Z
000D47AF   .  8D55 EC       LEA EDX,DWORD PTR [EBP-14]
000D47B2   .  52            PUSH EDX
000D47B3   .  8D45 E0       LEA EAX,DWORD PTR [EBP-20]
000D47B6   .  50            PUSH EAX
000D47B7   .  8D4D DC       LEA ECX,DWORD PTR [EBP-24]
000D47BA   .  51            PUSH ECX
000D47BB   .  C645 FC 05    MOV BYTE PTR [EBP-4],5
000D47BF   .  FF15 5CF10E00 CALL DWORD PTR [<&QtCore4.?currentDate@Q>;  QtCore4.?currentDate@QDate@@SA?AV1@XZ
000D47C5   .  83C4 04       ADD ESP,4
000D47C8   .  8BC8          MOV ECX,EAX
000D47CA   .  FF15 58F10E00 CALL DWORD PTR [<&QtCore4.?toString@QDat>;  QtCore4.?toString@QDate@@QBE?AVQString@@ABV2@@Z
000D47D0   .  8B35 A4F20E00 MOV ESI,DWORD PTR [<&QtCore4.??0QVariant>;  QtCore4.??0QVariant@@QAE@ABVQString@@@Z
000D47D6   .  50            PUSH EAX
000D47D7   .  8D4D C4       LEA ECX,DWORD PTR [EBP-3C]
000D47DA   .  C645 FC 06    MOV BYTE PTR [EBP-4],6
000D47DE   .  FFD6          CALL ESI                                 ;  <&QtCore4.??0QVariant@@QAE@ABVQString@@@Z>
000D47E0   .  B3 07         MOV BL,7
000D47E2   .  68 20630E00   PUSH PCtuneup.000E6320                   ;  data/date
000D47E7   .  8D4D F0       LEA ECX,DWORD PTR [EBP-10]
000D47EA   .  885D FC       MOV BYTE PTR [EBP-4],BL
000D47ED   .  FF15 F8F20E00 CALL DWORD PTR [<&QtCore4.??0QString@@QA>;  QtCore4.??0QString@@QAE@PBD@Z
000D47F3   .  8B3D F0F00E00 MOV EDI,DWORD PTR [<&QtCore4.?setValue@Q>;QtCore4.?setValue@QSettings@@QAEXABVQString@@ABVQVariant@@@Z
000D47F9   .  8D55 C4       LEA EDX,DWORD PTR [EBP-3C]
000D47FC   .  52            PUSH EDX
000D47FD   .  8D45 F0       LEA EAX,DWORD PTR [EBP-10]
000D4800   .  50            PUSH EAX
000D4801   .  8D4D D4       LEA ECX,DWORD PTR [EBP-2C]
000D4804   .  C645 FC 08    MOV BYTE PTR [EBP-4],8
000D4808   .  FFD7          CALL EDI                                 ;  <&QtCore4.?setValue@QSettings@@QAEXABVQString@@ABVQVariant@@@Z>
000D480A   .  8D4D F0       LEA ECX,DWORD PTR [EBP-10]
000D480D   .  885D FC       MOV BYTE PTR [EBP-4],BL
000D4810   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D4816   .  8B1D BCF20E00 MOV EBX,DWORD PTR [<&QtCore4.??1QVariant>;  QtCore4.??1QVariant@@QAE@XZ
000D481C   .  8D4D C4       LEA ECX,DWORD PTR [EBP-3C]
000D481F   .  C645 FC 06    MOV BYTE PTR [EBP-4],6
000D4823   .  FFD3          CALL EBX                                 ;  <&QtCore4.??1QVariant@@QAE@XZ>
000D4825   .  8D4D E0       LEA ECX,DWORD PTR [EBP-20]
000D4828   .  C645 FC 05    MOV BYTE PTR [EBP-4],5
000D482C   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D4832   .  8D4D EC       LEA ECX,DWORD PTR [EBP-14]
000D4835   .  C645 FC 04    MOV BYTE PTR [EBP-4],4
000D4839   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D483F   .  51            PUSH ECX
000D4840   .  8D55 0C       LEA EDX,DWORD PTR [EBP+C]
000D4843   .  8BCC          MOV ECX,ESP
000D4845   .  8965 DC       MOV DWORD PTR [EBP-24],ESP
000D4848   .  52            PUSH EDX
000D4849   .  FF15 C4F20E00 CALL DWORD PTR [<&QtCore4.??0QString@@QA>;  QtCore4.??0QString@@QAE@ABV0@@Z
000D484F   .  8D45 E0       LEA EAX,DWORD PTR [EBP-20]
000D4852   .  50            PUSH EAX
000D4853   .  E8 C3CAFEFF   CALL PCtuneup.000C131B
000D4858   .  83C4 08       ADD ESP,8
000D485B   .  50            PUSH EAX
000D485C   .  8D4D C4       LEA ECX,DWORD PTR [EBP-3C]
000D485F   .  C645 FC 09    MOV BYTE PTR [EBP-4],9
000D4863   .  FFD6          CALL ESI                                 ;  <&QtCore4.??0QVariant@@QAE@ABVQString@@@Z>
000D4865   .  68 10630E00   PUSH PCtuneup.000E6310                   ;  data/check
000D486A   .  8D4D EC       LEA ECX,DWORD PTR [EBP-14]
000D486D   .  C645 FC 0A    MOV BYTE PTR [EBP-4],0A
000D4871   .  FF15 F8F20E00 CALL DWORD PTR [<&QtCore4.??0QString@@QA>;  QtCore4.??0QString@@QAE@PBD@Z
000D4877   .  8D4D C4       LEA ECX,DWORD PTR [EBP-3C]
000D487A   .  51            PUSH ECX
000D487B   .  8D55 EC       LEA EDX,DWORD PTR [EBP-14]
000D487E   .  52            PUSH EDX
000D487F   .  8D4D D4       LEA ECX,DWORD PTR [EBP-2C]
000D4882   .  C645 FC 0B    MOV BYTE PTR [EBP-4],0B
000D4886   .  FFD7          CALL EDI                                 ;  <&QtCore4.?setValue@QSettings@@QAEXABVQString@@ABVQVariant@@@Z>
000D4888   .  8D4D EC       LEA ECX,DWORD PTR [EBP-14]
000D488B   .  C645 FC 0A    MOV BYTE PTR [EBP-4],0A
000D488F   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D4895   .  8D4D C4       LEA ECX,DWORD PTR [EBP-3C]
000D4898   .  C645 FC 09    MOV BYTE PTR [EBP-4],9
000D489C   .  FFD3          CALL EBX                                 ;  <&QtCore4.??1QVariant@@QAE@XZ>
000D489E   .  8D4D E0       LEA ECX,DWORD PTR [EBP-20]
000D48A1   .  C645 FC 04    MOV BYTE PTR [EBP-4],4
000D48A5   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D48AB   .  8B75 08       MOV ESI,DWORD PTR [EBP+8]
000D48AE   .  68 D4550E00   PUSH PCtuneup.000E55D4                   ;  1
000D48B3   .  8BCE          MOV ECX,ESI
000D48B5   .  FF15 F8F20E00 CALL DWORD PTR [<&QtCore4.??0QString@@QA>;  QtCore4.??0QString@@QAE@PBD@Z
000D48BB   .  8D4D D4       LEA ECX,DWORD PTR [EBP-2C]
000D48BE   .  C745 E8 01000>MOV DWORD PTR [EBP-18],1
000D48C5   .  C645 FC 01    MOV BYTE PTR [EBP-4],1
000D48C9   .  FF15 BCF00E00 CALL DWORD PTR [<&QtCore4.??1QSettings@@>;  QtCore4.??1QSettings@@UAE@XZ
000D48CF   .  EB 13         JMP SHORT PCtuneup.000D48E4
000D48D1   >  8B75 08       MOV ESI,DWORD PTR [EBP+8]
000D48D4   .  68 B4550E00   PUSH PCtuneup.000E55B4                   ;  0
000D48D9   .  8BCE          MOV ECX,ESI
000D48DB   .  FF15 F8F20E00 CALL DWORD PTR [<&QtCore4.??0QString@@QA>;  QtCore4.??0QString@@QAE@PBD@Z
000D48E1   .  897D E8       MOV DWORD PTR [EBP-18],EDI
000D48E4   >  8D4D 0C       LEA ECX,DWORD PTR [EBP+C]
000D48E7   .  C645 FC 00    MOV BYTE PTR [EBP-4],0
000D48EB   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D48F1   .  8BC6          MOV EAX,ESI
000D48F3   .  8B4D F4       MOV ECX,DWORD PTR [EBP-C]
000D48F6   .  64:890D 00000>MOV DWORD PTR FS:[0],ECX
000D48FD   .  59            POP ECX
000D48FE   .  5F            POP EDI
000D48FF   .  5E            POP ESI
000D4900   .  5B            POP EBX
000D4901   .  8BE5          MOV ESP,EBP
000D4903   .  5D            POP EBP
000D4904   .  C2 0800       RET 8


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 5
支持
分享
最新回复 (35)
雪    币: 158
活跃值: (263)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
>>>>>>>>>>>>>>> 第六部分: 开始分析处理注册号的函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

1. 在 >>>第五部分: 通过Qt类库的QString类相关函数找到处理注册号的函数 <<< 我们已经发现了处理注册号的函数, 这些我们把之前下过的"断点"全部删除, 然后在对处理注册号的函数的第一行代码进行下"断点",

000D4720   >  55            PUSH EBP   // 处理注册号的函数的第一行代码

通过对上面这行代码下"断点"之后, 我们重新返回1-click pc tuneup软件的注册对话框, 再次按下"Activate Now", 此时ollydbg就会停顿在刚才我们下"断点"的代码行上. 这时我们就需要F8(单步步过), 看看会发现什么变化?

000D4720   >  55            PUSH EBP                // 处理注册号的函数的第一行代码
'
'  {中间代码省略}
'
000D476B   .  E8 8ECAFEFF   CALL PCtuneup.000C11FE  // [注意]当运行到此处的时候, 现如果继续按F8(单步步过), 那么返回False, 并跳到结尾处并返回.也就意味着当前PCtuneup.000C11FE这个函数针对我们输入的注册号进行了判断和验证之后, 返回了0, 0就是False,  因此我们有理由确定这个函数也跟注册号处理有关.
000D4770   .  84C0          TEST AL,AL
000D4772   .  0F84 59010000 JE PCtuneup.000D48D1
'
'  {中间代码省略}
'
000D48D1   >  8B75 08       MOV ESI,DWORD PTR [EBP+8]
000D48D4   .  68 B4550E00   PUSH PCtuneup.000E55B4                   ;  0
000D48D9   .  8BCE          MOV ECX,ESI
000D48DB   .  FF15 F8F20E00 CALL DWORD PTR [<&QtCore4.??0QString@@QA>;  QtCore4.??0QString@@QAE@PBD@Z
000D48E1   .  897D E8       MOV DWORD PTR [EBP-18],EDI
000D48E4   >  8D4D 0C       LEA ECX,DWORD PTR [EBP+C]
000D48E7   .  C645 FC 00    MOV BYTE PTR [EBP-4],0
000D48EB   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D48F1   .  8BC6          MOV EAX,ESI
000D48F3   .  8B4D F4       MOV ECX,DWORD PTR [EBP-C]
000D48F6   .  64:890D 00000>MOV DWORD PTR FS:[0],ECX
000D48FD   .  59            POP ECX
000D48FE   .  5F            POP EDI
000D48FF   .  5E            POP ESI
000D4900   .  5B            POP EBX
000D4901   .  8BE5          MOV ESP,EBP
000D4903   .  5D            POP EBP
000D4904   .  C2 0800       RET 8

2. 通过上面可知PCtuneup.000C11FE跟注册号处理有关,因此我们在再重新清空之前下过的"断点", 然后对

000D476B   .  E8 8ECAFEFF   CALL PCtuneup.000C11FE

这行代码下个"断点", 重新返回1-click pc tuneup软件的注册对话框, 再次按下"Activate Now",  此时ollydbg就会停顿在刚才我们下"断点"的代码行上. 这时我们就需要F7(单步步入), 进入PCtuneup.000C11FE函数内部, 看看会有什么新发现? 结果会看到进入一个跳转到PCtuneup.000D42F0函数内部, 代码如下:

000C11FE   $ /E9 ED300100   JMP PCtuneup.000D42F0    // 跳转到PCtuneup.000D42F0函数内部.
'
'  {中间代码省略}
'
000D42F0   >  55            PUSH EBP                 // 从这里我们开始按F8(单步步过), 直到步过至 000D434C CALL DWORD PTR [<&QtCore4.?utf16@QString>;  QtCore4.?utf16@QString@@QBEPBGXZ这行代码,你就发现EAX的值显示的是我们的测试注册号.
000D42F1   .  8BEC          MOV EBP,ESP
000D42F3   .  6A FF         PUSH -1
000D42F5   .  68 79B40D00   PUSH PCtuneup.000DB479
000D42FA   .  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
000D4300   .  50            PUSH EAX
000D4301   .  53            PUSH EBX
000D4302   .  56            PUSH ESI
000D4303   .  57            PUSH EDI
000D4304   .  A1 1CC50E00   MOV EAX,DWORD PTR [EC51C]
000D4309   .  33C5          XOR EAX,EBP
000D430B   .  50            PUSH EAX
000D430C   .  8D45 F4       LEA EAX,DWORD PTR [EBP-C]
000D430F   .  64:A3 0000000>MOV DWORD PTR FS:[0],EAX
000D4315   .  8BF1          MOV ESI,ECX
000D4317   .  837E 1C 00    CMP DWORD PTR [ESI+1C],0
000D431B   .  C745 FC 00000>MOV DWORD PTR [EBP-4],0
000D4322   .  75 1C         JNZ SHORT PCtuneup.000D4340
000D4324   .  8D4E 0C       LEA ECX,DWORD PTR [ESI+C]
000D4327   .  FF15 8CF00E00 CALL DWORD PTR [<&QtCore4.?load@QLibrary>;  QtCore4.?load@QLibrary@@QAE_NXZ
000D432D   .  68 DC570E00   PUSH PCtuneup.000E57DC                   ;  GetInstance
000D4332   .  8D4E 0C       LEA ECX,DWORD PTR [ESI+C]
000D4335   .  FF15 88F00E00 CALL DWORD PTR [<&QtCore4.?resolve@QLibr>;  QtCore4.?resolve@QLibrary@@QAEPAXPBD@Z
000D433B   .  FFD0          CALL EAX
000D433D   .  8946 1C       MOV DWORD PTR [ESI+1C],EAX
000D4340   >  8B46 1C       MOV EAX,DWORD PTR [ESI+1C]
000D4343   .  8D4D 08       LEA ECX,DWORD PTR [EBP+8]
000D4346   .  85C0          TEST EAX,EAX
000D4348   .  74 39         JE SHORT PCtuneup.000D4383
000D434A   .  8B38          MOV EDI,DWORD PTR [EAX]
000D434C   .  FF15 F4F00E00 CALL DWORD PTR [<&QtCore4.?utf16@QString>;  QtCore4.?utf16@QString@@QBEPBGXZ
000D4352   .  8B4E 1C       MOV ECX,DWORD PTR [ESI+1C]
000D4355   .  50            PUSH EAX                                               // 使用我们测试注册号
000D4356   .  8B47 0C       MOV EAX,DWORD PTR [EDI+C]   // 获取处理注册号的函数的地址
000D4359   .  FFD0          CALL EAX                                             // 调用处理注册号函数,此时按F7(单步步入)

000D435B   .  8D4D 08       LEA ECX,DWORD PTR [EBP+8]
000D435E   .  8AD8          MOV BL,AL
000D4360   .  C745 FC FFFFF>MOV DWORD PTR [EBP-4],-1
000D4367   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D436D   .  8AC3          MOV AL,BL
000D436F   .  8B4D F4       MOV ECX,DWORD PTR [EBP-C]
000D4372   .  64:890D 00000>MOV DWORD PTR FS:[0],ECX
000D4379   .  59            POP ECX
000D437A   .  5F            POP EDI
000D437B   .  5E            POP ESI
000D437C   .  5B            POP EBX
000D437D   .  8BE5          MOV ESP,EBP
000D437F   .  5D            POP EBP
000D4380   .  C2 0400       RET 4
000D4383   >  C745 FC FFFFF>MOV DWORD PTR [EBP-4],-1
000D438A   .  FF15 04F30E00 CALL DWORD PTR [<&QtCore4.??1QString@@QA>;  QtCore4.??1QXmlStreamStringRef@@QAE@XZ
000D4390   .  32C0          XOR AL,AL
000D4392   .  8B4D F4       MOV ECX,DWORD PTR [EBP-C]
000D4395   .  64:890D 00000>MOV DWORD PTR FS:[0],ECX
000D439C   .  59            POP ECX
000D439D   .  5F            POP EDI
000D439E   .  5E            POP ESI
000D439F   .  5B            POP EBX
000D43A0   .  8BE5          MOV ESP,EBP
000D43A2   .  5D            POP EBP
000D43A3   .  C2 0400       RET 4



3. 通过上面的可知: CALL EAX 这条汇编指令, 就是处理我们测试注册码的指令, 因为这条指令的上面有PUSH EAX, 而当时的EAX是指向"123456789"这个测试注册号.

000D42F0   >  55            PUSH EBP                // 从这里我们开始按F8(单步步过), 直到步过至 000D434C CALL DWORD PTR [<&QtCore4.?utf16@QString>;  QtCore4.?utf16@QString@@QBEPBGXZ这行代码,你就发现EAX的值显示的是我们的测试注册号.
'
'  {中间代码省略}
'
000D4355   .  50            PUSH EAX                                                // 使用我们测试注册号
000D4356   .  8B47 0C  MOV EAX,DWORD PTR [EDI+C]         // 获取处理注册号的函数的地址
000D4359   .  FFD0         CALL EAX                                               // 调用处理注册号函数,此时按F7(单步步入)

'
'  {中间代码省略}
'
000D439C   .  59                POP ECX
000D439D   .  5F                POP EDI
000D439E   .  5E                POP ESI
000D439F   .  5B                 POP EBX
000D43A0   .  8BE5            MOV ESP,EBP
000D43A2   .  5D                 POP EBP
000D43A3   .  C2 0400       RET 4

4. 按照上面的分析, 我们就在 CALL EAX 这条汇编指令, 按F7(单步步入), 看到如下代码

6E3C6AA0    55                          PUSH EBP
6E3C6AA1    8BEC                     MOV EBP,ESP
6E3C6AA3    8B4D 08                MOV ECX,DWORD PTR [EBP+8]   // 此时ECX是指向"123456789"这个测试注册号
6E3C6AA6    E8 25CD0000     CALL logiclay.6E3D37D0                // 此时按F7(单步步入)  

6E3C6AAB    5D                          POP EBP
6E3C6AAC    C2 0400                RET 4

通过观察上面的代码, 只有一个函数 logiclay.6E3D37D0, 因此毫无疑问的F7(单步步入)......

5. 按F7(单步步入)到logiclay.6E3D37D0函数内部之后, 突然眼前一片明亮, 看到了一个很像注册码的字符串"82A63CCD5F3A45AA97DB7A0C”, 看来可以锁定logiclay.6E3D37D0函数就是真正的处理注册号的函数了.



通过上面的发现, 我们可以尝试使用"82A63CCD5F3A45AA97DB7A0C”这个字符串来注册看看, 事实证明, 可以注册成功!
2013-10-15 13:55
0
雪    币: 1906
活跃值: (712)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
等待下一篇,多谢楼主分享
2013-10-15 13:55
0
雪    币: 158
活跃值: (263)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
>>>>>>>>>>>>>>> 第七部分: 不要满足直接获取注册号码 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

1. 在 >>> 第六部分: 开始分析处理注册号的函数 <<< 我们已经发现了内置注册号"82A63CCD5F3A45AA97DB7A0C”所在的函数, 很明显该函数就是处理注册号的函数, 下面大家可以根据我标注的各种颜色来了解注册号处理的流程

6E3D37D0    55              PUSH EBP
'
'  {中间代码省略}
'
6E3D3810    66:8B08         MOV CX,WORD PTR [EAX]
6E3D3813    83C0 02         ADD EAX,2
6E3D3816    66:3BCB         CMP CX,BX
6E3D3819  ^ 75 F5           JNZ SHORT logiclay.6E3D3810
6E3D381B    2BC2            SUB EAX,EDX
6E3D381D    D1F8            SAR EAX,1
6E3D381F    83F8 18         CMP EAX,18                      ; 判断注册号长度是否为0x18(十进制: 24)


6E3D3822    75 47           JNZ SHORT logiclay.6E3D386B
6E3D3824    B9 18683E6E     MOV ECX,logiclay.6E3E6818       ; 跟内置"82A63CCD5F3A45AA97DB7A0C"注册号比较
6E3D3829    8BC6            MOV EAX,ESI
6E3D382B    EB 03           JMP SHORT logiclay.6E3D3830
6E3D382D    8D49 00         LEA ECX,DWORD PTR [ECX]
6E3D3830    66:8B10         MOV DX,WORD PTR [EAX]
6E3D3833    66:3B11         CMP DX,WORD PTR [ECX]
6E3D3836    75 1E           JNZ SHORT logiclay.6E3D3856
6E3D3838    66:3BD3         CMP DX,BX
6E3D383B    74 15           JE SHORT logiclay.6E3D3852
6E3D383D    66:8B50 02      MOV DX,WORD PTR [EAX+2]
6E3D3841    66:3B51 02      CMP DX,WORD PTR [ECX+2]
6E3D3845    75 0F           JNZ SHORT logiclay.6E3D3856
6E3D3847    83C0 04         ADD EAX,4
6E3D384A    83C1 04         ADD ECX,4
6E3D384D    66:3BD3         CMP DX,BX
6E3D3850  ^ 75 DE           JNZ SHORT logiclay.6E3D3830
6E3D3852    33C0            XOR EAX,EAX
6E3D3854    EB 05           JMP SHORT logiclay.6E3D385B
6E3D3856    1BC0            SBB EAX,EAX
6E3D3858    83D8 FF         SBB EAX,-1
6E3D385B    3BC3            CMP EAX,EBX
6E3D385D    75 2B           JNZ SHORT logiclay.6E3D388A

'
'  {中间代码省略}
'
6E3D389B    E8 00040000     CALL logiclay.6E3D3CA0      ; 把注册号所有字符串转换为大写
'
'  {中间代码省略}
'
6E3D38FF    A1 0CD33E6E     MOV EAX,DWORD PTR [6E3ED30C] ; 判断注册码的特征头是否为: E985
6E3D3904    8BCE            MOV ECX,ESI
6E3D3906    66:8B10         MOV DX,WORD PTR [EAX]
6E3D3909    66:3B11         CMP DX,WORD PTR [ECX]
6E3D390C    75 1E           JNZ SHORT logiclay.6E3D392C
6E3D390E    66:3BD3         CMP DX,BX
6E3D3911    74 15           JE SHORT logiclay.6E3D3928
6E3D3913    66:8B50 02      MOV DX,WORD PTR [EAX+2]
6E3D3917    66:3B51 02      CMP DX,WORD PTR [ECX+2]
6E3D391B    75 0F           JNZ SHORT logiclay.6E3D392C
6E3D391D    83C0 04         ADD EAX,4
6E3D3920    83C1 04         ADD ECX,4
6E3D3923    66:3BD3         CMP DX,BX
6E3D3926  ^ 75 DE           JNZ SHORT logiclay.6E3D3906
6E3D3928    33C0            XOR EAX,EAX
6E3D392A    EB 05           JMP SHORT logiclay.6E3D3931
6E3D392C    1BC0            SBB EAX,EAX
6E3D392E    83D8 FF         SBB EAX,-1
6E3D3931    3BC3            CMP EAX,EBX
6E3D3933    0F84 84010000   JE logiclay.6E3D3ABD
6E3D3939    A1 10D33E6E     MOV EAX,DWORD PTR [6E3ED310] ; 判断注册码的特征头是否为: 84E4
6E3D393E    8BCE            MOV ECX,ESI
6E3D3940    66:8B10         MOV DX,WORD PTR [EAX]
6E3D3943    66:3B11         CMP DX,WORD PTR [ECX]
6E3D3946    75 1E           JNZ SHORT logiclay.6E3D3966
6E3D3948    66:3BD3         CMP DX,BX
6E3D394B    74 15           JE SHORT logiclay.6E3D3962
6E3D394D    66:8B50 02      MOV DX,WORD PTR [EAX+2]
6E3D3951    66:3B51 02      CMP DX,WORD PTR [ECX+2]
6E3D3955    75 0F           JNZ SHORT logiclay.6E3D3966
6E3D3957    83C0 04         ADD EAX,4
6E3D395A    83C1 04         ADD ECX,4
6E3D395D    66:3BD3         CMP DX,BX
6E3D3960  ^ 75 DE           JNZ SHORT logiclay.6E3D3940
6E3D3962    33C0            XOR EAX,EAX
6E3D3964    EB 05           JMP SHORT logiclay.6E3D396B
6E3D3966    1BC0            SBB EAX,EAX
6E3D3968    83D8 FF         SBB EAX,-1
6E3D396B    3BC3            CMP EAX,EBX
6E3D396D    0F84 4A010000   JE logiclay.6E3D3ABD
6E3D3973    A1 14D33E6E     MOV EAX,DWORD PTR [6E3ED314] ; 判断注册码的特征头是否为: 75E2
6E3D3978    8BCE            MOV ECX,ESI
6E3D397A    8D9B 00000000   LEA EBX,DWORD PTR [EBX]
6E3D3980    66:8B10         MOV DX,WORD PTR [EAX]
6E3D3983    66:3B11         CMP DX,WORD PTR [ECX]
6E3D3986    75 1E           JNZ SHORT logiclay.6E3D39A6
6E3D3988    66:3BD3         CMP DX,BX
6E3D398B    74 15           JE SHORT logiclay.6E3D39A2
6E3D398D    66:8B50 02      MOV DX,WORD PTR [EAX+2]
6E3D3991    66:3B51 02      CMP DX,WORD PTR [ECX+2]
6E3D3995    75 0F           JNZ SHORT logiclay.6E3D39A6
6E3D3997    83C0 04         ADD EAX,4
6E3D399A    83C1 04         ADD ECX,4
6E3D399D    66:3BD3         CMP DX,BX
6E3D39A0  ^ 75 DE           JNZ SHORT logiclay.6E3D3980
6E3D39A2    33C0            XOR EAX,EAX
6E3D39A4    EB 05           JMP SHORT logiclay.6E3D39AB
6E3D39A6    1BC0            SBB EAX,EAX
6E3D39A8    83D8 FF         SBB EAX,-1
6E3D39AB    3BC3            CMP EAX,EBX
6E3D39AD    0F84 0A010000   JE logiclay.6E3D3ABD
6E3D39B3    A1 18D33E6E     MOV EAX,DWORD PTR [6E3ED318] ; 判断注册码的特征头是否为: 84DE
6E3D39B8    8BCE            MOV ECX,ESI
6E3D39BA    8D9B 00000000   LEA EBX,DWORD PTR [EBX]
6E3D39C0    66:8B10         MOV DX,WORD PTR [EAX]
6E3D39C3    66:3B11         CMP DX,WORD PTR [ECX]
6E3D39C6    75 1E           JNZ SHORT logiclay.6E3D39E6
6E3D39C8    66:3BD3         CMP DX,BX
6E3D39CB    74 15           JE SHORT logiclay.6E3D39E2
6E3D39CD    66:8B50 02      MOV DX,WORD PTR [EAX+2]
6E3D39D1    66:3B51 02      CMP DX,WORD PTR [ECX+2]
6E3D39D5    75 0F           JNZ SHORT logiclay.6E3D39E6
6E3D39D7    83C0 04         ADD EAX,4
6E3D39DA    83C1 04         ADD ECX,4
6E3D39DD    66:3BD3         CMP DX,BX
6E3D39E0  ^ 75 DE           JNZ SHORT logiclay.6E3D39C0
6E3D39E2    33C0            XOR EAX,EAX
6E3D39E4    EB 05           JMP SHORT logiclay.6E3D39EB
6E3D39E6    1BC0            SBB EAX,EAX
6E3D39E8    83D8 FF         SBB EAX,-1
6E3D39EB    3BC3            CMP EAX,EBX
6E3D39ED    0F84 CA000000   JE logiclay.6E3D3ABD
6E3D39F3    A1 1CD33E6E     MOV EAX,DWORD PTR [6E3ED31C] ; 判断注册码的特征头是否为: 82DA
6E3D39F8    8BCE            MOV ECX,ESI
6E3D39FA    8D9B 00000000   LEA EBX,DWORD PTR [EBX]
6E3D3A00    66:8B10         MOV DX,WORD PTR [EAX]
6E3D3A03    66:3B11         CMP DX,WORD PTR [ECX]
6E3D3A06    75 1E           JNZ SHORT logiclay.6E3D3A26
6E3D3A08    66:3BD3         CMP DX,BX
6E3D3A0B    74 15           JE SHORT logiclay.6E3D3A22
6E3D3A0D    66:8B50 02      MOV DX,WORD PTR [EAX+2]
6E3D3A11    66:3B51 02      CMP DX,WORD PTR [ECX+2]
6E3D3A15    75 0F           JNZ SHORT logiclay.6E3D3A26
6E3D3A17    83C0 04         ADD EAX,4
6E3D3A1A    83C1 04         ADD ECX,4
6E3D3A1D    66:3BD3         CMP DX,BX
6E3D3A20  ^ 75 DE           JNZ SHORT logiclay.6E3D3A00
6E3D3A22    33C0            XOR EAX,EAX
6E3D3A24    EB 05           JMP SHORT logiclay.6E3D3A2B
6E3D3A26    1BC0            SBB EAX,EAX
6E3D3A28    83D8 FF         SBB EAX,-1
6E3D3A2B    3BC3            CMP EAX,EBX
6E3D3A2D    0F84 8A000000   JE logiclay.6E3D3ABD
6E3D3A33    A1 20D33E6E     MOV EAX,DWORD PTR [6E3ED320] ; 判断注册码的特征头是否为: 6DFD
6E3D3A38    8BCE            MOV ECX,ESI
6E3D3A3A    8D9B 00000000   LEA EBX,DWORD PTR [EBX]
6E3D3A40    66:8B10         MOV DX,WORD PTR [EAX]
6E3D3A43    66:3B11         CMP DX,WORD PTR [ECX]
6E3D3A46    75 1E           JNZ SHORT logiclay.6E3D3A66
6E3D3A48    66:3BD3         CMP DX,BX
6E3D3A4B    74 15           JE SHORT logiclay.6E3D3A62
6E3D3A4D    66:8B50 02      MOV DX,WORD PTR [EAX+2]
6E3D3A51    66:3B51 02      CMP DX,WORD PTR [ECX+2]
6E3D3A55    75 0F           JNZ SHORT logiclay.6E3D3A66
6E3D3A57    83C0 04         ADD EAX,4
6E3D3A5A    83C1 04         ADD ECX,4
6E3D3A5D    66:3BD3         CMP DX,BX
6E3D3A60  ^ 75 DE           JNZ SHORT logiclay.6E3D3A40
6E3D3A62    33C0            XOR EAX,EAX
6E3D3A64    EB 05           JMP SHORT logiclay.6E3D3A6B
6E3D3A66    1BC0            SBB EAX,EAX
6E3D3A68    83D8 FF         SBB EAX,-1
6E3D3A6B    3BC3            CMP EAX,EBX
6E3D3A6D    74 4E           JE SHORT logiclay.6E3D3ABD
6E3D3A6F    A1 24D33E6E     MOV EAX,DWORD PTR [6E3ED324] ; 判断注册码的特征头是否为: 8A77
6E3D3A74    8BCE            MOV ECX,ESI
6E3D3A76    66:8B10         MOV DX,WORD PTR [EAX]
6E3D3A79    66:3B11         CMP DX,WORD PTR [ECX]
6E3D3A7C    75 1E           JNZ SHORT logiclay.6E3D3A9C
6E3D3A7E    66:3BD3         CMP DX,BX
6E3D3A81    74 15           JE SHORT logiclay.6E3D3A98
6E3D3A83    66:8B50 02      MOV DX,WORD PTR [EAX+2]
6E3D3A87    66:3B51 02      CMP DX,WORD PTR [ECX+2]
6E3D3A8B    75 0F           JNZ SHORT logiclay.6E3D3A9C
6E3D3A8D    83C0 04         ADD EAX,4
6E3D3A90    83C1 04         ADD ECX,4
6E3D3A93    66:3BD3         CMP DX,BX
6E3D3A96  ^ 75 DE           JNZ SHORT logiclay.6E3D3A76
6E3D3A98    33C0            XOR EAX,EAX
6E3D3A9A    EB 05           JMP SHORT logiclay.6E3D3AA1
6E3D3A9C    1BC0            SBB EAX,EAX
6E3D3A9E    83D8 FF         SBB EAX,-1
6E3D3AA1    3BC3            CMP EAX,EBX
6E3D3AA3    74 18           JE SHORT logiclay.6E3D3ABD

'
'  {中间代码省略}
'
6E3D3ABD    6A 5C           PUSH 5C
6E3D3ABF    8D4D 94         LEA ECX,DWORD PTR [EBP-6C]
6E3D3AC2    53              PUSH EBX
6E3D3AC3    51              PUSH ECX
6E3D3AC4    E8 05A00000     CALL <JMP.&MSVCR100.memset>
6E3D3AC9    8B7D 88         MOV EDI,DWORD PTR [EBP-78]
6E3D3ACC    83C4 0C         ADD ESP,0C
6E3D3ACF    33C0            XOR EAX,EAX
6E3D3AD1    3BC3            CMP EAX,EBX
6E3D3AD3    0F8C E8000000   JL logiclay.6E3D3BC1
6E3D3AD9    3B47 F4         CMP EAX,DWORD PTR [EDI-C]
6E3D3ADC    0F8F DF000000   JG logiclay.6E3D3BC1             ; 判断注册号的每个字符是否在 0~9 或者 A~F 范围
6E3D3AE2    0FB70C47        MOVZX ECX,WORD PTR [EDI+EAX*2]
6E3D3AE6    8D51 D0         LEA EDX,DWORD PTR [ECX-30]
6E3D3AE9    83FA 09         CMP EDX,9
6E3D3AEC    77 04           JA SHORT logiclay.6E3D3AF2
6E3D3AEE    895485 90       MOV DWORD PTR [EBP+EAX*4-70],EDX
6E3D3AF2    8D51 BF         LEA EDX,DWORD PTR [ECX-41]
6E3D3AF5    83FA 05         CMP EDX,5
6E3D3AF8    77 07           JA SHORT logiclay.6E3D3B01
6E3D3AFA    83C1 C9         ADD ECX,-37
6E3D3AFD    894C85 90       MOV DWORD PTR [EBP+EAX*4-70],ECX
6E3D3B01    40              INC EAX
6E3D3B02    83F8 18         CMP EAX,18
6E3D3B05  ^ 7C CA           JL SHORT logiclay.6E3D3AD1


6E3D3B07    8B4D AC         MOV ECX,DWORD PTR [EBP-54]     ; 校验1
6E3D3B0A    034D A8         ADD ECX,DWORD PTR [EBP-58]
6E3D3B0D    8B55 A4         MOV EDX,DWORD PTR [EBP-5C]
6E3D3B10    8D4411 01       LEA EAX,DWORD PTR [ECX+EDX+1]
6E3D3B14    25 0F000080     AND EAX,8000000F
6E3D3B19    79 05           JNS SHORT logiclay.6E3D3B20
6E3D3B1B    48              DEC EAX
6E3D3B1C    83C8 F0         OR EAX,FFFFFFF0
6E3D3B1F    40              INC EAX
6E3D3B20    3945 A0         CMP DWORD PTR [EBP-60],EAX
6E3D3B23    0F85 A2000000   JNZ logiclay.6E3D3BCB
6E3D3B29    8B55 BC         MOV EDX,DWORD PTR [EBP-44]    ; 校验2
6E3D3B2C    0355 B8         ADD EDX,DWORD PTR [EBP-48]
6E3D3B2F    8B45 B4         MOV EAX,DWORD PTR [EBP-4C]
6E3D3B32    8D4C02 02       LEA ECX,DWORD PTR [EDX+EAX+2]
6E3D3B36    81E1 0F000080   AND ECX,8000000F
6E3D3B3C    79 05           JNS SHORT logiclay.6E3D3B43
6E3D3B3E    49              DEC ECX
6E3D3B3F    83C9 F0         OR ECX,FFFFFFF0
6E3D3B42    41              INC ECX
6E3D3B43    394D B0         CMP DWORD PTR [EBP-50],ECX
6E3D3B46    0F85 7F000000   JNZ logiclay.6E3D3BCB
6E3D3B4C    8B45 CC         MOV EAX,DWORD PTR [EBP-34]   ; 校验3
6E3D3B4F    0345 C8         ADD EAX,DWORD PTR [EBP-38]
6E3D3B52    8B4D C4         MOV ECX,DWORD PTR [EBP-3C]
6E3D3B55    8D5408 03       LEA EDX,DWORD PTR [EAX+ECX+3]
6E3D3B59    81E2 0F000080   AND EDX,8000000F
6E3D3B5F    79 05           JNS SHORT logiclay.6E3D3B66
6E3D3B61    4A              DEC EDX
6E3D3B62    83CA F0         OR EDX,FFFFFFF0
6E3D3B65    42              INC EDX
6E3D3B66    3955 C0         CMP DWORD PTR [EBP-40],EDX
6E3D3B69    75 60           JNZ SHORT logiclay.6E3D3BCB
6E3D3B6B    8B4D DC         MOV ECX,DWORD PTR [EBP-24]   ; 校验4
6E3D3B6E    034D D8         ADD ECX,DWORD PTR [EBP-28]
6E3D3B71    8B55 D4         MOV EDX,DWORD PTR [EBP-2C]
6E3D3B74    8D4411 04       LEA EAX,DWORD PTR [ECX+EDX+4]
6E3D3B78    25 0F000080     AND EAX,8000000F
6E3D3B7D    79 05           JNS SHORT logiclay.6E3D3B84
6E3D3B7F    48              DEC EAX
6E3D3B80    83C8 F0         OR EAX,FFFFFFF0
6E3D3B83    40              INC EAX
6E3D3B84    3945 D0         CMP DWORD PTR [EBP-30],EAX
6E3D3B87    75 42           JNZ SHORT logiclay.6E3D3BCB
6E3D3B89    8B55 EC         MOV EDX,DWORD PTR [EBP-14]   ; 校验5
6E3D3B8C    0355 E8         ADD EDX,DWORD PTR [EBP-18]
6E3D3B8F    8B45 E4         MOV EAX,DWORD PTR [EBP-1C]
6E3D3B92    8D4C02 05       LEA ECX,DWORD PTR [EDX+EAX+5]
6E3D3B96    81E1 0F000080   AND ECX,8000000F
6E3D3B9C    79 05           JNS SHORT logiclay.6E3D3BA3
6E3D3B9E    49              DEC ECX
6E3D3B9F    83C9 F0         OR ECX,FFFFFFF0
6E3D3BA2    41              INC ECX
6E3D3BA3    394D E0         CMP DWORD PTR [EBP-20],ECX
6E3D3BA6    75 23           JNZ SHORT logiclay.6E3D3BCB

'
'  {中间代码省略}
'
6E3D3C14  ^ E9 52FCFFFF     JMP logiclay.6E3D386B

>>>>>>>>>>>>>>> 第八部分: 分析注册号的输入规则 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

1. 在 >>> 第七部分: 不要满足直接获取注册号码 <<< 的一大段汇编代码中, 已经按照颜色区别标准了各种处理注册号的逻辑功能.

XXX色块汇编代码: 判断注册号长度是否为0x18(十进制: 24)
XXX色块汇编代码: 把注册号转化为大写
XXX色块汇编代码: 判断注册号前4个字符是否为: 8A77 或 6DFD 或 82DA 或 B4DE 或 75E2 或 84E4 或 E985
XXX色块汇编代码: 判断注册号的每个字符是否在 0~9 或者 A~F 范围

2. Ok, 通过上面分析出的破解规则我们可以尝试输入一个符合规则的测试注册号, 比如“E98556789abcdef123456789”, 这样做的目的是为了更好的进入处理注册号的核心算法. 下面我们重新返回1-click pc tuneup软件的注册对话框, 并输入“E98556789abcdef123456789”, 再次按下"Activate Now",此时我们会再次进入内置"82A63CCD5F3A45AA97DB7A0C"注册号所在的函数, 然后再按下F8(步过), 会来到红颜色块的汇编代码, 这里就是注册号的核心算法了.

>>>>>>>>>>>>>>> 第九部分: 分析注册号码的生成算法 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

1. 通过分析红颜色块的汇编代码, 可以知道, 注册码核心算法流程如下:
   1.1 把长度为0x18(十进制: 24)的注册码划分为6段, 每段4个字符.
   1.2 头段就是注册号码的特征头: 8A77 或 6DFD 或 82DA 或 B4DE 或 75E2 或 84E4 或 E985
   1.3 后面5段的计算方式如下:
        1.3.1 每段索引值分别为 1 2 3 4 5
1.3.2 当计算依次计算每段的4个字符时,会先把当前段后面的3个字符当作16进制相加, 然后在加上当前段的索引值.
1.3.3 通过1.3.2的方式计算出来值, 再进行计算出当前段的第1个字符.
   假设1.3.2的方式计算出来值为X,当前段的第1个字符为Y, 那么X和Y之间的关系如下:
   Y = X and 0x8000000F ;
   if (Y < 0)
   {
      Y := Y - 1 ;
      Y := Y or 0xFFFFFFF0 ;
      Y := Y + 1 ;
    }

2. 经过上面分析,就可以理清整个注册号的生成规则, 并写出1-click pc tuneup软件的注册机了.
2013-10-15 13:56
0
雪    币: 158
活跃值: (263)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
>>>>>>>>>>>>>>> 第十部分: 为1-click pc tuneup软件写注册机 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

1. 在 >>>  第九部分: 分析注册号码的生成算法 <<< 我们已经总结出注册号的生成算法原理, 那么可以根据这个原理来写出一个针对1-click pc tuneup软件的注册机. 这里我首选使用Delphi开发工具来编写注册机, 因为Delphi的开发效率高, 而且生成的程序小. 下面就贴出注册机核心算法函数: fun_Key_Create() 和 fun_Kye_OneGroup(). 那么我们在使用算法生产的时候, 只需要调用fun_Key_Create()函数就可以了.




// 注册号规则处理
function fun_Kye_OneGroup(str_param_Key_OneGroup : string;
                          int_param_Key_OneGroupIndex : Integer):string ;
var
  dword_key : DWORD ;
  dword_key_Result : array[1..3] of DWORD;
  int_Index : Integer ;
  str_Key_OneGroup : string ;
begin
  Result := '' ;
  // 参数校验
  if (Length(str_param_Key_OneGroup) <> 3) or
     ((int_param_Key_OneGroupIndex <= 0) or
      (int_param_Key_OneGroupIndex > 5) ) then
  begin
    Exit ;
  end;
  // 转换为大写
  str_Key_OneGroup := UpperCase(str_param_Key_OneGroup) ;
  // 转换为btye数组
  for int_Index := 1 to Length(str_Key_OneGroup) do
  begin
    if Ord(str_Key_OneGroup[int_Index]) > $46 then
    begin
      dword_key_Result[int_Index] := 0 ;
    end
    else if Ord(str_Key_OneGroup[int_Index]) >= $41 then
    begin
       dword_key_Result[int_Index] := DWORD(Ord(str_Key_OneGroup[int_Index])) -
                                                   $37 ;
    end
    else if Ord(str_Key_OneGroup[int_Index]) >= $30  then
    begin
      dword_key_Result[int_Index] := DWORD(Ord(str_Key_OneGroup[int_Index])) -
                                                   $30 ;
    end;
  end;
  // 计算因子
  dword_key := dword_key_Result[3] + dword_key_Result[2] + dword_key_Result[1] +
               int_param_Key_OneGroupIndex ;
  // 通过 因子 计算另一个 序列号字符
  dword_key := dword_key and $8000000F ;
  if dword_key < 0 then
  begin
    dword_key := dword_key - 1 ;
    dword_key := dword_key or $FFFFFFF0 ;
    dword_key := dword_key + 1 ;
  end;
  Result := IntToHex(Ord(dword_key), 1) +  str_Key_OneGroup ;
end;// End fun_Kye_OneGroup()
// 注册号生成
function fun_Key_Create():string;
const
  // 注册号特征头
  str_Key_Head : array[0..6] of string = ('8A77', '6DFD', '82DA', 'B4DE', '75E2', '84E4', 'E985') ;
var
  str_Key_Base : string ;
begin
  // 注册号字符规则
  str_Key_Base := '0123456789ABCDEF' ;
  Result := str_Key_Head[RandomRange(0, 6)]+
            fun_Kye_OneGroup(str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)], 1)+
            fun_Kye_OneGroup(str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)], 2)+
            fun_Kye_OneGroup(str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)], 3)+
            fun_Kye_OneGroup(str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)], 4)+
            fun_Kye_OneGroup(str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)]+
                             str_Key_Base[RandomRange(1, 16)], 5) ;
end;// End fun_Key_Create()


结尾: 经过这次的1-click pc tuneup软件的破解, 又让我感觉回到年轻的时候, 是那么的激动. 这种感觉只有真正破解过软件的人才能体会到. 此软件破解分析周期3天, 剩下的时间都是来写这篇破解文章. 希望大家喜欢! 另外: 这次有些遗憾的地方,就是没有再次去分析这个软件注册号的几个特征头的含义^_^
上传的附件:
2013-10-15 13:57
0
雪    币: 36
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
肯定会火的,前排留名
2013-10-15 13:58
0
雪    币: 160
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
支持三哥
2013-10-15 14:14
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
大牛,过程很详细

强顶
2013-10-15 16:28
0
雪    币: 114
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
灰常详细,谢谢分享。
2013-10-15 16:40
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
很详细,照顾了初学者,多谢!支持楼主!
2013-10-15 17:27
0
雪    币: 400
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这篇文章写得太好了 非常祥细。。
2013-10-17 04:10
0
雪    币: 3572
活跃值: (760)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
支持三哥。。。
2013-11-5 17:01
0
雪    币: 143
活跃值: (108)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
13
纯支持,讲师
2013-11-5 17:21
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
猪哥我顶你!
2013-11-5 17:49
0
雪    币: 67
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
支持下...讲的很详细
2013-11-5 17:53
0
雪    币: 100
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
cff
16
谢谢分享,支持下
2013-11-6 08:17
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
17
菜鸟表示很受用,十分感谢
2013-11-6 09:14
0
雪    币: 264
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
支持,图文并茂....学习了....
2013-11-6 10:23
0
雪    币: 225
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
很不错的文章  收藏一个
2013-11-6 10:39
0
雪    币: 8719
活跃值: (2085)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
非常的精彩,条理很清晰,学习了,谢谢!希望三哥继续添彩。
2013-11-6 12:44
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
21
三哥复出了?
2013-11-6 21:34
0
雪    币: 92
活跃值: (100)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
谢谢分享,我得仔细看看
2013-11-11 11:06
0
雪    币: 242
活跃值: (1664)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
23
分析的不错,需要支持!
2013-11-11 12:33
0
雪    币: 190
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
支持下...讲的很详细
2013-11-19 03:50
0
雪    币: 3761
活跃值: (510)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
支持原创,图文很详细
2013-11-19 10:22
0
游客
登录 | 注册 方可回帖
返回
//