本帖最后由 lmze2000 于 2015-5-26 20:43 编辑
做为刚刚学得一点点逆向皮毛的小白,为能帮助一些人而有点小成就感
也深知,从一点不会摸索着前行的艰难,很多时候都是在猜测与试验中一点点的往前撑着走,
应坛友Jiejec的要求,录制了一个简单的视频,由于是第一次操作,声音不好听,还有些害羞呀,不习惯讲解,就全是文字说明的吧。
大神们就不要鄙视我了,给指点学习的方向和意见呀~~
链接:http://pan.baidu.com/s/19Aiqq 密码:c7gd
做为小白一名,向那些分享教程的前辈、同辈们致敬!!{:1_931:},发现写完一篇排版精美的教程是需要多么大的精力,特别是写了一半然后所有的东西全没了,还要再重新来一遍的时候。(刚刚写完一半,结果贴不上代码,然后切换了下浏览器的兼容模式,结果已经写好的全没有了。)
软件:无线天5.29windows版
下载地址:http://wifi.corpcorp.com/down.html
壳:经查无壳
所用工具:Cari Olldby
介绍就不多做了,上一张软件安装完成后的截图。安装完是试用7天,20用户数量(这篇破文一路坎坷,先前的截图,和后来测试时的代码完全不一样了,还得重新截一遍图)
破解前
一、现在我们开始动手了,经过这么多天的学习,我们一般动手前,都是要先查一下壳,看有没有壳保护程序。经查这个无线天是裸奔的,这对我们小新手来说是最好的消息。
接下来的步骤就是,先运行程序,如上一张图,找到注册的位置,先注册一下,看看出错信息,来初步掌握一下注册的流程,是直接弹出错误信息,还是重启验证等等
好给我们的破解带来帮助。经过简单的试验,上面的是“激活码错误”这条消息,那么我们就用OD载入程序,然后在汇编窗口右键--->“中文搜索引挚"--->"智能搜索"
搜索的关键字就用”激活码错误" ,搜索结果见下图,,在“激活码错误”那行,双击左键,跳转到反汇编窗口。来查找关键Call的位置。
1.1 这是搜索窗口,用来查找错误信息
字符串搜索
1.2 查找关键Call
一般的对于新手来说,在查找关键Call的地方,太让人头疼了,即使是看教程,在图文的指导下也可以找到关键Call,可一般让自己来找,都会
发蒙。特别是大神们,指着某个Call说,这个就是关键的了。那么像我们小白要怎么找呢。现在我们的这个水平,多半要多试验,多跑些冤枉路
会对以后的提高有好处。那么我们就以下面的例子来说明如何找关键Call.(说明:由于系统不同,OD载入的程序地址,可能每台机器不一样,
不用安全的参照我图片的地址来对应,你们可以参照反汇编出来的代码来查看。)
关键Call分析
下面这段代码,就是刚才双击错误信息跳转到汇编窗口的代码,注意看反汇编出来的代码,别注意前面的地址:
通过观察,跳过激活码错误的跳转依次有(从下向上的顺序)
01138262 /EB 13 jmp short WiFiNoNo.01138277
01138245 /75 30 jnz short WiFiNoNo.01138277
01138234 /75 41 jnz short WiFiNoNo.01138277
01138227 /74 4E je short WiFiNoNo.01138277
这4条都是跳过错误的跳转,虽然在这上面有一个Call
0113822C FF15 D0612D01 call dword ptr ds:[<&KERNEL32.IsBadReadP>; kernel32.IsBadReadPtr (但是看注释应该是系统调用,不是关键Call)
,在往上面看看,又发现了一条je跳转语句,并且还有test比较,这条je跳转语句,直接将上面4条跳向成功的语句都给越过去了。
所以这么可疑的Call,成为关键Call是非常有可能的,F2在这下断点,先试运行一下。经过多次调试,这个是关键Call无疑了。
[Asm] 纯文本查看 复制代码 01138212 8D5424 58 lea edx,dword ptr ss:[esp+0x58]
01138216 E8 B53E0100 call WiFiNoNo.0114C0D0 ; 此处是关键Call,注册码也是在这里计算完成。
0113821B 83C4 0C add esp,0xC
0113821E 84C0 test al,al
01138220 74 42 je short WiFiNoNo.01138264
这段是关键Call段的代码
[Asm] 纯文本查看 复制代码 01138212 8D5424 58 lea edx,dword ptr ss:[esp+0x58]
01138216 E8 B53E0100 call WiFiNoNo.0114C0D0 ; 此处是关键Call,注册码也是在这里计算完成。
0113821B 83C4 0C add esp,0xC
0113821E 84C0 test al,al
01138220 74 42 je short WiFiNoNo.01138264
01138222 8B77 04 mov esi,dword ptr ds:[edi+0x4]
01138225 3BF3 cmp esi,ebx
01138227 74 4E je short WiFiNoNo.01138277
01138229 6A 08 push 0x8
0113822B 56 push esi
0113822C FF15 D0612D01 call dword ptr ds:[<&KERNEL32.IsBadReadP>; kernel32.IsBadReadPtr
01138232 85C0 test eax,eax
01138234 75 41 jnz short WiFiNoNo.01138277
01138236 8B06 mov eax,dword ptr ds:[esi]
01138238 83F8 01 cmp eax,0x1
0113823B 75 05 jnz short WiFiNoNo.01138242
0113823D 8B76 0C mov esi,dword ptr ds:[esi+0xC]
01138240 EB 0B jmp short WiFiNoNo.0113824D
01138242 83F8 14 cmp eax,0x14
01138245 75 30 jnz short WiFiNoNo.01138277
01138247 8B4E 70 mov ecx,dword ptr ds:[esi+0x70]
0113824A 8B71 0C mov esi,dword ptr ds:[ecx+0xC]
0113824D 6A 01 push 0x1
0113824F 68 E8B72E01 push WiFiNoNo.012EB7E8 ; 提示
01138254 56 push esi
01138255 BE 9CD92E01 mov esi,WiFiNoNo.012ED99C ; 您使用的是旧版激活码,请找联系软件卖家升级激活码。
0113825A E8 71981300 call WiFiNoNo.01271AD0
0113825F 83C4 0C add esp,0xC
01138262 EB 13 jmp short WiFiNoNo.01138277
01138264 6A 10 push 0x10
01138266 68 00902E01 push WiFiNoNo.012E9000 ; 错误
0113826B 68 D0D92E01 push WiFiNoNo.012ED9D0 ; 激活码错误
01138270 53 push ebx
1.3、通过上面的分析,下好断点, 我们F9将程序运行起来,然后点击注册按钮---->输入我们的假码(说明,在写这篇破文的时候,发现我们输入的假码,会影响到生成的
真码,也就是说,不同的假码会使真码的有效用户数量不同,这个一会在做下测试,我用的数字假码、123生成3个有效用户,1234567生成了67个有效用户,123456789012345生
成了9242个有效用户、7131个无效用户,具体咋回事,由于不会分析,也弄不清楚。只能来猜测。)
在点击注册的时候,程序断在了我们刚才下的断点处,即
01138216 E8 B53E0100 call WiFiNoNo.0114C0D0 ; 此处是关键Call,注册码也是在这里计算完成。
在这里,我们按F7进入Call
1.4 我们的追码开始了漫长的过程,,,进到这个Call里面,我们单步F8往前走,直到遇见了如下代码。
这里有个cmp比较,然后一个je跳转,和一个jmp回跳,这里是比较假码是否和真码一样长度,如果不等于15,就回跳,
如果大家的假码是不等于15的,那么在cmp完成后,修改一下ZF标志位的值为1,让je跳转实现。
[Asm] 纯文本查看 复制代码 00CEC2D3 03F8 add edi,eax
00CEC2D5 13DA adc ebx,edx
00CEC2D7 3B7424 44 cmp esi,dword ptr ss:[esp+0x44] ; 此处应该是对假码的长度进行比较,
00CEC2DB 74 26 je short WiFiNoNo.00CEC303
00CEC2DD 8D8C24 C0000000 lea ecx,dword ptr ss:[esp+0xC0]
00CEC2E4 E8 07BC0600 call WiFiNoNo.00D57EF0
00CEC2E9 8D8C24 A4000000 lea ecx,dword ptr ss:[esp+0xA4]
00CEC2F0 E8 FBBB0600 call WiFiNoNo.00D57EF0
00CEC2F5 8D4C24 50 lea ecx,dword ptr ss:[esp+0x50]
00CEC2F9 E8 F2BB0600 call WiFiNoNo.00D57EF0
00CEC2FE ^ E9 A8FEFFFF jmp WiFiNoNo.00CEC1AB ; 当不满足的时候,jmp跳回上面。
00CEC303 8B5424 18 mov edx,dword ptr ss:[esp+0x18]
00CEC307 8B4424 14 mov eax,dword ptr ss:[esp+0x14]
00CEC30B 53 push ebx
00CEC30C 57 push edi
00CEC30D 52 push edx
00CEC30E 50 push eax
00CEC30F 68 8002E900 push WiFiNoNo.00E90280 ; %014I64d%06I64d
123
在上面的代码向下不远处,同样还有一处jnz的跳转,也不能让它成功回跳过去,继续修改ZF标志位,
00CEC394 E8 57890700 call WiFiNoNo.00D64CF0 ; 在这个Call里面,这个附近EDX生成一串数字,其中的后4位,感觉像有效用户数。
同时发现这个Call会让EDX生成一串数字,这串数字的后4位,就是真码的有效用户数。
[Asm] 纯文本查看 复制代码 00CEC371 83C4 1C add esp,0x1C
00CEC374 394424 44 cmp dword ptr ss:[esp+0x44],eax
00CEC378 ^ 0F85 5FFFFFFF jnz WiFiNoNo.00CEC2DD ; 此处的jnz回跳,同样不能让它跳回去,修改ZF标志位为1
00CEC37E 8B4424 18 mov eax,dword ptr ss:[esp+0x18]
00CEC382 8B4C24 14 mov ecx,dword ptr ss:[esp+0x14]
00CEC386 50 push eax
00CEC387 51 push ecx
00CEC388 68 FCDCE800 push WiFiNoNo.00E8DCFC ; %014I64d
00CEC38D 8DB424 94000000 lea esi,dword ptr ss:[esp+0x94]
00CEC394 E8 57890700 call WiFiNoNo.00D64CF0 ; 在这个Call里面,会生成有效授权用户数
00CEC399 83C4 0C add esp,0xC
00CEC39C 50 push eax
00CEC39D 8D8C24 A8000000 lea ecx,dword ptr ss:[esp+0xA8]
00CEC3A4 C68424 0C010000>mov byte ptr ss:[esp+0x10C],0x4
1.5 经过上面2个回跳之后,继续F8,就离我们成功的地方不远了,先是发现机器码出现了。
机器码
1.6、在机器码出现后,真码就在其后出现了。
真码
相应的代码如下:
[Asm] 纯文本查看 复制代码 00CEC54E 8D8424 8C000000 lea eax,dword ptr ss:[esp+0x8C]
00CEC555 50 push eax
00CEC556 C68424 2C010000>mov byte ptr ss:[esp+0x12C],0x7
00CEC55E E8 CDE9FFFF call WiFiNoNo.00CEAF30 ; 这个call生成了机器码,在EAX中。
00CEC563 83C4 04 add esp,0x4
00CEC566 C68424 28010000>mov byte ptr ss:[esp+0x128],0x8
00CEC56E 8378 14 10 cmp dword ptr ds:[eax+0x14],0x10
00CEC572 72 02 jb short WiFiNoNo.00CEC576
00CEC574 8B00 mov eax,dword ptr ds:[eax]
00CEC576 8B4C24 48 mov ecx,dword ptr ss:[esp+0x48]
00CEC57A 8B11 mov edx,dword ptr ds:[ecx]
00CEC57C 52 push edx
00CEC57D 8B5424 48 mov edx,dword ptr ss:[esp+0x48]
00CEC581 8D8C24 00010000 lea ecx,dword ptr ss:[esp+0x100]
00CEC588 51 push ecx
00CEC589 C68424 30010000>mov byte ptr ss:[esp+0x130],0x9
00CEC591 8B12 mov edx,dword ptr ds:[edx]
00CEC593 8BC8 mov ecx,eax
00CEC595 E8 A6F5FFFF call WiFiNoNo.00CEBB40 ; 这个Call是生成注册码的子Call。不会分析算法,过去了。
00CEC59A 83C4 28 add esp,0x28
00CEC59D 8D4C24 6C lea ecx,dword ptr ss:[esp+0x6C]
00CEC5A1 C68424 08010000>mov byte ptr ss:[esp+0x108],0xB
00CEC5A9 E8 42B90600 call WiFiNoNo.00D57EF0
00CEC5AE 8B4424 3C mov eax,dword ptr ss:[esp+0x3C] ; 真假码都出现了。
00CEC5B2 50 push eax
00CEC5B3 8D8C24 8C000000 lea ecx,dword ptr ss:[esp+0x8C]
00CEC5BA E8 5186FAFF call WiFiNoNo.00C94C10
00CEC5BF 8BC8 mov ecx,eax
破解完成
这个是用假码123456789012345生成的真码,用户数是9424,7173个失败的。
至此,完成无线天的追码过程,难点就是找到关键CAll,并且中间有2个回跳过程要一定不要让它们回跳过去,发现这个问题,都是通过多次的失败才找到的。
再就是从进入到关键Call后,F8的代码太远了,一会接着去试一下,不同的假码生成的用户数量问题,有结果后再编辑本帖子。
---------------------刚才又试了几个假码,,
使用ABCD.....XYZ生成的真码,支持的用户数是11652个,失效用户数是4904.
[Asm] 纯文本查看 复制代码 堆栈 ss:[0018DFE0]=0018E110, (ASCII "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
eax=0018E080, (ASCII "QC6WLPTSTU39VVB")
adcd
[Asm] 纯文本查看 复制代码 堆栈地址=001CE06C, (ASCII "99999999999999")
ecx=0862E4B0, (ASCII "P82CFUF8999SPJ9B")
|