diff --git a/2019/03/28/逆向工程实验/index.html b/2019/03/28/逆向工程实验/index.html index ad232479..3dc6faed 100644 --- a/2019/03/28/逆向工程实验/index.html +++ b/2019/03/28/逆向工程实验/index.html @@ -90,7 +90,7 @@ - + @@ -411,7 +411,7 @@ - 932 字 + 929 字 @@ -509,12 +509,12 @@
  • 用户名至少要5个字节
  • 输入错误验证码时输出:“Bad Boy!”
  • -

    爆破

    1. 查找显示注册结果相关代码

    当输入错误验证码时,程序会输出“Bad Boy”,因此我们将程序拖入IDA,以流程图显示函数内部的跳转。查找“Bad Boy”字符串,我们可以定位到显示注册结果的相关代码:

    -

    2. 查找注册码验证相关代码

    用鼠标选中程序分支点,按空格切换回汇编指令界面

    -

    可以看到,这条指令位于PE文件的.text节,并且IDA已经自动将地址转换为运行时的内存地址VA:

    1
    2
    3
    4
    5
    6
    7

    ### 3. 修改程序跳转

    - 现在关闭IDA,换用OllyDbg进行动态调试来看看程序时如何分支跳转的```Ctrl+G``` 直接跳到由IDA得到的VA:```004010F9```处查看那条引起程序分支的关键指令
    - 选中这条指令,按F2设置断点,再按F9运行程序,这时候控制权会回到程序,OllyDbg暂时挂起。到程序提示输入名字和序列号,随意输入(名字大于五个字节),点击ok后,OllyDbg会重新中断程序,收回控制权,如图:
    ![](https://res.cloudinary.com/dozyfkbg3/image/upload/v1553775053/%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3/%E6%8D%95%E8%8E%B74.png)
    - 验证函数的返回值存于EAX寄存器中,if语句通过以下两条指令执行

    -

    cmp eax,ecx
    jnz xxxxxxx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    - 也就是说,当序列号输入错误时,EAX中的值为0,跳转将被执行。
    如果我们把jnz这条指令修改为jz,那么整个程序的逻辑就会反过来。
    双击jnz这条指令,将其改为jz,单击"汇编"将其写入内存
    ![](https://res.cloudinary.com/dozyfkbg3/image/upload/v1553775817/%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3/%E6%8D%95%E8%8E%B75.png)
    可以看到此时程序执行了相反的路径

    - 上面只是在内存中修改程序,我们还需要在二进制文件中也修改相应的字节,这里考察VA与文件地址之间的关系
    - 用LordPE打开.exe文件,查看PE文件的节信息
    ![](https://res.cloudinary.com/dozyfkbg3/image/upload/v1553776239/%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3/%E6%8D%95%E8%8E%B76.png)
    根据VA与文件地址的换算公式:

    +

    爆破

    查找显示注册结果相关代码

    当输入错误验证码时,程序会输出“Bad Boy”,因此我们将程序拖入IDA,以流程图显示函数内部的跳转。查找“Bad Boy”字符串,我们可以定位到显示注册结果的相关代码:

    +

    查找注册码验证相关代码

    用鼠标选中程序分支点,按空格切换回汇编指令界面

    +

    可以看到,这条指令位于PE文件的.text节,并且IDA已经自动将地址转换为运行时的内存地址VA:

    1
    2
    3
    4
    5
    6
    7

    ### 修改程序跳转

    - 现在关闭IDA,换用OllyDbg进行动态调试来看看程序时如何分支跳转的```Ctrl+G``` 直接跳到由IDA得到的VA:```004010F9```处查看那条引起程序分支的关键指令
    - 选中这条指令,按F2设置断点,再按F9运行程序,这时候控制权会回到程序,OllyDbg暂时挂起。到程序提示输入名字和序列号,随意输入(名字大于五个字节),点击ok后,OllyDbg会重新中断程序,收回控制权,如图:
    ![](https://res.cloudinary.com/dozyfkbg3/image/upload/v1553775053/%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3/%E6%8D%95%E8%8E%B74.png)
    - 验证函数的返回值存于EAX寄存器中,if语句通过以下两条指令执行

    +

    cmp eax,ecx
    jnz xxxxxxx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    - 也就是说,当序列号输入错误时,EAX中的值为0,跳转将被执行。
    如果我们把jnz这条指令修改为jz,那么整个程序的逻辑就会反过来。
    双击jnz这条指令,将其改为jz,单击"汇编"将其写入内存
    ![](https://res.cloudinary.com/dozyfkbg3/image/upload/v1553775817/%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3/%E6%8D%95%E8%8E%B75.png)
    可以看到此时程序执行了相反的路径

    - 上面只是在内存中修改程序,我们还需要在二进制文件中也修改相应的字节,这里考察VA与文件地址之间的关系
    - 用LordPE打开.exe文件,查看PE文件的节信息
    ![](https://res.cloudinary.com/dozyfkbg3/image/upload/v1553776239/%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3/%E6%8D%95%E8%8E%B76.png)

    根据VA与文件地址的换算公式:

    文件偏移地址 = VA - Image Base - 节偏移
    = 0x004010F9 - 0x00400000 - 0
    = 0x10F9
    `
    也就是说,这条指令在PE文件中位于10F9字节处,使用010Editer打开crack.exe,将这一字节的75(JNZ)改为74(JZ),保存后重新执行,破解成功!

    -

    编写注册机

    1. 查找显示注册结果相关代码

    2. 查找注册码验证相关代码

    3. 根据注册码验证代码编写注册机

    +

    编写注册机

    1. 查找显示注册结果相关代码

    2. 查找注册码验证相关代码

    3. 根据注册码验证代码编写注册机

    @@ -750,7 +750,7 @@ -
    +
    diff --git a/index.html b/index.html index 6f11fdaf..93cc7eb8 100644 --- a/index.html +++ b/index.html @@ -395,7 +395,7 @@ - 932 字 + 929 字 diff --git a/search.xml b/search.xml index abd8a577..b6e6a7c4 100644 --- a/search.xml +++ b/search.xml @@ -3,7 +3,7 @@ <![CDATA[逆向工程实验]]> %2F2019%2F03%2F28%2F%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B%E5%AE%9E%E9%AA%8C%2F - + -二进制 diff --git a/sitemap.xml b/sitemap.xml index a26c3f6e..546659e3 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -4,7 +4,7 @@ https://cool-y.github.io/2019/03/28/%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B%E5%AE%9E%E9%AA%8C/ - 2019-03-28T13:01:16.144Z + 2019-03-28T13:02:56.104Z