-
-
[分享]破解非硬编码注册码演练
-
发表于:
2014-9-20 14:41
5002
-
破解非硬编码注册码演练---------很简单,大牛门不要喷哟!
一、被破解程序是使用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窗口中通过查询输入的错误注册码找到对应的地址
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)