zoukankan      html  css  js  c++  java
  • 利用OD破解一个简单的C语言程序

    最近在学习汇编(看的是王爽老师的《汇编语言(第三版)》),然后想尝试使用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=10;
     6     if (age==10){
     7         printf("Successful
    ");
     8     }else{
     9         printf("No Access
    ");
    10     }
    11     getchar();
    12 
    13     return 0;
    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"啦!

  • 相关阅读:
    ImageLoader配置(凝视)
    Javaproject集成log4j 2.x
    kafka入门样例 for java
    php&amp;&amp;页面静态化
    Windows 下Oracle database 9i 64bit 仅仅有 Windows Itanium 64bit
    苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
    Visual Studio2008 和2010 执行程序出现的黑框马上消失解决方法
    Cocos2d-x 3.0 Schedule in Node
    zend framework获取数据库中枚举类enum的数据并将其转换成数组
    OpenGl 坐标转换
  • 原文地址:https://www.cnblogs.com/ryzz/p/11439665.html
Copyright © 2011-2022 走看看