zoukankan      html  css  js  c++  java
  • 破解入门之注册码

    破解入门之注册码

    这是本系列文章的第三篇,如果讲述如何追踪出软件真正的注册码,从而达到破解的目的。
    下面正式开始:
    破解过程】
    追出软件注册码的原理

    一般的软件都是用对比真假码的方法来检查软件的注册码是否正确,而检查前软件的真假注册码要有一个存放的位置,
    这个位置就可能是堆栈(当然也可能是寄存器,不过这里以堆栈为例),所以,我们可以通过找对比注册码的位置,然后下
    断点,再单步跟踪,查看堆栈,来追出软件的真正注册码.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    这个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跳转"
    我们尽量把文章做到通俗、易懂,希望所有人都能看得懂,做真正的入门教程,希望能对大家有帮助!
  • 相关阅读:
    [学习笔记] Symfony2学习笔记之数据库操作 [转]
    [学习笔记] Twig 的 tags学习 [转]
    [学习笔记] 设计模式之状态机模式 [转]
    【转】Lombok介绍、使用方法和总结
    RabbitMQ
    百度云下载不限速方法+软件
    json数据的key的读取和替换
    spring boot配置mybatis和事务管理
    windows强大的快捷键
    rtsp向rtmp推流
  • 原文地址:https://www.cnblogs.com/wzg0319/p/3762280.html
Copyright © 2011-2022 走看看