wuqing1501 发表于 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:      ;//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:      ;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:
004308AB    .E8 9E58FDFF      call 原DUTOOL.0040614E
004308B0    .A1 94934700      mov eax,dword ptr ds:
004308B5    .8B88 3C010000    mov ecx,dword ptr ds:      ;//程序运行到这里的时候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:       ;//我们继续分析,GOGOGO!
004308C4    .8978 70          mov dword ptr ds:,edi
004308C7    .E8 9E58FDFF      call 原DUTOOL.0040616A
004308CC    .8D85 C8FDFFFF    lea eax,dword ptr ss:
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:
004308DE    .FFD6             call esi
004308E0    .8D85 C8FDFFFF    lea eax,dword ptr ss:
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:,0
00430907    .E9 E4010000      jmp 原DUTOOL.00430AF0
0043090C    >8D4D EC          lea ecx,dword ptr ss:
0043090F    .E8 3A58FDFF      call 原DUTOOL.0040614E               ; //这里是与5比较
00430914    .A1 94934700      mov eax,dword ptr ds:
00430919    .8B88 40010000    mov ecx,dword ptr ds:
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:
00430928    .8978 74          mov dword ptr ds:,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
0040EDB6    8D8D CCFEFFFF   lea   ecx, dword ptr
0040EDBC    E8 7A22FFFF   call    0040103B
0040EDC1    57            push    edi
0040EDC2    E8 59030300   call    0043F120
0040EDC7    39B5 CCFEFFFF   cmp   dword ptr , esi
0040EDCD    59            pop   ecx
0040EDCE    8B0D 94934700   mov   ecx, dword ptr
0040EDD4    8981 60010000   mov   dword ptr , eax
0040EDDA^ 0F84 28FAFFFF   je      0040E808
0040EDE0    80BD D0FEFFFF 0>cmp   byte ptr , 0x0
0040EDE7^ 0F84 1BFAFFFF   je      0040E808
0040EDED    FFB5 CCFEFFFF   push    dword ptr
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
0040EE14    8D8D 44FEFFFF   lea   ecx, dword ptr
0040EE1A    E8 1C22FFFF   call    0040103B
0040EE1F    57            push    edi
0040EE20    E8 FB020300   call    0043F120
0040EE25    39B5 44FEFFFF   cmp   dword ptr , esi
0040EE2B    59            pop   ecx
0040EE2C    8B0D 94934700   mov   ecx, dword ptr
0040EE32    8981 64010000   mov   dword ptr , eax
0040EE38^ 0F84 CAF9FFFF   je      0040E808
0040EE3E    80BD 48FEFFFF 0>cmp   byte ptr , 0x0
0040EE45^ 0F84 BDF9FFFF   je      0040E808
0040EE4B    FFB5 44FEFFFF   push    dword ptr
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
0040EE72    8D8D 7CFEFFFF   lea   ecx, dword ptr
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
0040EE8A    8981 40010000   mov   dword ptr , eax       ; 这个条语句控制着我们输入的数据情况如果不改的话,下载数将和限制数一样,这里我们把mov   dword ptr , eax修改为mov   dword ptr , ecx这样下载数 就是我们输入的数了
0040EE90    A1 94934700   mov   eax, dword ptr
0040EE95    8B88 40010000   mov   ecx, dword ptr
0040EE9B    3948 74         cmp   dword ptr , ecx
0040EE9E    76 03         jbe   short 0040EEA3
0040EEA0    8948 74         mov   dword ptr , ecx
0040EEA3    39B5 7CFEFFFF   cmp   dword ptr , esi
0040EEA9^ 0F84 59F9FFFF   je      0040E808
0040EEAF    80BD 80FEFFFF 0>cmp   byte ptr , 0x0
0040EEB6^ 0F84 4CF9FFFF   je      0040E808
0040EEBC    FFB5 7CFEFFFF   push    dword ptr
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
0040EEE3    8D8D C4FEFFFF   lea   ecx, dword ptr
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
0040EEFB    8981 3C010000   mov   dword ptr , eax       ; 这个条语句控制着我们输入的数据情况如果不改的话,下载数将和限制数一样,这里我们把mov   dword ptr , eax修改为mov   dword ptr , ecx这样下载数 就是我们输入的数了
0040EF01    A1 94934700   mov   eax, dword ptr
0040EF06    8B88 3C010000   mov   ecx, dword ptr
0040EF0C    3948 70         cmp   dword ptr , ecx
0040EF0F    76 03         jbe   short 0040EF14
0040EF11    8948 70         mov   dword ptr , ecx
0040EF14    39B5 C4FEFFFF   cmp   dword ptr , esi
0040EF1A^ 0F84 E8F8FFFF   je      0040E808
0040EF20    80BD C8FEFFFF 0>cmp   byte ptr , 0x0
0040EF27^ 0F84 DBF8FFFF   je      0040E808
0040EF2D    FFB5 C4FEFFFF   push    dword ptr
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
0043F0A2    3B3D AC784700   cmp   edi, dword ptr       ; 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

修改为

0043F098    B8 99999999   mov   eax, 0x99999999
0043F09D    C3            retn
0043F09E    90            nop

2.

0040EE8A    8981 40010000   mov   dword ptr , eax

修改为

0040EE8A    8981 40010000   mov   dword ptr , ecx

3.

0040EE8A    8981 40010000   mov   dword ptr , eax

修改为

0040EE8A    8981 40010000   mov   dword ptr , ecx

至此正个软件的限制就彻底和谐了!但是最大限制数目并不是我们改后的mov   eax, 0x99999999 ,而是一个经过计算的计算机上认为的最大的数,这里我就不再分析了!





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

1.以前听有人提过,看这样的分析很重要的是看分析的思路,今天这个,我也是这样想的,见到一个不加壳的软件的时候有清晰的思路是很重要的。如果有壳的话那其实最重要的就是脱壳了,那就看你的能力了。

2.软件作为共享软件虽不需要注册,但是有限制也是很不爽的,既然作者做了这样的限制也应该相应的才去一点点保护措施,但是作者一点保护措施都没有,这才给我这样的菜鸟练习的机会。

--------------------------------------------------------------------------------
【版权声明】: 本文原创于笨笨鼠, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年11月13日 12:57:04

cbkxh 发表于 2009-11-13 21:03:05

如果发个破解限制的软件就更好了,谢谢分享

mswhy 发表于 2009-11-15 16:58:36

楼上的看楼主的分析自己弄一遍不得了

Nisy 发表于 2009-11-15 17:07:22

不错 ~~

HDd1145 发表于 2009-11-20 15:16:59

roczyl 发表于 2009-11-26 19:52:50

学习了,但是我想服务器应该也是限制连接数的吧。

wuqing1501 发表于 2009-12-3 22:14:06

服务器没有 限制 已经试过了 可以同时上传和下载N个文件的 至少我试验的几十个还是可以同时进行的

HAPPYHH 发表于 2009-12-5 12:12:50

那没有限制据不要了

xinjian185 发表于 2009-12-5 13:15:49

楼主你这是个牛人

fff000 发表于 2009-12-5 18:47:50

好方法自然要好好学习一下!
页: [1] 2
查看完整版本: *米机器人上传下载任务数限制破解分析