破解入门之注册码

这是本系列文章的第三篇,如果讲述如何追踪出软件真正的注册码,从而达到破解的目的。

下面正式开始:

破解过程】
追出软件注册码的原理

一般的软件都是用对比真假码的方法来检查软件的注册码是否正确,而检查前软件的真假注册码要有一个存放的位置,
这个位置就可能是堆栈(当然也可能是寄存器,不过这里以堆栈为例),所以,我们可以通过找对比注册码的位置,然后下
断点,再单步跟踪,查看堆栈,来追出软件的真正注册码.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
这个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跳转"

我们尽量把文章做到通俗、易懂,希望所有人都能看得懂,做真正的入门教程,希望能对大家有帮助!

X

点击这里给我发消息
微信号:crackgou