最近在学习汇编(看的是王爽老师的《汇编语言(第三版)》),然后想尝试使用OD(Ollydbg)软件破解一个简单的C语言程序练练手。

环境:

C语言编译环境:VC++6.0

系统:在Windows10下开的VM虚拟机中的Windows XP

C语言程序代码:

  1. #include <STDIO.H>
  2.  
  3. int main(){
  4. int age;
  5. age=;
  6. if (age==){
  7. printf("Successful\n");
  8. }else{
  9. printf("No Access\n");
  10. }
  11. getchar();
  12.  
  13. return ;
  14. }

这个程序编译后,正常运行输出的是"Successful",而现在的目的是采用反汇编让该程序输出"NO Access"。

我们先在VC6中分析一下这个程序反汇编(Disassembly)之后的结果:(这个步骤不会请自行百度)

简单分析之后,可以看出"if (age==10)"被编译为:

CMP DWORD PTR [EBP-4],0AH

JNE main+34H

分析一下这两条汇编指令:

CMP用于将SS:[EBP-4]内存单元中(这个内存单元保存的就是变量age的值)数据与0AH做减法运算,但是不保存结果,只影响标志位,由于被减数和减数都是0AH,所以相减为0,标志位ZF=1。

JNE全称为Jump if Not Equal,它与JNZ(Jump if Not Zero)指令等价(为什么要说到JNZ呢,因为在OD软件中是JNZ而不是JNE),JNE/JNZ判断标志位ZF是否为1,如果为1则不跳转,显然此时的ZF=1,那就是不跳转了,将继续执行下面的指令,就输出了"Successful"了。

而我们需要输出"No Access",就需要让它跳转,那怎么让它跳转呢,很简单,只需要将JNE修改为JE就行了,JE就是如果ZF=1则跳转。

知道了突破口,用OD打开这个程序,找到00401033H行(由于编译环境不同,读者可能不是此行,建议使用ASCII字符串搜索"Successful"进行跳转,此方法自行百度)。

双击选中的行,将jnz改写为jz,然后单击“汇编”按钮即可。

在修改的行右键,选择“复制到可执行文件”->“所有修改”,在跳出的对话框中选择“全部复制”。

在跳出的新窗口中右键选择“保存文件”即可保存修改之后的程序。

然后运行修改之后的程序,显示的就是"No Access"啦!

利用OD破解一个简单的C语言程序的更多相关文章

  1. 一个简单的C语言程序(详解)

    C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 ...

  2. 利用ANTLR4实现一个简单的四则运算计算器

    利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...

  3. 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件

    作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...

  4. 利用 nodeJS 搭建一个简单的Web服务器(转)

    下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...

  5. iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

    iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcar ...

  6. 一个简单的MDI示范程序(Delphi)

    http://www.cnblogs.com/pchmonster/archive/2012/01/07/2316012.html 最为一个巩固之前有关窗体和对象的有关知识,下面就建立一个简单的MDI ...

  7. 一个简单的python爬虫程序

    python|网络爬虫 概述 这是一个简单的python爬虫程序,仅用作技术学习与交流,主要是通过一个简单的实际案例来对网络爬虫有个基础的认识. 什么是网络爬虫 简单的讲,网络爬虫就是模拟人访问web ...

  8. 一个简单的C#爬虫程序

    这篇这篇文章主要是展示了一个C#语言如何抓取网站中的图片.实现原理就是基于http请求.C#给我们提供了HttpWebRequest和WebClient两个对象,方便发送请求获取数据,下面看如何实 1 ...

  9. 【Java】一个简单的Java应用程序

    简单记录,Java 核心技术卷I 基础知识(原书第10 版) 一个简单的Java应用程序"Hello, World!" Hello, World! Goodbye,World! 一 ...

随机推荐

  1. cURL无法访问TLS网站故障解决

    大多数人都厌烦使用老旧的系统,无论软件还是硬件.但有的时候又不得不困守其中,坚持延续着系统的寿命,或者还需要点几柱香,祈求神佛的护佑. Linux是一个模块化极好的操作系统,得益于此,当其中有组件落伍 ...

  2. Samba安装及配置

    samba 可以实现Windows对Windows . Windows对Linux.Linux对Linux的文件传输 在centos7安装samba yum install samba 启动samba ...

  3. java对 zip文件的压缩和解压(ant解决中文乱码)

    说明: 1.对于压缩的文件,当文件名称是中文时,若使用JDK API中自带的类(java.util.zip.ZipEntry; java.util.zip.ZipOutputStream;)进行压缩, ...

  4. cf 01mst

    https://codeforces.com/contest/1243/problem/D 题意是说:给一个图对吧,然后给出点与点的关系,边权为1,没有给出的点与点关系,则这两点边权为0,求出最小生成 ...

  5. 利用Python进行数据分析-Pandas(第五部分-数据规整:聚合、合并和重塑)

    在许多应用中,数据可能分散在许多文件或数据库中,存储的形式也不利于分析.本部分关注可以聚合.合并.重塑数据的方法. 1.层次化索引 层次化索引(hierarchical indexing)是panda ...

  6. 微信公众号支付提示当前页面的URL未注册

    问题: 记一下前端时间自己做了一个微信公众号支付的功能,因为有一段时间没有接触过了微信支付方面的开发,居然忘记了在微信商户商户号中配置了对应的支付目录,所以提示我当前的域名是没有注册的. 设置支付目录 ...

  7. 备用APC队列

     Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 备用APC队列 占坑:这一节跟进程挂靠相关联,我们先把进程挂靠给 ...

  8. event demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. (转)滑动平均法、滑动平均模型算法(Moving average,MA)

    原文链接:https://blog.csdn.net/qq_39521554/article/details/79028012 什么是移动平均法? 移动平均法是用一组最近的实际数据值来预测未来一期或几 ...

  10. audio标签以及audio对象

    一.audio标签 简单语法 <audio src="音频链接"></audio> 属性 属性 值 描述 autoplay 如果出现该属性,则音频在就绪后马 ...