用作例子的软件是 HyperSnap 7 专业版
在未注册时,一打开会提示注册,猜测这是从注册表中读取了注册信息,所以可以对注册表操作函数下断点,从而找到验证的关键代码并进行分析修改达到破解的目的。
一、
1、来到软件主程序,右键——查找——所有模块间调用
根据前面的经验,知道注册表函数都以Reg开头,所以可以按键盘上的r e g键,这会自动跳到以Reg开头的函数那里。
我们要寻找的是打开注册表的函数,找到后右键,对每个调用下断点。
2、重新载入程序并运行,断下来后观察堆栈窗口中是否会出现和进程名HyperSnap相似的字符串。
出现后就单步跟踪,还可能得跳出call后继续跟踪。主要是看读取注册信息的代码所在的call返回值是否是0或者1。
如果出call后发现返回值不是0也不是1,证明这个call就不是关键call,要么继续出call;要么继续F9,找下一个断下来的。这是最要紧最难的一步了,也就是在这一步找到了关键call。
在第10次断下来后,出call一次还得再出call一次,才找到了关键call。
在这一过程中,看到可疑的关键处,可以修改一下试试,看能够达到破解目的。
004A0B5E |. E8 2DBA0800 call 0052C590 ; 这个就是关键call了。第2次出call会来到这里
004A0B63 |. A3 F0B07200 mov dword ptr ds:[0x72B0F0],eax ; 关键处,eax的值影响了验证是否通过
004A0B68 |. E8 53CD0900 call 0053D8C0
3、原本想直接修改关键call的返回值,但是OD提示重定位的问题
那么只好对关键call进行替换了
004A0B5E B8 01000000 mov eax,0x1 ; 把关键call替换了
004A0B63 |. A3 F0B07200 mov dword ptr ds:[0x72B0F0],eax ; 关键处,eax的值影响了验证是否通过
004A0B68 |. E8 53CD0900 call 0053D8C0