破解入门之注册码
这是本系列文章的第三篇,如果讲述如何追踪出软件真正的注册码,从而达到破解的目的。 下面正式开始: 【破解过程】 追出软件注册码的原理 一般的软件都是用对比真假码的方法来检查软件的注册码是否正确,而检查前软件的真假注册码要有一个存放的位置, 这个位置就可能是堆栈(当然也可能是寄存器,不过这里以堆栈为例),所以,我们可以通过找对比注册码的位置,然后下 断点,再单步跟踪,查看堆栈,来追出软件的真正注册码. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 这个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跳转" 我们尽量把文章做到通俗、易懂,希望所有人都能看得懂,做真正的入门教程,希望能对大家有帮助! |