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

来源:互联网 发布:耳机声道测试软件 编辑:程序博客网 时间:2024/04/29 00:34

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

1.首先PEID查壳,发现为UPX的壳,使用ESP定律就可解决(不插图了,太麻烦了)2.运行,随便输入一个注册名、注册码,弹出对话框,退出后多了一个.ini文件,是重启验证3.OD打开程序,下断点命令:bp GetPrivateProfileStringA  ,SHIFT+F9运行。断下了。F8单步走,到

0040D6B8    33D2            xor edx,edx0040D6BA    8955 F8         mov dword ptr ss:[ebp-0x8],edx0040D6BD    8B4D F8         mov ecx,dword ptr ss:[ebp-0x8]0040D6C0    33C0            xor eax,eax0040D6C2    8A840D 90F7FFFF mov al,byte ptr ss:[ebp+ecx-0x870]0040D6C9    50              push eax0040D6CA    68 6C404900     push 111.0049406C                        ; ASCII "%02x"0040D6CF    8D95 A0F7FFFF   lea edx,dword ptr ss:[ebp-0x860]0040D6D5    52              push edx0040D6D6    E8 7D710700     call 111.004848580040D6DB    83C4 0C         add esp,0xC0040D6DE    8D8D A0F7FFFF   lea ecx,dword ptr ss:[ebp-0x860]0040D6E4    51              push ecx0040D6E5    8D85 F8FBFFFF   lea eax,dword ptr ss:[ebp-0x408]0040D6EB    50              push eax0040D6EC    E8 5B560700     call 111.00482D4C0040D6F1    83C4 08         add esp,0x80040D6F4    FF45 F8         inc dword ptr ss:[ebp-0x8]0040D6F7    837D F8 10      cmp dword ptr ss:[ebp-0x8],0x100040D6FB  ^ 7C C0           jl short 111.0040D6BD                         //MD5算法0040D6FD    8D95 F8FEFFFF   lea edx,dword ptr ss:[ebp-0x108]             //这里寄存器窗口出现了注册码0040D703    52              push edx0040D704    68 D4E04900     push 111.0049E0D40040D709    E8 C6560700     call 111.00482DD40040D70E    83C4 08         add esp,0x80040D711    8D8D F8FDFFFF   lea ecx,dword ptr ss:[ebp-0x208]0040D717    51              push ecx0040D718    8D85 F8FBFFFF   lea eax,dword ptr ss:[ebp-0x408]0040D71E    50              push eax0040D71F    E8 4C580700     call 111.00482F70                    //关键的call,里面可能有关于比较的算法0040D724    83C4 08         add esp,0x80040D727    85C0            test eax,eax0040D729    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                        ; Key00410EBC    68 22574900     push 111.00495722                        ; Registration00410EC1    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.0040D7460040D732   |68 71404900     push 111.00494071                        ; Evaluation Version0040D737   |68 D4E04900     push 111.0049E0D4                        ; ASCII "gylwwz"0040D73C   |E8 93560700     call 111.00482DD4                         //F7进入0040D741   |83C4 08         add esp,0x80040D744   |33C0            xor eax,eax0040D746   \8BE5            mov esp,ebp
已经读取了我们的注册名,进去我我们本以为会进行注册码的计算,但没有,出来后我们反倒有新的发现,对eax进行异或清零,我们可以将xor改为or,或者将寄存器窗口的eax设置为1,保存文件
0040D744   |.  33C0          xor eax,eax  //完美爆破地址or eax,eax0040D746   |>  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步

更深层次就会写注册机,或者算法分析,这都是后话了,如有更好的想法,欢迎交流。



0 0
原创粉丝点击