ODbug

本文详细介绍了OllyDbg的使用方法,包括界面各窗口功能、常见操作技巧及程序破解实例。通过实例演示了如何搜索字符串、下断点、修改代码并保存文件,以绕过特定程序检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x01 首先先认识一下OD(OllyDbg)

打开OD界面,呈现出下图的窗口分布,这里笔者对OD界面的几个窗口进行了一下标识。
如图:
OD界面窗口分布

下面笔者对这几个窗口在程序破解中的作用一一介绍:

1.菜单窗口:

如图:
菜单窗口

从左往右依次去说这些按钮的作用以及快捷键:

序号(编号)功能快捷键
1打开新的可执行文件F3
2重新载入程序Ctrl+F2
3关闭程序Alt+F2
4运行程序F9
5暂停正在运行的程序F12
6单步步入F7
7单步步过F8
8跟踪步入Ctrl+F11
9跟踪步过Ctrl+F12
10执行到返回Ctrl+F9
11转到反汇编窗口中的地址(转到表达式)Ctrl+G
12显示记录窗口Alt+L
13显示模块窗口Alt+E
14显示内存窗口Alt+M
15显示线程窗口
16显示窗口
17显示句柄窗口
18显示CPU窗口Alt+C
19显示补丁窗口Alt+P
20显示调用堆栈窗口Alt+K
21显示断点窗口Alt+B
22显示参考窗口Alt+R
23显示Run跟踪窗口
24显示源码窗口
25调试选项Alt+O
26界面选项
27帮助

2.反汇编窗口:

为了演示方便笔者决定用C语言写个简单的Hello World!程序
代码如下(C):

#include<stdio.h>
int main()
{
        printf("Hello World!");
        getchar();
        return 0;
}

将编译好的exe文件拖入OD
exe拖入OD后

这里笔者对反汇编窗口进行了一下划分和标注:

地址栏 Hex栏 反汇编栏 具体信息栏 注释栏

反汇编窗口分布

如下表所示:

名称功能
地址栏程序的内存地址
hex栏hex数据(16进制)
反汇编栏程序的汇编代码
具体信息栏对汇编代码进行更详尽的查看和说明
注释栏OD分析出来的,双击可进行编辑

3.寄存器窗口

寄存器窗口

这里就简单介绍几个 通用寄存器 :
ESP: 指向堆栈栈顶
EBP: 大部分用来定位局部变量和参数
其余的就各自拆开来用,这里不做过多的讲解
这里面不对寄存器做更加深入的讲解,有兴趣的同学可以看看王爽的 《汇编语言(第3版) 》 。
另外, 点击标签 寄存器 (FPU) 可以切换显示寄存器的方式

4.数据窗口:

数据窗口

数据窗口主要的即为程序或者内存的数据,右键可以切换显示方式

5.堆栈窗口:(在动态调试方面十分重要)

堆栈窗口

主要存放线程的临时数据,可以用于动态调试.

6.命令行窗口

命令行窗口

用于执行一些OD命令
例如: bp+API函数名称(内存地址)  设置断点

0x02 一些OD常用操作

为了方便演示下面的操作,笔者写了一段代码来检测explorer.exe进程的程序
代码如下(C):

#include <windows.h>
#include <tlhelp32.h>   
#include <stdio.h>
int main()
{
        char* procressName = "explorer.exe";
        char pName[MAX_PATH];
        strcpy(pName, procressName);
        CharLowerBuff(pName, MAX_PATH);
        PROCESSENTRY32 currentProcess;
        currentProcess.dwSize = sizeof(currentProcess);
        HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (hProcess == INVALID_HANDLE_VALUE)
        {
                printf("函数CreateToolhelp32Snapshot调用失败!\n");
                return FALSE;
        }

        BOOL bMore = Process32First(hProcess, ¤tProcess);
        while (bMore)
        {
                CharLowerBuff(currentProcess.szExeFile, MAX_PATH);
                if (strcmp(currentProcess.szExeFile, pName) == 0)
                {
                        CloseHandle(hProcess);
                        printf("发现explorer.exe");
                        system("pause");
                        exit(0);
                }
                bMore = Process32Next(hProcess, ¤tProcess);
        }
        printf("没有发现explorer.exe\n");
        CloseHandle(hProcess);
        printf("Cracke Success!");
        getchar();
        return 0;
}

