飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7538|回复: 15

[原创] *米机器人上传下载任务数限制破解分析

[复制链接]
  • TA的每日心情
    开心
    2015-12-7 14:03
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2009-11-13 19:58:13 | 显示全部楼层 |阅读模式
    【文章标题】: *米机器人上传下载任务数限制破解分析
    【文章作者】: 笨笨鼠
    【软件名称】: *米机器人
    【软件大小】: 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的指点下

      对限制总数重新进行了分析,这里只写出简单的分析结果,具体的分析原因有兴趣的自己分析看一下多试试就明白了!
       
      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.软件作为共享软件虽不需要注册,但是有限制也是很不爽的,既然作者做了这样的限制也应该相应的才去一点点保护措施,但是作者一点保护措施都没有,这才给我这样的菜鸟练习的机会。
      
    --------------------------------------------------------------------------------
    【版权声明】: 本文原创于笨笨鼠, 转载请注明作者并保持文章的完整, 谢谢!

                                                           2009年11月13日 12:57:04

    评分

    参与人数 1飘云币 +20 收起 理由
    sjh717142 + 20 您的贴子很精彩,希望能再次分享!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 01:09
  • 签到天数: 1084 天

    [LV.10]以坛为家III

    发表于 2009-11-13 21:03:05 | 显示全部楼层
    如果发个破解限制的软件就更好了,谢谢分享
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-10-22 12:29
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2009-11-15 16:58:36 | 显示全部楼层
    楼上的看楼主的分析自己弄一遍不得了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-11-15 17:07:22 | 显示全部楼层
    不错 ~~
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-4-29 07:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-11-20 15:16:59 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-11-26 19:52:50 | 显示全部楼层
    学习了,但是我想服务器应该也是限制连接数的吧。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-12-7 14:03
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2009-12-3 22:14:06 | 显示全部楼层
    服务器没有 限制 已经试过了 可以同时上传和下载N个文件的 至少我试验的几十个还是可以同时进行的
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-12-5 12:12:50 | 显示全部楼层
    那没有限制据不要了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-12-5 13:15:49 | 显示全部楼层
    楼主你这是个牛人
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-12-30 12:32
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2009-12-5 18:47:50 | 显示全部楼层
    好方法自然要好好学习一下!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表