zoukankan      html  css  js  c++  java
  • 《逆向工程核心原理》--- 逆向分析Hello World 程序

    OllyDbg 使用

    面板介绍

    2.反汇编窗口

      反汇编面板窗口显示被调试程序的代码,它有4个列,分别是地址(address),机器码(hex dump),反汇编代码(disassembly),注释(comment)。最后一列注释栏显示相关API参数或运行简表,非常有用。

          address列:显示相对被单击地址的地址,再次双击返回到标准地址模式。

          hex dump列:设置或取消无条件断点,对应的快捷键是F2。

          disassembly列:条用汇编器,可直接修改汇编代码。

          comment列:允许增加或编辑注释,对应的快捷键是“;”键。

    3.寄存器面板

      这里显示CPU各寄存器的值,支持浮点,MMX和3DNow!寄存器,可以单击鼠标右键或单击窗口标题切换显示寄存器的方式

    4.信息面板

      动态跟踪时,显示与指令相关的各寄存器值,API函数调用提示和跳转提示信息

    5.数据面板

       以十六进制和字符方式显示文件在内存中的数据,要显示数据可点击鼠标右键“go to expression”命令或按“Ctrl+G”键打开地址窗口,输入地址

    6.堆栈面板

      显示了堆栈的内容,即ESP指向地址的内容,堆栈窗口非常重要,各API函数和子程序等都利用它传递参数和变量等

    基本调试方法

    OllyDBG 有三种方式来载入程序进行调试

    1. 一种是点击菜单 文件->打开 (快捷键是 F3)来打开一个可执行文件进行调试,
    2. 另一种是点击菜单 文件->附加 来附加到一个已运行的进程上进行调试。注意这里要附加的程序必须已运行
    3. 第三种就是用右键菜单来载入程序(不知这种算不算)。一般情况下我们选第一种方式。比如我们选择一个 test.exe 来调试,通过菜单 文件->打开 来载入这个程序


    调试中我们经常要用到的快捷键有这些:
    F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。(相当于 SoftICE 中的 F9)
    F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。(相当于 SoftICE 中的 F10)
    F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于 SoftICE 中的 F8)
    F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于 SoftICE 中的 F7)
    F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于 SoftICE 中的 F5)
    CTR+F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。(相当于 SoftICE 中的 F12)
    ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于 SoftICE 中的 F11)

    调试Hello.exe程序

    源程序:

    1 #include "windows.h"
    2 
    3 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
    4 {
    5     MessageBox( NULL, TEXT("Hello,world!"), TEXT("MessageBox"), 0 );
    6 
    7     return 0;
    8 }

    入口点:

     

    入口处EntryPoint: 是windows可执行文件的代码入口处,是执行程序的起始位置

    继续跟踪执行:

    1.push ebp;保存ebp内容以便调用完后恢复;此时esp <- esp - 4;

    2.move ebp esp; 保存调用前栈顶地址以便调用完后恢复 此时,esp ebp 都指向栈顶,esp作为段寄存器访问堆栈段,ebp作为基址寄存器访问堆栈段中的堆栈帧即稍后要分配的 0x4c个字节;

    3.sub esp 40 即2里面所说的给调用函数分配0x40字节的局部变量空间堆栈帧;

    4. push ebx push esi push edi     ;传参

    5.LEA EAX, DWORD PTR SS:[EBP-40]  取 DWORD PTR SS:[EBP-40]的地址送到EAX中, 即将地址SS:[EBP-40]送到EAX中(执行后, EAX中的值是SS:[EBP-40])

    6.ecx寄存器的值为10h

    7.eax为初始化值0ccccccccch 

    8.rep stos:实际上就是把初始化开辟的空间,初始值为eax寄存器内的值0CCCCCCCCh, 
      从edi开始(edi保存的esp的位置),向高地址的部分进行字节拷贝,每一次拷贝4个字节。 
      拷贝的内容就是eax的内容,拷贝次数为10h次

  • 相关阅读:
    决策树简介
    机器学习一百天-day7/11-KNN
    机器学习100天-day4,5,6,8逻辑回归
    机器学习一百天-day3多元线性回归及虚拟变量陷阱分析
    机器学习100天-day2简单线性回归
    机器学习100天-day1数据预处理
    sklearn.preprocessing.Imputer
    vue echart 中国地图 疫情图
    一周笔记
    js基础操作与方法
  • 原文地址:https://www.cnblogs.com/mysky007/p/12905974.html
Copyright © 2011-2022 走看看