编译后运行
运行结果

那现在我们开始来绕过这个检测explorer.exe的程序吧
打开OD

1.载入OD的几种方法

(1). 直接点击打开新的可执行文件按钮(或者按F3)载入新的exe
(2). 将exe文件直接拖拽到反汇编窗口中进行加载
(3). 进程附加

  • 前提是你需要先运行所要附加的exe

a.运行要附加的exe

  • 点击文件->附加,找到需要附加的进程,选中后点击附加

b.附加exe

2.字符串搜索方法

在反汇编窗口上点击右键->中文搜索引擎[根据需要你可以选取相应的筛选选项(1.搜索ASCII,2.搜索UNICODE,3.智能搜索)]

名称别称简写为
ASCIIANSIA
UNICODEWideCharW

程序API里面的A/W就是指的这两种编码
用刚刚那个检测explorer进程的exe为例子:

ASCII搜索:
ASCII

Unicode搜索:
Unicode

智能搜索:
智能

在这里面笔者推荐在搜索字符串的时候使用智能搜索

3.下断点以及删除断点:

下断点:

  1. 快捷键下断点 快捷键F2 :用鼠标选中需要下断的代码,按一下F2
    如图:
    快捷键下断点

  2. 基本下断: 用鼠标选中代码 右键 -> 断点 -> 切换
    如图:
    基本下段

  3. 命令行下断:
    • 先找到需要下断的内存地址:
      找到内存地址
  • 在命令行窗口输入 bp+ 内存地址
  • 本程序中需要下断的内存地址为: 00B510EC 输入命令:  bp 00B510EC, 回车
    命令行下断

删除断点:

  1. 基础删除断点方法:
    • 查看 –> 断点 然后就进入到显示断点窗口(快捷键 Alt+B),如图:
      断点窗口
  • 用鼠标点击需要删除的断点右键删除即可
    这里对断点的介绍并不是很全面,只是起到了一个引导知识的作用

    4.保存文件:

    就以这个检测Explorer.exe的程序为例子
    我们需要将程序改为直接输出Cracke Success!
    首先搜索字符串找到Cracke Success!
    如图:
    找到字符

双击字符串跟踪
向上翻一翻字符串会发现 没有发现explorer.exe \n这段ASCII,用鼠标选中ASCII所在的代码,如图所示
跟踪字符串

这里面用白色圆形所传出来的是一段跳转,我们需要跟踪一下
这里的红线代表的是跳转实现,而白线则是不实现。
跟踪explorer.exe

发现是从je short Checking.00B510EC跳转过来
跟踪跳转

这里面普及一下汇编的条件跳转指令:

指令名称英文全称(不重要)功能
jmpjump无条件跳转
je/jzjump zero结果为0跳转
jnz/jnejump not zero结果不为0跳转
jsjump if sign结果为负跳转
jnsjump if not sign结果为正跳转
jbjump below比较结果小于跳转
jnbjump not below比较结果大于或者等于则跳转

回到这个程序中.
程序的意思就是调用CreateToolhelp32Snapshot函数去创造一个当前进程快照,利用ProcessFirstProcessNext这两个API函数去遍历进程快照的进程并且与Explorer.exe做比较(cmp指令),如果结果为真就不跳转,输出“发现explorer.exe”,如果结果为假就跳转“没有发现explorer.exe Cracke Success!”
基础分析

所以这其中的关键就在于遍历查找部分
遍历查找

用鼠标选中后,双击
用鼠标选中后双击

将条件跳转的je改为无条件跳转的jmp
je改jmp

右键 -> 复制到可执行文件 –> 所有修改
复制所有修改

点击全部复制
点击全部复制后

右键后,找到保存文件
保存文件

我们将其重命名为Cracker-Checking Explorer.exe 保存在桌面上
保存到桌面后

运行一下
运行

这个进程检测就被我们绕过了

 

------文章出自i春秋,这里作为自己的一份笔记,以及分享

-----https://bbs.ichunqiu.com/thread-43041-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值