首页
社区
课程
招聘
[分享]破解非硬编码注册码演练
发表于: 2014-9-20 14:41 5001

[分享]破解非硬编码注册码演练

2014-9-20 14:41
5001
破解非硬编码注册码演练---------很简单,大牛门不要喷哟!

一、被破解程序是使用vc6.0写的,程序名称BP_id.exe

二、BP_id.exe注册码算法简要介绍

1、字符串数组bta中保存了原始密码,而dec 50可以理解为注册码的密钥
2、算法中使用按字节校验用户输入的注册码,利用bta[i]+50计算出正确字节之后与用户输入的k进行异或操作,再判断异或结果是否为0,非0则认为用户输入错误并退出注册码算法

三、下面看一下OD加载BP_id.exe后的反汇编窗口对应上述循环处的代码段(找到循环代码可以使用MessageBox返回地址来确认)


四、总结
此次破解的难点在于程序中未明确保存注册码明文,而是保存了另一串字符串通过他来计算出正确的注册码。程序的正确注册码是kccbjidkfi

BP_id.exe下载 BP_id.zip

总一下本帖http://bbs.pediy.com/showthread.php?t=192483和http://bbs.pediy.com/showthread.php?t=192211针对硬编码破解时用到的关键代码定位方法,

硬编码注册码的破解技巧总结
    利用输入的错误注册码找到与正确注册比较的关键代码
     (1)方法一、通过MessageBox来定位,如果比较后程序给用户的提示是使用MessageBox来告知用户注册码输入错误的,那么可以根据MessageBox的返回地址找到关键代码
     (2)方法二、如果程序中使用的是自定义的提示框来提示用户注册码输入的结果,此时要怎么确认关键代码?
        答案是,找到关键时机,什么样的关键时机呢?我们知道注册码的校验流程是从用户的输入开始,终止于告知用户输入注册码正确与否的提示框,那么比较注册码的关键代码必定出现在用户输入注册码之后、提示框出现之前,所以,我们可以以键盘转换函数GetWindowText或TranslateMessage为切入点,在他上面设置断点,等待用户输入完成后得到输入的错误注册码在内存中保存的地址A,之后在A上设置内存访问断点,之后F9运行程序等待程序访问地址A,从而找到关键代码

     注,如果程序入口不在401000(程序可能加壳了),那么在od加载程序时不要让od分析,等待程序运行起来后,在od的m窗口中找到401000代码区域并设置内存访问断点,之后等待程序在主模块中中断下来,这样再来查找程序主模块中的函数列表、字符串。

     在程序刚刚加载的时候不能这么做,因为那个时候我们查看当前模块使用的API的话是查看的壳所在模块使用的API函数

     方法二中,如果使用的是函数TranslateMessage来确认错误注册码在内存中的位置从而找到关键代码的话,需要在函数TranslateMessage设置断点时设置条件MSG=WM_LBUTTONDOWN,这样当在程序中输入错误的注册码后,通过点击鼠标左键来触发设置在TranslateMessage函数的断点,此时的注册码已经输入完,所以内存中已经保存了你刚刚输入的错误注册码,此后就可以在od的m窗口中通过查询输入的错误注册码找到对应的地址

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 43
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
新手练习,应该不错,比如我,谢谢
2014-9-21 11:13
0
游客
登录 | 注册 方可回帖
返回
//