主题 : [破解教程]x米机器人上传下载任务数限制破解分析
级别: 荣誉管理员

UID: 5198
精华: 0
发帖: 11309
威望: 49492 点
无痕币: 99535 WHB
贡献值: 249 点
在线时间: 4469(时)
注册时间: 2007-12-18
最后登录: 2021-12-01

0 [破解教程]x米机器人上传下载任务数限制破解分析

【文章标题】: *米机器人上传下载任务数限制破解分析
【文章作者】: 笨笨鼠
【软件名称】: *米机器人
【软件大小】: 504KB
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【保护方式】: 基本“裸体”
【编写语言】: Microsoft Visual C++ 7.0
【使用工具】: PEID OD
【操作平台】: XP SP3
【软件介绍】: 相信大家都知道的,就不做详细介绍了!
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】

      今天用*米机器人下载东西,发现有数量限制,修改大于限制值时被软件改回,不爽,于是就有了下文:
  
      首先还是PEID查一下壳吧:Microsoft Visual C++ 7.0 原来是裸体版的 暗自高兴。。。。 有壳就不好玩了哦!谁让咱是菜鸟呢!
  
  废话少说!OD载入,F9运行,在设置中填入需要的下载任务数和上传任务数,按应用发现马上被改成了原来的5 和2,看到这里我们先想一下软件运行思路吧!
      
      设想一下:软件先读取我们写入的数值,然后和软件设定的最大限定值做比较,如果我们写的数值小于软件限定的最大值则软件不修改,若大于限定的数值,那么软件把5和2重新写到我们修改过的数据!
      
      有了软件的运行思路,那我们来想一下破解的思路吧,软件肯定要读取我们写入的数据的,所以我们可以在读取数据上下断点,然后找到软件作比较的地方把关键跳或者关键的语句修改了,那样软件就会跳向我们希望的流程,
  
  然后,我们还要把软件写回去的数值改成我们写入的数值,那样,软件的任务数量限制也就被和谐了!(另外每次修改后软件的按钮变灰,所以我想应该可以下功能限制的断点,但是本人菜菜没有断下!)
  
      有了思路就好办了,准备动手吧。首先先下断点吧,由于是C++的程序,用了几个其他的断字符串的断点都不起作用,所以还是用万能断点试试吧!
  
  在下载任务数填写99999, 在上传任务处填写88888,然后再OD中设置万能断点,点应用,软件被断了下来,但是看看内存和寄存器都没有出现我们填写的99999和88888,嗯,别着急程序还没有读到那里,我们按F9运行,直到寄存器中出现
  
  我们填写的数据,
  
  ESI 0019A830 UNICODE "88888"
  
  出现了关键数据了,我们按ALT+F9返回,然后再按ALT+F9返回,程序返回后来到了这里:
  
  0043088A    .  8D85 C8FDFFFF    lea eax,dword ptr ss:[ebp-238]      ;  //alt+F9返回后来到这里,由于段首好长我们先在这里F2下断,方便后面跟踪!同时取消其他的断点吧,免得跟踪的时候老被断下来。
  00430890    .  50               push eax
  00430891    .  E8 1FEA0000      call 原DUTOOL.0043F2B5
  00430896    .  8BF8             mov edi,eax
  00430898    .  85FF             test edi,edi
  0043089A    .  59               pop ecx
  0043089B    .  7D 0B            jge short 原DUTOOL.004308A8
  
  我们上下拉拉看看是不是到了程序的关键地方了,向下拉的时候你看了什么?
  
  004308F3    . /7D 17            jge short 原DUTOOL.0043090C
  004308F5    . |50               push eax                            ; /Style => MB_OK|MB_APPLMODAL
  004308F6    . |50               push eax                            ; |Title => NULL
  004308F7    . |68 9CC54600      push 原DUTOOL.0046C59C               ; |Text = "无效的最大同时下载任务数"
  004308FC    . |50               push eax                            ; |hOwner => NULL
  004308FD    . |FF15 D8824600    call dword ptr ds:[<&USER32.Message>; \MessageBoxW
  
  这里!对既然这里出现了这样的字符串,我们想这里肯定就是关键的地方了!好,我们F8单步跟踪一下看看关键的地方在哪里?这个时候一定要多注意寄存器的情况!
  
  
  0043088A    .  8D85 C8FDFFFF    lea eax,dword ptr ss:[ebp-238]      ;  alt+F9返回后来到这里
  00430890    .  50               push eax                            ;  //把输入的“88888”放到EAX中
  00430891    .  E8 1FEA0000      call 原DUTOOL.0043F2B5               ;  //先不管他F8通过看看程序要做什么
  00430896    .  8BF8             mov edi,eax
  00430898    .  85FF             test edi,edi
  0043089A    .  59               pop ecx
  0043089B    .  7D 0B            jge short 原DUTOOL.004308A8
  0043089D    .  33F6             xor esi,esi
  0043089F    .  56               push esi
  004308A0    .  56               push esi
  004308A1    .  68 B8C54600      push 原DUTOOL.0046C5B8
  004308A6    .^ EB A4            jmp short 原DUTOOL.0043084C
  004308A8    >  8D4D EC          lea ecx,dword ptr ss:[ebp-14]
  004308AB    .  E8 9E58FDFF      call 原DUTOOL.0040614E
  004308B0    .  A1 94934700      mov eax,dword ptr ds:[479394]
  004308B5    .  8B88 3C010000    mov ecx,dword ptr ds:[eax+13C]      ;  //程序运行到这里的时候ECX=2,而我们填写的88888正好和这里的最大限制值2对应,看来这里是个关键!!
  004308BB    .  3BF9             cmp edi,ecx                         ;  //这里用我们写入的数据与2做比较
  004308BD    .  76 02            jbe short 原DUTOOL.004308C1          ; //比较小于等于则跳
  004308BF       8BF9             mov edi,ecx                         ;  //如果我们写入的数据大于2则这个跳转不跳,这又将2写入到我们改过的数据是不是和我们开始分析的很接近呢?我们把这里改成MOV EDI,EDI不让他修改我们的数据
  004308C1    >  8D4D EC          lea ecx,dword ptr ss:[ebp-14]       ;  //我们继续分析,GOGOGO!
  004308C4    .  8978 70          mov dword ptr ds:[eax+70],edi
  004308C7    .  E8 9E58FDFF      call 原DUTOOL.0040616A
  004308CC    .  8D85 C8FDFFFF    lea eax,dword ptr ss:[ebp-238]
  004308D2    .  50               push eax
  004308D3    .  53               push ebx
  004308D4    .  6A 0D            push 0D
  004308D6    .  68 08040000      push 408
  004308DB    .  FF75 08          push dword ptr ss:[ebp+8]
  004308DE    .  FFD6             call esi
  004308E0    .  8D85 C8FDFFFF    lea eax,dword ptr ss:[ebp-238]
  004308E6    .  50               push eax                            ;  //运行到这里的时候 EAX=99999 正是我们输入的
  004308E7    .  E8 C9E90000      call 原DUTOOL.0043F2B5                  
  004308EC    .  8BF8             mov edi,eax                            //  这里吧EAX的值给EDI
  004308EE    .  33C0             xor eax,eax                            //这里对EAX清0 ,经过分析我们知道下面关键跳要跳的话只要这句不执行就可以了,我们可以这样改  or eax,eax                        
  004308F0    .  3BF8             cmp edi,eax                            // 这里对EDI和EAX比较,由于上句对EAX清0,所以想要这里相等的话就要求EAX=EDI=0或者上面的那句对EAX的清0不执行!
  004308F2    .  59               pop ecx
  004308F3    .  7D 17            jge short 原DUTOOL.0043090C            // 这里是关键跳,这个不跳 就出现了下面的提示了!所以这里一定要跳!
  004308F5    .  50               push eax                            ; /Style => MB_OK|MB_APPLMODAL
  004308F6    .  50               push eax                            ; |Title => NULL
  004308F7    .  68 9CC54600      push 原DUTOOL.0046C59C               ; |Text = "无效的最大同时下载任务数"  注意这里,如果填写的数据有问题就会有这个提示,我们样跳过这个提示呢?看上面的几句分析!
  004308FC    .  50               push eax                            ; |hOwner => NULL
  004308FD    .  FF15 D8824600    call dword ptr ds:[<&USER32.Message>; \MessageBoxW
  00430903    .  837D EC 00       cmp dword ptr ss:[ebp-14],0
  00430907    .  E9 E4010000      jmp 原DUTOOL.00430AF0
  0043090C    >  8D4D EC          lea ecx,dword ptr ss:[ebp-14]
  0043090F    .  E8 3A58FDFF      call 原DUTOOL.0040614E               ; //这里是与5比较
  00430914    .  A1 94934700      mov eax,dword ptr ds:[479394]
  00430919    .  8B88 40010000    mov ecx,dword ptr ds:[eax+140]
  0043091F    .  3BF9             cmp edi,ecx                         ;  //程序运行到这里的时候ECX=5正好和上面=2的情况一样
  00430921    .  76 02            jbe short 原DUTOOL.00430925          ; //这里同样比较我们输入的数据小于等于就跳,不覆盖我们的数据,如果大于了就不跳由下句覆盖我们写入的数据
  00430923       8BF9             mov edi,ecx                         ;  //由于我们输入的数据大于5,程序将运行到这里,这条语句就是用限定值覆盖我们写的数据所以这里我们可以这么改MOV DEI,EDI
  00430925    >  8D4D EC          lea ecx,dword ptr ss:[ebp-14]
  00430928    .  8978 74          mov dword ptr ds:[eax+74],edi
  
  
  修改完上面两个地方后,F9运行程序看到了吧,已经修改过了,程序已经按我们想的去执行了。好!我们保存程序,已经是破解了限制的软件了!简单吧!只要简单的修改几个比较的地方就可以搞定了!
  
  由于本人比较菜不懂算法,程序里的一些CALL没有进入有能力的人自己进去好好分析吧,其实破解限制就这么简单已经搞定了,对于像我这样不懂汇编不会编程的菜鸟都可以做到的 相信你也能做到的,只要对自己有信心分析起来还是不是很难的
  
  好了,就到这里吧!
  
  由于软件是裸体的,没有加壳也没有什么校验所以分析起来比较容易也很适合新手学习练手。

  在sjg00000的指点下:

  对限制总数重新进行了分析,这里只写出简单的分析结果,具体的分析原因有兴趣的自己分析看一下多试试就明白了!在此对sjg00000表示感谢!
  
  OD中搜上面几个字符串找到关键地方

  0040ED9A    6A 18           push    0x18
  0040ED9C    68 349E4600     push    00469E34                         ; max_download_connections
  0040EDA1    53              push    ebx
  0040EDA2    E8 BCBF0300     call    0044AD63
  0040EDA7    83C4 0C         add     esp, 0xC
  0040EDAA    85C0            test    eax, eax
  0040EDAC    75 4A           jnz     short 0040EDF8
  0040EDAE    6A 01           push    0x1
  0040EDB0    FF35 94934700   push    dword ptr [0x479394]
  0040EDB6    8D8D CCFEFFFF   lea     ecx, dword ptr [ebp-0x134]
  0040EDBC    E8 7A22FFFF     call    0040103B
  0040EDC1    57              push    edi
  0040EDC2    E8 59030300     call    0043F120
  0040EDC7    39B5 CCFEFFFF   cmp     dword ptr [ebp-0x134], esi
  0040EDCD    59              pop     ecx
  0040EDCE    8B0D 94934700   mov     ecx, dword ptr [0x479394]
  0040EDD4    8981 60010000   mov     dword ptr [ecx+0x160], eax
  0040EDDA  ^ 0F84 28FAFFFF   je      0040E808
  0040EDE0    80BD D0FEFFFF 0>cmp     byte ptr [ebp-0x130], 0x0
  0040EDE7  ^ 0F84 1BFAFFFF   je      0040E808
  0040EDED    FFB5 CCFEFFFF   push    dword ptr [ebp-0x134]
  0040EDF3    E9 A9060000     jmp     0040F4A1
  0040EDF8    6A 16           push    0x16
  0040EDFA    68 1C9E4600     push    00469E1C                         ; max_upload_connections
  0040EDFF    53              push    ebx
  0040EE00    E8 5EBF0300     call    0044AD63
  0040EE05    83C4 0C         add     esp, 0xC
  0040EE08    85C0            test    eax, eax
  0040EE0A    75 4A           jnz     short 0040EE56
  0040EE0C    6A 01           push    0x1
  0040EE0E    FF35 94934700   push    dword ptr [0x479394]
  0040EE14    8D8D 44FEFFFF   lea     ecx, dword ptr [ebp-0x1BC]
  0040EE1A    E8 1C22FFFF     call    0040103B
  0040EE1F    57              push    edi
  0040EE20    E8 FB020300     call    0043F120
  0040EE25    39B5 44FEFFFF   cmp     dword ptr [ebp-0x1BC], esi
  0040EE2B    59              pop     ecx
  0040EE2C    8B0D 94934700   mov     ecx, dword ptr [0x479394]
  0040EE32    8981 64010000   mov     dword ptr [ecx+0x164], eax
  0040EE38  ^ 0F84 CAF9FFFF   je      0040E808
  0040EE3E    80BD 48FEFFFF 0>cmp     byte ptr [ebp-0x1B8], 0x0
  0040EE45  ^ 0F84 BDF9FFFF   je      0040E808
  0040EE4B    FFB5 44FEFFFF   push    dword ptr [ebp-0x1BC]
  0040EE51    E9 4B060000     jmp     0040F4A1
  0040EE56    6A 13           push    0x13
  0040EE58    68 089E4600     push    00469E08                         ; download_task_limit
  0040EE5D    53              push    ebx
  0040EE5E    E8 00BF0300     call    0044AD63
  0040EE63    83C4 0C         add     esp, 0xC
  0040EE66    85C0            test    eax, eax
  0040EE68    75 5D           jnz     short 0040EEC7
  0040EE6A    6A 01           push    0x1
  0040EE6C    FF35 94934700   push    dword ptr [0x479394]
  0040EE72    8D8D 7CFEFFFF   lea     ecx, dword ptr [ebp-0x184]
  0040EE78    E8 BE21FFFF     call    0040103B
  0040EE7D    57              push    edi
  0040EE7E    E8 9D020300     call    0043F120                         ; 这个CALL运行完后EAX=5,也就是下载的限制数,我们可以进这个CALL中重新给EAX赋值这样最大限制数就被我们改变了
  0040EE83    59              pop     ecx
  0040EE84    8B0D 94934700   mov     ecx, dword ptr [0x479394]
  0040EE8A    8981 40010000   mov     dword ptr [ecx+0x140], eax       ; 这个条语句控制着我们输入的数据情况如果不改的话,下载数将和限制数一样,这里我们把mov     dword ptr [ecx+0x140], eax修改为mov     dword ptr [ecx+0x140], ecx这样下载数 就是我们输入的数了
  0040EE90    A1 94934700     mov     eax, dword ptr [0x479394]
  0040EE95    8B88 40010000   mov     ecx, dword ptr [eax+0x140]
  0040EE9B    3948 74         cmp     dword ptr [eax+0x74], ecx
  0040EE9E    76 03           jbe     short 0040EEA3
  0040EEA0    8948 74         mov     dword ptr [eax+0x74], ecx
  0040EEA3    39B5 7CFEFFFF   cmp     dword ptr [ebp-0x184], esi
  0040EEA9  ^ 0F84 59F9FFFF   je      0040E808
  0040EEAF    80BD 80FEFFFF 0>cmp     byte ptr [ebp-0x180], 0x0
  0040EEB6  ^ 0F84 4CF9FFFF   je      0040E808
  0040EEBC    FFB5 7CFEFFFF   push    dword ptr [ebp-0x184]
  0040EEC2    E9 DA050000     jmp     0040F4A1
  0040EEC7    6A 11           push    0x11
  0040EEC9    68 F49D4600     push    00469DF4                         ; upload_task_limit
  0040EECE    53              push    ebx
  0040EECF    E8 8FBE0300     call    0044AD63
  0040EED4    83C4 0C         add     esp, 0xC
  0040EED7    85C0            test    eax, eax
  0040EED9    75 5D           jnz     short 0040EF38
  0040EEDB    6A 01           push    0x1
  0040EEDD    FF35 94934700   push    dword ptr [0x479394]
  0040EEE3    8D8D C4FEFFFF   lea     ecx, dword ptr [ebp-0x13C]
  0040EEE9    E8 4D21FFFF     call    0040103B
  0040EEEE    57              push    edi
  0040EEEF    E8 2C020300     call    0043F120                         ; 这个CALL运行完后EAX=2,也就是上传的限制数,我们可以进这个CALL中重新给EAX赋值这样最大限制数就被我们改变了这里调用了下载的地方只要改上面一处就可以了
  0040EEF4    59              pop     ecx
  0040EEF5    8B0D 94934700   mov     ecx, dword ptr [0x479394]
  0040EEFB    8981 3C010000   mov     dword ptr [ecx+0x13C], eax       ; 这个条语句控制着我们输入的数据情况如果不改的话,下载数将和限制数一样,这里我们把mov     dword ptr [ecx+0x13C], eax修改为mov     dword ptr [ecx+0x13C], ecx这样下载数 就是我们输入的数了
  0040EF01    A1 94934700     mov     eax, dword ptr [0x479394]
  0040EF06    8B88 3C010000   mov     ecx, dword ptr [eax+0x13C]
  0040EF0C    3948 70         cmp     dword ptr [eax+0x70], ecx
  0040EF0F    76 03           jbe     short 0040EF14
  0040EF11    8948 70         mov     dword ptr [eax+0x70], ecx
  0040EF14    39B5 C4FEFFFF   cmp     dword ptr [ebp-0x13C], esi
  0040EF1A  ^ 0F84 E8F8FFFF   je      0040E808
  0040EF20    80BD C8FEFFFF 0>cmp     byte ptr [ebp-0x138], 0x0
  0040EF27  ^ 0F84 DBF8FFFF   je      0040E808
  0040EF2D    FFB5 C4FEFFFF   push    dword ptr [ebp-0x13C]
  0040EF33    E9 69050000     jmp     0040F4A1
  
  
  我们进入这个0040EE7E    E8 9D020300     call    0043F120这个CALL
  
  0043F120  ^\E9 73FFFFFF     jmp     0043F098  进入CALL后来到这里,我们继续前进,F8来到这里
  
  0043F098    56              push    esi
  0043F099    57              push    edi
  0043F09A    E8 98350000     call    00442637
  0043F09F    8B78 64         mov     edi, dword ptr [eax+0x64]
  0043F0A2    3B3D AC784700   cmp     edi, dword ptr [0x4778AC]        ; DUTool.00477858
  0043F0A8    74 07           je      short 0043F0B1
  0043F0AA    E8 42120000     call    004402F1
  0043F0AF    8BF8            mov     edi, eax
  
  我们直接从这句0043F098    56              push    esi开始改,改为下面的代码
  
  0043F098    B8 99999999     mov     eax, 0x99999999 //这里的99999999可以随意看你的喜好了!
  0043F09D    C3              retn
  0043F09E    90              nop
  
  根据上面的分析只要修改三个地方就可以了:
  
  1.
  
  0043F098    56              push    esi
  0043F099    57              push    edi
  0043F09A    E8 98350000     call    00442637
  0043F09F    8B78 64         mov     edi, dword ptr [eax+0x64]
  
  修改为
  
  0043F098    B8 99999999     mov     eax, 0x99999999
  0043F09D    C3              retn
  0043F09E    90              nop
  
  2.
  
  0040EE8A    8981 40010000   mov     dword ptr [ecx+0x140], eax
  
  修改为
  
  0040EE8A    8981 40010000   mov     dword ptr [ecx+0x140], ecx
  
  3.
  
  0040EE8A    8981 40010000   mov     dword ptr [ecx+0x13c], eax
  
  修改为
  
  0040EE8A    8981 40010000   mov     dword ptr [ecx+0x13c], ecx
  
  至此正个软件的限制就彻底和谐了!但是最大限制数目并不是我们改后的mov     eax, 0x99999999 ,而是一个经过计算的计算机上认为的最大的数,这里我就不再分析了!经过上面的修改软件的最大限制数变成了一个很大的数了,而我们输入的下载上传数也不在被覆盖!

  

  
  
--------------------------------------------------------------------------------
【经验总结】

  1.以前听有人提过,看这样的分析很重要的是看分析的思路,今天这个,我也是这样想的,见到一个不加壳的软件的时候有清晰的思路是很重要的。如果有壳的话那其实最重要的就是脱壳了,那就看你的能力了。
  
  2.软件作为共享软件虽不需要注册,但是有限制也是很不爽的,既然作者做了这样的限制也应该相应的才去一点点保护措施,但是作者一点保护措施都没有,这才给我这样的菜鸟练习的机会。
  
Total 0.032882(s) query 3, Time now is:05-10 17:30, Gzip enabled 粤ICP备07514325号-1
Powered by PHPWind v7.3.2 Certificate Code © 2003-13 秋无痕论坛