破解入门之注册码
这是本系列文章的第三篇,如果讲述如何追踪出软件真正的注册码,从而达到破解的目的。
下面正式开始:
【破解过程】
追出软件注册码的原理
一般的软件都是用对比真假码的方法来检查软件的注册码是否正确,而检查前软件的真假注册码要有一个存放的位置,
这个位置就可能是堆栈(当然也可能是寄存器,不过这里以堆栈为例),所以,我们可以通过找对比注册码的位置,然后下
断点,再单步跟踪,查看堆栈,来追出软件的真正注册码.
”””””””””””””””””””””””””””””””””’
这个crackme也可以爆破—————————————————————————————-
载入unabexcm5.exe,运行这个crackme,单击check,查看错误的提示信息”The serial you entered is not correct!”(不带 |
引号),然后在反汇编的代码上右击,搜索->字符参考.找到这个错误提示信息,双击,来到这里—————————-|——–
然后向上找,找到这里下断点——– | |
004010AF |> /8305 5C224000 01 | /add dword ptr ds:[40225C],1 | |
004010B6 |. |8305 5D224000 01 | |add dword ptr ds:[40225D],1 | |
004010BD |. |8305 5E224000 01 | |add dword ptr ds:[40225E],1 | |
004010C4 |. |8305 5F224000 01 | |add dword ptr ds:[40225F],1 | |
004010CB |. |FECA | |dec dl | |
004010CD |.^\75 E0 在这里下断->\jnz short unabexcm.004010AF <—-之所以在这里下断是因为注册码的判断一 | |
004010CF |. 68 FD234000 push unabexcm.004023FD 般都在错误提示的前面把正确的 | |
004010D4 |. 68 00204000 push unabexcm.00402000 注册码和不正确的注册码分别压栈 | |
004010D9 |. E8 63000000 call <jmp.&KERNEL32.lstrcatA> 而确切的压栈地点第一次破解时并不是 | |
004010DE |. 68 5C224000 push unabexcm.0040225C 很清楚所以在这里下断(只要是在对比注册 | |
004010E3 |. 68 00204000 push unabexcm.00402000 码前他地方也是可以,大家可以试一试) | |
004010E8 |. E8 54000000 call <jmp.&KERNEL32.lstrcatA> ; \lstrcatA | |
004010ED |. 68 24234000 push unabexcm.00402324 ; /String2 = “” | |
004010F2 |. 68 00204000 push unabexcm.00402000 ; |String1 = “” | |
004010F7 |. E8 51000000 call <jmp.&KERNEL32.lstrcmpiA> ; \lstrcmpiA | |
004010FC |. 83F8 00 cmp eax,0 | |
004010FF |. 74 16 错误的话je short unabexcm.00401117就继续执行<-把这里的je改成jne即可<————— |
00401101 |. 6A 00 | push 0 ; /Style = MB_OK|MB_APPLMODAL |
00401103 |. 68 34244000 | push unabexcm.00402434 ; |Title = “Error!” |
00401108 |. 68 3B244000 | push unabexcm.0040243B ; |Text = “The serial you entered is not correct!”
0040110D |. FF75 08 | push dword ptr ss:[ebp+8] ; |hOwner
00401110 |. E8 56000000 | call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401115 |. EB 16 | jmp short unabexcm.0040112D
00401117 |> 6A 00 正确的话push 0跳到这里 ; /Style = MB_OK|MB_APPLMODAL
00401119 |. 68 06244000 push unabexcm.00402406 ; |Title = “Well Done!”
0040111E |. 68 11244000 push unabexcm.00402411 ; |Text = “Yep, you entered a correct serial!”
00401123 |. FF75 08 push dword ptr ss:[ebp+8] ; |hOwner
00401126 |. E8 40000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
然后继续执行程序,点击check后断下,这里是一个循环,按F8单步执行开始会跳到上面,然后按F8单步往下执行就不会循环了
,要注意看右下角的堆栈窗口
按一下,看一眼,直到来到这里—–
004010ED |. 68 24234000 | push unabexcm.00402324
004010F2 |. 68 00204000 | push unabexcm.00402000
004010F7 |. E8 51000000 这里->call <jmp.&KERNEL32.lstrcmpiA>
004010FC |. 83F8 00 cmp eax,0
然后你看堆栈窗口会有两个字符串
0012FB00 00402000 |String1 = “L2C-57816784-ABEX”<-
0012FB04 00402324 \String2 = “Enter your serial” |<-
第一个是正确的注册码———————————– |
第二个就是你输入的注册码.——————————–
把第一个字符串”L2C-57816784-ABEX”(不带引号)复制到crackme里,然后点击check,是不是注册成功了?^_^
———————————————————————————————-
【破解心得】
破解其实很简单,如果是追注册码,你知道了在那里下断点,就成功了一半.
写出程序的格式:
…….注册码算法 <—这里一般是注册码算法,也可能其他的一些无用的代码.
压栈 正确的注册码 <–|这两个代码的位置不是绝对的.有可能互相调换.
压栈 输入的注册码 <—-|
…….其他代码
if 正确的注册码=输入的注册码 then <—在比较注册码的时候,你就会在堆栈窗口看见真正的注册码和假码.
注册成功
else
注册失败
end if
这里再给各位介绍一下速记跳转的方法,Jc,Jz,Je,Js,Jo,Jp这几个跳转,只要在两个字母之间加上n,
他的跳转条件就和原来相反,比如”jz 为0跳转”中间加上n”jnz 不为0跳转”
我们尽量把文章做到通俗、易懂,希望所有人都能看得懂,做真正的入门教程,希望能对大家有帮助!

