改造完美CCProxy 6.2

信息来源:古典辣M°的书房

CCProxy 6.2是个十分好用的代理软件,可是没有注册的版本只允许三个用户使用,所以我想办法将它破解了。这里破解不是我们的最终目的,程序启动后会在系统托盘上留下图标,我们还要去掉它,让它更好的在肉鸡上跑。

破解工具:
Ollydbg 1.10b(fly修改版)
W32Dasm v10.0 汉化增强版
PEiD V0.92
keymake1.73

初探
用PEiD V0.92查看一下目标是否加壳——此软件居然不加壳!运行CCProxy主程序,看看它是个啥模样,咋这么牛呢?来给个正脸,小样长得还挺不错,注册码错误会给出错误提示。

静态分析可利用信息
既然我们输错注册码程序会弹出对话框来,那我们就可以先利用它的这个错误信息去找程序比较部分。
用W32Dasm对目标文件进行静态分析。在工具栏中点“串式字符参考”,找一找程序给我们的错误信息,没有?很正常!这个软件比较牛了,才学了英语,我们在CCProxy主程序的“设置—>高级—>其它”中可以更改软件的提示内容。改过后再看看软件的错误提示(如图2所示),是不是在有和“串式字符参考”一样的错误信息了,如图3所示。双击错误字符串,我们会看到程序的汇编代码,如图4中,代码0040e33e为程序的关键跳,跳走了我们就失败,所以暴破只要把0040e33e一条代码NOP掉就可以了。用WinHex载入CCProxy主程序,NOP掉程序0040e33e处代码,重新运行软件注册,成功!但是重起软件后注册并没有生效,还是未注册版。可能是程序在起动时对注册码进行了效验。在程序的安装目录里我们可以找到一个CCProxy.ini文件,这就是程序的配置文件,我们的注册码就放在这里,一会我们动态分析时可能会用到。

再看代码上边有好几个CALL语句,可以推断上边的CALL语句为程序计算注册码部分。我们可以动态跟踪程序的注册码。OK!第二步我们找到两个破解软件的思路,继续!

动态跟踪注册码
用Ollydbg加载CCProxy主程序,等程序完全加载完后Ctrl+G到程序关键跳0040e33e。向上找到这段代码的开始,F2下断,运行后程序立刻断下,取消断点。先大概F8单步运行到0040e33e,程序通过测试eax寄存器决定的程序转向,我们在上边不远处可以找到程序最后一次对eax寄存器的赋值语句0040e333。如果eax不为零那么程序就不跳转,我们就注册成功。
现在在这段代码中仔细单步运行,程序主要是对注册名进行了MD5加密运算,由于程序比较复杂不是我等小辈可以看清的,所以不打算找程序的加密算法了 (我可不是打退堂鼓,注册码咱还是要的)。
程序动行到0040e333时,也就是最后一次对注册码进行赋值的语句。在Ollydbg的信息框里我们可以看到ds:[004a6cbc]=00000000(要赋给eax的源数据)、eax=00000001(eax寄存器源内容)。当eax不为零时程序注册成功!右键单击信息框里的ds:[004a6cbc]=00000000一段代码,在弹出的快捷菜单中点“在转存中跟随地址”。在左下角的数据框中我们往下拖动可以看到有一大串的数字,不用说了,一定是注册码。关闭调试器,运行CCProxy主程序,输入找到的数据,注册成功!
破解的最后作一个注册机,善始善终嘛!打开keymake按图中进行设置,如图6所示。

完善CCProxy
这个软件真是好用,不跑在肉鸡上多可惜呀,想想各种代理都有的感觉,爽!费话少说,改善软件。
程序主要是在系统托盘上加的图标让我们的肉鸡不可以接受,那我们就去掉它的这个图标不就行了!开始我想的是用“资源黑客”把CCProxy的图标资源直接删了,后来想起以前改别的软件的时候试过,好象系统托盘会有一个空白的图标,虽然看不到程序的图标,那也太刺眼了吧,管理员的眼不是500度大近视!程序向系统托盘加入图标一定要调用SHELL32.Shell_NotifyIconA函数,先看看函数API原形:
Declare Function Shell_NotifyIcon Lib “shell32.dll” Alias “Shell_NotifyIconA” (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Const NIF_ICON = &H2
Const NIF_TIP = &H4
Const NIM_ADD = &H0 //这个就是向托盘加入图标的参数
Const NIF_MESSAGE = &H1
Const NIM_MODIFY = &H1
Const NIM_DELETE = &H2 //这个就是从托盘中删除图标的参数
Ollydbg重新载入CCProxy主程序,“搜索->全部交互调用”,可以看到程序有5次调用SHELL32.Shell_NotifyIconA函数。从编程的角度来讲,一般的调用SHELL32.Shell_NotifyIconA函数,主要就是向系统托盘加入图标和从系统托盘删去图标,但你可以观察一下程度在系统托盘上的图标,它是一个动态的,编过程序的人都知道一般作这种动态的图标最简单的方法就是把两个图标来回的切换。了解了这一点,我们可以大胆的推断程序的第一次和最后一次调用SHELL32.Shell_NotifyIconA函数分别为系统初始化加载图标和程序结束删除图标。
程序第一次调用:
0040C703 6A 00 push 0
0040C705 . C1E9 02 shr ecx,2
0040C708 . F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]
0040C70A . 8BC8 mov ecx,eax
0040C70C . 83E1 03 and ecx,3
0040C70F . F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
0040C711 . FF15 98434600 call dword ptr ds:[<&SHELL32.Shell_NotifyIconA>] ; SHELL32.Shell_NotifyIconA

程序第五次调用:
0042F898 . 6A 02 push 2
0042F89A . C74424 20 0A0000>mov dword ptr ss:[esp+20],0A
0042F8A2 . C74424 24 010000>mov dword ptr ss:[esp+24],1
0042F8AA . 894C24 28 mov dword ptr ss:[esp+28],ecx
0042F8AE . FF15 98434600 call dword ptr ds:[<&SHELL32.Shell_NotifyIconA>] ; SHELL32.Shell_NotifyIconA
0042F8B4 . 6A 00 push 0 ; /ExitCode = 0
0042F8B6 . FF15 CC444600 call dword ptr ds:[<&USER32.PostQuitMessage>] ; \PostQuitMessage
0042F8BC . EB 71 jmp short 复件_CCP.0042F92F
两次的调用代码对比一下不难发觉,程序参数为push 0时,SHELL32.Shell_NotifyIconA函数是加载图标;程序参数为push 2时SHELL32.Shell_NotifyIconA函数是删除图标。由于我们不是来讲编程的,所以具体为什么push 0/1会导致函数加载、删除图标我就不说了,免得浪费咱们X档案的版面。好了思路已经很清楚了,我们只要把除最后一次调用结束程序以外的四次调用的参数push 0全部改为push 2就可以了!改完后F9运行程序,在系统托盘没有出现图标(图9),改善成功。在肉鸡上使用时可以修改程序的配置文件CCProxy.ini:
HotKey=CTRL+ALT+C(程序隐藏后自动弹出的快捷键,可以自己调整!)
EnableHotKey=1 (程序是否起用自动弹出快捷键,默认为0)

作者: sense
来 源: 《黑客防线