软件下载地址http://www.newhua.com/soft/61703.htm
谁说解密软件必须脱壳?原则上是这样的,但有时候peid查出来的可能不准确!所以脱不脱壳不能只看peid。查不出是什么语言写的,不说明就一定有壳。有没有壳要看看才知道的。不过就我这菜鸟水平,还不会脱壳。碰见软件就od一下,然后分析代码,看能否爆破。不过咱运气好啊,碰见一个软件peid查不出是什么语言写的(其实可能没有壳),不过咱照破不误!
用peid查了一下如图
不知道有没有壳,
也没有找oep,貌似很
不好爆破的呀!没关系,
先用od打开看看
程序自动断在了代码
004EA118处,也不符合
一般没有加壳软件的入口
特征啊,难道必须先脱壳?
咱菜鸟一个才不管他有没有
壳呢!下一路F8再说。
当运行到004EA0A8代码处弹出了主窗口!!!并且程序的所有功能按钮都可以用,说明这个call调用是弹出主窗口的,在此后紧接的一句下断点,关闭主窗口断了下来。这样的话就可以只关心这个call了。另外F8的过程中留意到004EA110处的跳转是向上跳的,经过不少的代码来到了弹主窗口的call处,猜想上面一系列的代码是做初始化用的,暂时不用管他。重新运行od ,转到004EA0A8处,设断,F9。然后F7跟进去。
F8来到此处call弹出了主
窗口,说明前面依旧是初始化的一些工作(在这之前可能首先通过读取注册文件或注册表的方式判断是否已经注册),先不管。再次运行,在此处设断点,F7进去。
发现注释里面有右图所示的东东,不知道是干什么的。
不过看英语意思应该是设置窗体的一些属性的,依旧F8.
00449310 |. E8 F5EDFFFF CALL Watershi.0044810A
来到上面一行弹出了窗口!没办法睡觉咱是菜鸟呢!重新运
行在此处设断,F7进去吧!
0044810A /$ 51 PUSH ECX
0044810B |. 53 PUSH EBX
0044810C |. 55 PUSH EBP
0044810D |. 33ED XOR EBP,EBP
0044810F |. 57 PUSH EDI
00448110 |. 45 INC EBP
00448111 |. 33DB XOR EBX,EBX
00448113 |. 8D7E 1C LEA EDI,DWORD PTR DS:[ESI+1C]
00448116 |> 895C24 0C /MOV DWORD PTR SS:[ESP+C],EBX
0044811A |. EB 24 |JMP SHORT Watershi.00448140
0044811C |> 53 |/PUSH EBX ; /RemoveMsg
0044811D |. 53 ||PUSH EBX ; |MsgFilterMax
0044811E |. 53 ||PUSH EBX ; |MsgFilterMin
0044811F |. 53 ||PUSH EBX ; |hWnd
00448120 |. 57 ||PUSH EDI ; |pMsg
00448121 |. FF15 3C445100 ||CALL DWORD PTR DS:[<&USER32.PeekMessag>; \PeekMessageW
00448127 |. 85C0 ||TEST EAX,EAX
00448129 |. 75 19 ||JNZ SHORT Watershi.00448144
0044812B |. FF7424 0C ||PUSH DWORD PTR SS:[ESP+C]
0044812F |. 8B06 ||MOV EAX,DWORD PTR DS:[ESI]
00448131 |. 8BCE ||MOV ECX,ESI
00448133 |. FF50 04 ||CALL DWORD PTR DS:[EAX+4]
00448136 |. FF4424 0C ||INC DWORD PTR SS:[ESP+C]
0044813A |. 85C0 ||TEST EAX,EAX
0044813C |. 75 02 ||JNZ SHORT Watershi.00448140
0044813E |. 33ED ||XOR EBP,EBP
00448140 |> 3BEB | CMP EBP,EBX
00448142 |.^ 75 D8 |\JNZ SHORT Watershi.0044811C
00448144 |> 53 |PUSH EBX ; /MsgFilterMax
00448145 |. 53 |PUSH EBX ; |MsgFilterMin
00448146 |. 53 |PUSH EBX ; |hWnd
00448147 |. 57 |PUSH EDI ; |pMsg
00448148 |. FF15 00445100 |CALL DWORD PTR DS:[<&USER32.GetMessageW>; \GetMessageW
0044814E |. 83F8 FF |CMP EAX,-1
00448151 |.^ 74 ED |JE SHORT Watershi.00448140
00448153 |. 3BC3 |CMP EAX,EBX
00448155 |. 74 39 |JE SHORT Watershi.00448190
00448157 |. 8B06 |MOV EAX,DWORD PTR DS:[ESI]
00448159 |. 57 |PUSH EDI
0044815A |. 8BCE |MOV ECX,ESI
0044815C |. FF10 |CALL DWORD PTR DS:[EAX]
0044815E |. 85C0 |TEST EAX,EAX ; (初始 cpu 选择)
00448160 |. 75 0E |JNZ SHORT Watershi.00448170
00448162 |. 57 |PUSH EDI ; /pMsg
00448163 |. FF15 28445100 |CALL DWORD PTR DS:[<&USER32.TranslateMe>; \TranslateMessage
00448169 |. 57 |PUSH EDI ; /pMsg
0044816A |. FF15 5C445100 |CALL DWORD PTR DS:[<&USER32.DispatchMes>; \DispatchMessageW
00448170 |> 8B46 20 |MOV EAX,DWORD PTR DS:[ESI+20]
00448173 |. 83E8 0F |SUB EAX,0F
00448176 |.^ 74 C8 |JE SHORT Watershi.00448140
00448178 |. 2D 91000000 |SUB EAX,91
0044817D |.^ 74 C1 |JE SHORT Watershi.00448140
0044817F |. 83E8 78 |SUB EAX,78
00448182 |.^ 74 BC |JE SHORT Watershi.00448140
00448184 |. 2D E8000000 |SUB EAX,0E8
00448189 |.^ 74 B5 |JE SHORT Watershi.00448140
0044818B |. 33ED |XOR EBP,EBP
0044818D |. 45 |INC EBP
0044818E |.^ EB 86 \JMP SHORT Watershi.00448116
00448190 |> 8B46 24 MOV EAX,DWORD PTR DS:[ESI+24]
00448193 |. 5F POP EDI
00448194 |. 5D POP EBP
00448195 |. 5B POP EBX
00448196 |. 59 POP ECX
00448197 \. C3 RETN
无奈上面代码很复杂按了好久F8都没有出主窗口,怎么办呢?不过别忘了OD是很强大的。查找字符串uincode注意到下面一段信息很值得关注,大概意思是说你超过了限制的使用次数。太好了这肯定是判断没有注册才会弹出的,再说前面测试的时候,不注册的情况下,没有注册限制,只是弹出个NAG罢了。好的,双击光标所在行,跟随进去注意那个text a l , al很可以下面紧接着一句如果为零则弹出注册提示信息
0044D716 |. 2145 FC AND DWORD PTR SS:[EBP-4],EAX
0044D719 |. E8 BEA3FDFF CALL Watershi.00427ADC ; 调用了算法call ?
0044D71E |. 84C0 TEST AL,AL
0044D720 |. 74 18 JE SHORT Watershi.0044D73A
0044D722 |. BE 20205200 MOV ESI,Watershi.00522020 ; you have reached the task limitation for the trial version. no further tasks can be added.
0044D727 |. 56 PUSH ESI ; /Arg1 => 00522020
0044D728 |. E8 CC750900 CALL Watershi.004E4CF9 ; \Watershi.004E4CF9
….
0044D73A |> \FF75 E8 PUSH DWORD PTR SS:[EBP-18]
0044D73D |. 8D45 B0 LEA EAX,DWORD PTR SS:[EBP-50]
0044D740 |. 68 D8205200 PUSH Watershi.005220D8 ; you are currently using %1!d! tasks out of your 30 task limit.
0044D745 |. 50 PUSH EAX
0044D746 |. E8 E7EFFBFF CALL Watershi.0040C732
……..
我们应该在紧接着上面的call设一个断点,跟进去。可是却没有断在这个函数,怎么回事呢?在测试的时候,我发现单击菜单栏help下面的about时候会出现注册的对话框。那就单击一下吧。果然程序在此处断了下来。好吧那就分析一下代码吧。大概意思是,如果al等于零则跳到下面弹出对话框说你用了多少次,请注册,之类的信息。可是程序怎么知道你用了多少次呢?注意弹出对话框之前肯定要把次数压进堆栈,那就找一下吧。Call之前一共有三个push,第二个不用管它了,第一个估计就是了,因为他是一个局部变量。那就看一下吧。
太好了,果不出所料的确是这样的。注意数字‘63’,因为我已经运行过多次了,所以大于限制次数30.我是强制让程序跳到这个地方的(这点就不解释了)。说明我的猜测是正确的,使用次数保存在[EBP-18]所指的内存的。转到EBP-18处可以看到堆栈中保存的正是十进制63所对应的十六进制!
好了总结一下CALL Watershi.00427ADC ;
大致功能是,检测使用次数,如果没有超出使用限制30则al置零;超出使用次数则al置为一(反正不是零)。这样就可以跟进这个call了 ,跟进去的时候要特别注意改变eax的地方!
另外:也可以通过关注ebp-18这个堆栈处来破解,因为只有当软件没有注册的时候才会读出使用次数给与提示,那么在这之前一定能够找到读取使用次数的地方,在读取使用次数之前肯定要先判断是否注册,这样就可以破解了。(当然刚开始破解的时候并没有注意到这个地方)
好了就跟进去吧
代码并不多注意红线那
个地方上面有个call,返
回值在 al如果按了不是零
那么跳转al清零,结束这个函数过程。那么427ADD这个call估计是判断是否注册的(当然只是猜想,也可以验证一下),也可能有其他功能。没有注册则继续call,注意cmp EAX,1E 意思是比较EAX与30的大小,30!限制使用的次数!小于30则al清零,否则al置1!这样的话这个427AE6 call返回的就是使用次数!这样的话,就可以修改上面的cmp这个语句了,把1E改成想要的使用次数,就行了。不过这样不太好,程序还是会提示没有注册的,因为改的毕竟是使用次数,并没有更改判断是否注册的语句。
ECX=00000000 本地调用来自 0044D719, 00487DCB
跟进这个算法时候注意到中间一个窗口有这样一个提示,有两个地方调用这个函数,第一个就是我们刚才进来的地方,那另外一个呢?转到那个地方看看吧。
.
注意红色语句下面一行是调用427ADC这个函数的,在紧接的上面下个断点重新运行一下,一路F9发现并没有在这个断点断下来!怎么回事呢?还好破解之前我测试了一下
软件。当超过使用次数的时候(刚才可以看出使用次数是63),会出现下面对话框!
和刚才的对话框一样!好吧ctrl+enter 一下吧。果不其然在48D7C9出断了下来 。一路F9果然弹出了上面这个对话框!注意在调用算法计算使用次数或判断有没有注册之前有一个比较语句,JNZ这条语句成立的话,就不弹出对话框,跳到 下面。改一下z标志位,F9一下看会出现什么情况。没有弹出对话框!!!但是我将其更改之后改为JZ,保存文件。重新运行,却不行!我也不知道是为什么,不管他了,只好另选其他方法了。其实“踏破铁鞋无觅处”,看吧和菜单栏“about”一样,紧接着下面有两句 text a l , al JE SHORT Watershi.00487DF1
居然也是检查al的值!al的值是表征有没有达到限制次数的啊。更改一下程序的流程不知道会出现什么情况。
运行到此处时候,发现Z标志位为零,程序不跳转,好了那就让他跳吧。双击右边寄存器下面的Z后面的0,看,变成1吧而且灰色的线也变成红色的了!按下F9,注册对话框居然没有弹出来!!!光标移动到此行,右键,汇编更改为nop,或者是jne都行。
然后右键-复制到可执行程序-所有修改-全部复制,在弹出来的窗口中右键-保存文件即可。关闭od,打开更改后的程序是不是可以了!!!好了,到此为止就算爆破一部分了吧。
[课程]Android-CTF解题方法汇总!