- UID
- 50202
注册时间2008-5-1
阅读权限10
最后登录1970-1-1
周游历练
TA的每日心情 | 开心 2015-12-7 14:03 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
【文章标题】: *米机器人上传下载任务数限制破解分析
【文章作者】: 笨笨鼠
【软件名称】: *米机器人
【软件大小】: 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 |
评分
-
查看全部评分
|