您的位置:首页 > 其它

由破解一款软件所进行的思路总结

2016-06-24 16:53 176 查看
其实上学期就在学习破解,今天在破解的时候有许多的想法,来和大家分享一下,这是一款重启验证的程序,我用两种方法追注册码和爆破来实现,希望能给大家带来一些思路

1.首先PEID查壳,发现为UPX的壳,使用ESP定律就可解决(不插图了,太麻烦了)
2.运行,随便输入一个注册名、注册码,弹出对话框,退出后多了一个.ini文件,是重启验证
3.OD打开程序,下断点命令:bp GetPrivateProfileStringA  ,SHIFT+F9运行。断下了。F8单步走,到
0040D6B8    33D2            xor edx,edx
0040D6BA    8955 F8         mov dword ptr ss:[ebp-0x8],edx
0040D6BD    8B4D F8         mov ecx,dword ptr ss:[ebp-0x8]
0040D6C0    33C0            xor eax,eax
0040D6C2    8A840D 90F7FFFF mov al,byte ptr ss:[ebp+ecx-0x870]
0040D6C9    50              push eax
0040D6CA    68 6C404900     push 111.0049406C                        ; ASCII "%02x"
0040D6CF    8D95 A0F7FFFF   lea edx,dword ptr ss:[ebp-0x860]
0040D6D5    52              push edx
0040D6D6    E8 7D710700     call 111.00484858
0040D6DB    83C4 0C         add esp,0xC
0040D6DE    8D8D A0F7FFFF   lea ecx,dword ptr ss:[ebp-0x860]
0040D6E4    51              push ecx
0040D6E5    8D85 F8FBFFFF   lea eax,dword ptr ss:[ebp-0x408]
0040D6EB    50              push eax
0040D6EC    E8 5B560700     call 111.00482D4C
0040D6F1    83C4 08         add esp,0x8
0040D6F4    FF45 F8         inc dword ptr ss:[ebp-0x8]
0040D6F7    837D F8 10      cmp dword ptr ss:[ebp-0x8],0x10
0040D6FB  ^ 7C C0           jl short 111.0040D6BD                         //MD5算法
0040D6FD    8D95 F8FEFFFF   lea edx,dword ptr ss:[ebp-0x108]             //这里寄存器窗口出现了注册码
0040D703    52              push edx
0040D704    68 D4E04900     push 111.0049E0D4
0040D709    E8 C6560700     call 111.00482DD4
0040D70E    83C4 08         add esp,0x8
0040D711    8D8D F8FDFFFF   lea ecx,dword ptr ss:[ebp-0x208]
0040D717    51              push ecx
0040D718    8D85 F8FBFFFF   lea eax,dword ptr ss:[ebp-0x408]
0040D71E    50              push eax
0040D71F    E8 4C580700     call 111.00482F70                    //关键的call,里面可能有关于比较的算法
0040D724    83C4 08         add esp,0x8
0040D727    85C0            test eax,eax
0040D729    75 07           jnz short 111.0040D732            //关键的跳转
发现如下信息:

堆栈地址=0012F81C, (ASCII "8106e570cd0e165e712db3291c595da7")这就是注册码

eax=0049E0D4 (111.0049E0D4), ASCII "gylwwz"

用爆破的方法来处理

用这种方法来处理是通常都是查找字符串,我给大家推荐一个新的方法,就是用DarkDe这款软件来尝试一下,很方便,同时,这种方法对Delphi也同样有用



我们可以清晰的知道注册按钮选项的位置,关于按钮事件的具体方法,我在我的前一篇已经具体的写过,这里就不在复述。我们可以发现按钮的内存地址410D9C;输入假码,断在此处,F8单步

