zoukankan      html  css  js  c++  java
  • OD 实验(十四)

    内嵌补丁(inline patch):

    内嵌补丁指在程序文件中把补丁代码写入文件里面达到破解的目的

    如果修改某行语句会影响后面的语句,例如某语句占用 3 个字节,修改完变为 5 个字节,会覆盖后面的语句,这时就需要用到内嵌补丁

    程序:

    运行程序

    NAG 窗口显示只有 30 天的试用期,点击 Continue 就会来到主界面

    关闭程序

    接下来修改系统时间,把时间修改为 30 天之后

    打开程序

    NAG 窗口显示没有试用的天数剩余了

    Contine 已经不能按了

    再把时间改回来

    再启动程序,程序的 NAG 窗口还是显示没有天数剩余了

    用 PEiD 看一下

    这是用 VC 6.0 写的程序

    逆向:

    用 OD 打开程序

    运行一下程序

    点击 Enter Reg. Code 输入注册码,然后点击“Ok”

    此时的 OD 没有任何变化,还是在程序的起始处

    在 OD 界面按“Ctrl+N”

    键盘直接敲 killtimer,搜索 killtimer

    KillTimer 函数用于销毁指定计时器

    右键 -> 在每个参考上设置断点

    一共设置了 48 个断点

    重新在输入注册码处按 Ok

    程序停在了此处

    上面有两条信息,一个是“The registration code seems to...”是注册失败的,“Thank you for your support...”是注册成功的

    往上看看有没有什么跳转语句

    这个跳转语句直接跳过了注册失败的地方

    jnz 跳转指令上有个 cmp 指令,如果 jnz 要进行跳转的话,eax 就不能等于 3

    跳过来之后这里又有一个 jnz 跳转,如果跳的话,就会跳过成功的地方

    如果不让它跳的话,eax 的值要为 4

    这个 cmp 指令是来自别的跳转

    右键 -> 转到 jnz 来自 004DC04C,进行跳转

    这个跳转指令上面还有一个 cmp 指令,如果 eax 不等于 2,就进行跳转

    这个 cmp 指令是来自 004DBE01 的跳转

    来到 004DBE01 的位置

    这个 jnz 跳转指令上面又有一个 cmp 指令

    这个 cmp 指令是来自 004DBDA9 的跳转

    来到 004DBDA9 处

    往上就是该代码块的开头了

    下两个断点

    一个在该代码块的开头处,一个在 cmp 指令处

    重新跑一下程序,让它在开头处停下

    按 F8 往下走

    eax 在这里被赋值,ebp+8 是程序的第一个参数,值为 1

    如果在这里进行修改的话,改成 mov eax, 4,会覆盖后面的指令

    因为 mov eax, 4 占 5 个字节,原来的语句只占 3 个字节,会把后面的语句覆盖掉,造成堆栈不平衡

    复制下面两行指令

    选中 -> 右键 -> 二进制 -> 二进制复制

    在该程序里找一块没用的空间(一般在末尾处)来写内嵌补丁

    从 005E47D0 处开始写

    添加指令 mov eax, 4

    然后粘贴刚才复制的那两条指令

    右键 -> 二进制 -> 二进制粘贴

    粘贴的时候要选中两行

    完成之后修改先前那个 mov 指令

    修改为 jmp 005e47d0,即刚才那个补丁的地址

    该行指令还是占 5 个字节,把后面的两行指令给覆盖了

    但是那两行指令在后面有,没什么影响了

    接下来在补丁处添加个 jmp 跳转指令,使其能跳转回去

    保存程序,运行

    程序会一直弹出该窗口

    回到 OD,走一下程序

    执行到补丁处 eax 的值就变为 4 了

    接着一路往下走

    走到这里会弹出那个成功的对话框

    按 F9 运行会发现,程序进入了一个死循环

    程序会回到开头处,然后一直循环

    回到成功前的那条跳转指令

    此时的 jnz 是不跳转的,然后弹出成功的对话框,之后进入一个死循环

    将 ZF 置 0,让其跳转

    在 B 之后,就结束了这个 switch 语句

    B 中调用了一个过程

    该过程会跳出对话框

    把 mov eax, 4 改为 mov eax, 0B,B 前面要加上个 0

    保存程序,运行

    程序可以直接运行,也没有了 NAG 窗口

    另一解法:

    OD 重新载入程序,跑一下程序

    出现 NAG 窗口后按一下暂停

    然后按 Alt+K,显示调用堆栈

    任何函数和过程的调用都要动用到堆栈

    最后三个可能是生成 NAG 窗口的调用,因为 NAG 窗口是后面才调用的

    先从最后一个开始,双击来到它所在的位置

    在此处下一个断点,重新跑一下程序

    出现 NAG 窗口

    按 F8 往下走一步

    点击 Exit

    往下走了一步

    这个 call 和 NAG 窗口有很大的关系,可能就是 NAG 窗口

    找到该代码块的开头处,下一个断点

    接下来重新跑一下程序

    停在该断点处

    按 F8 往下走

    这是第一个跳转,跳转未实现,接着往下走

    来到第二个跳转指令,跳转已实现,直接跳

    接着走到第三个跳转指令

    看看该跳转指令跳到哪

    跳到了 retn 语句之前,也就是直接跳过了 NAG 窗口的那个 call

    执行完 retn 之后,按 F9 运行

    程序又回到了刚才那个代码块的开头

    F8 往下走

    第一个跳转指令变为已实现,看看它跳去哪

    跳到这个位置,跟着它跳跳看

    接下来又是一个跳转指令

    看看它跳到哪

    跟着它进行跳转,继续往下走

    之后是一个未实现的跳转

    继续往下走,就来到了那个与 NAG 窗口有关的 call 了

    浏览了大概之后,就对程序进行修改

    先看第一个跳转指令

    如果将该跳转指令改为已实现的话,将跟后来的一次情况一样,执行 NAG 窗口

    再看第二个跳转指令

    将第二个跳转指令改为未实现会是什么情况

    将 ZF 置 1

    改完之后跑一下程序

    直接进入了主界面

  • 相关阅读:
    SpringBoot(五)-- 整合Spring的拦截器
    SpringBoot(四)-- 整合Servlet、Filter、Listener
    SpringBoot(三)-- 整合FreeMarker模板
    XML转JSON工具类
    SpringBoot(二)-- 支持JSP
    SpringBoot(一)-- 知识点介绍
    导出Excel工具类
    Linux CentOS6.5上搭建环境遇到的问题
    网络环境未能通过安全验证,请稍候再试
    Struts2,Spring,Hibernate框架的优缺点
  • 原文地址:https://www.cnblogs.com/sch01ar/p/9742634.html
Copyright © 2011-2022 走看看