00410EB7    68 2F574900     push 111.0049572F                        ; Key
00410EBC    68 22574900     push 111.00495722                        ; Registration
00410EC1    E8 ECBF0700     call <jmp.&kernel32.WritePrivateProfileS>
00410EC6    E8 FDC6FFFF     call 111.0040D5C8           //F7进入
00410ECB    85C0            test eax,eax               //进行两数的比较
00410ECD    0F84 48010000   je 111.0041101B            //相同则不跳转,不相同则跳到失败处
在这里我们也发现了和上面相同MD5算法,同时我们也追出了它的注册码,但是我们要用爆破(另一种方法)
0040D730   /EB 14           jmp short 111.0040D746
0040D732   |68 71404900     push 111.00494071                        ; Evaluation Version
0040D737   |68 D4E04900     push 111.0049E0D4                        ; ASCII "gylwwz"
0040D73C   |E8 93560700     call 111.00482DD4                         //F7进入
0040D741   |83C4 08         add esp,0x8
0040D744   |33C0            xor eax,eax
0040D746   \8BE5            mov esp,ebp
已经读取了我们的注册名,进去我我们本以为会进行注册码的计算,但没有,出来后我们反倒有新的发现,对eax进行异或清零,我们可以将xor改为or,或者将寄存器窗口的eax设置为1,保存文件
0040D744   |.  33C0          xor eax,eax  //完美爆破地址or eax,eax
0040D746   |>  8BE5          mov esp,ebp


3.我还发现这款软件是BC++写的,这种语言的特性和delphi很像,我认为可以使用下注册表断点bp RegOpenKeyExA,但是我没有找到,通过CMD窗口运行regedit查找也没找到,不过这也是一种思路,在以后的破解中也会经常用到。

我就可以总结

重启验证类软件大致的验证过程。

1、运行软件输入注册信息,点注册后。一般软件会提示你重新运行软件,以便验证注册信息的正确性;也有的只在你输入正确的注册信息时才有这个提示,不然会告诉你输入的注册信息有问题(此软件就属这类)

2、要破解这种软件,首先是判断一下她把注册信息存在哪里(因为她重启验证时要用)。大致有两种存放方式,第一种是放在注册表里;第二种是放在文件里。(我们可以在输入注册信息,点击确定前,利用监视类软件来查看一下,如FileMon和RegShot等)

3、知道她的注册信息的存放地点后,就可以选则相应的API断点,来调试了

我总结了一些常用的API,希望对大家有帮助

INI初始化文件相关

bp GetPrivateProfileStringA  (这个最常用)

bp GetPrivateProfileInt

bp WritePrivateProfileString

bp WritePrivateProfileInt

还有些文件是.bat和注册表项或者.ini相关进行注册验证,我们就可以用到以下的API

访问注册表类常用API

bp RegOpenKeyA  打开一个现有的注册表项  (重要)

bp RegOpenKeyExA  打开一个现有的注册表项 (重要)

bp RegCreateKeyA 在指定的项下创建或打开一个项

bp RegCreateKeyExA 在指定项下创建新项的更复杂的方式

bp RegDeleteKeyA 删除现有项下方一个指定的子项

bp RegDeleteValueA 删除指定项下方的一个值

bp RegQueryValueA 获取一个项的设置值

bp RegQueryValueExA 获取一个项的设置值

bp RegSetValueA 设置指定项或子项的值  

bp RegSetValueExA 设置指定项的值

bp RegCloseKey 关闭系统注册表中的一个项

访问文件类常用API

bp CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 (重要)

bp OpenFile 这个函数能执行大量不同的文件操作
bp ReadFile 从文件中读出数据 

bp ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调

那我们可以对我们的刚才的流程进行一下总结,也是大部分的软件破解的基本思路,只不过不同的语言编写的程序在细节上有所不同

1.PEID查壳脱壳(不脱壳是不是可以,以我的经验而言,是可以的,只不过脱壳后的程序会更清晰,如果为了破解单纯的学习脱壳,得不偿失,不建议)

2.输入相关的假码,得到相关的信息,这些信息可以帮助我们找到突破口

3.OD或者IDA载入,进行调试,分析关键跳,关键call

4.保存文件

5.测试是否成功,否者返回第3步

更深层次就会写注册机,或者算法分析,这都是后话了,如有更好的想法,欢迎交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: