逆向基础02

第一天内容复习

一、逆向的目的是什么

  • 分析逻辑和数据结构(游戏分析)
  • 为一个没有源码的程序添加功能或修复漏洞(打补丁)

二、逆向的岗位有哪一些

  • 逆向破解程序。(没有岗位)
  • 逆向分析恶意代码(安全研究员)
  • 协议分析 ——– 密码学、移动端
  • 二进制代码审计(漏洞利用\挖掘)
  • 竞品分析 ——– 分析友商的程序,重现或者写出更厉害的功能
  • 游戏安全、免杀、内核安全

三、安全工具的使用

  • 十六进制编辑器: 010Editor WinHex UltraEdit
  • PE 工具: LORDPE PEID EXEINFO DIE | Depends | Resource Hacker
  • 抓包工具: WarkShark(内核) WSExplorer(应用层 Socket API HOOK )
  • 行为监控:火绒剑(看进程行为,进程树, 文件操作,注册表操作,内核信息查看)
  • ARK:用于检测拥有较高权限且能够隐藏自身的木马程序的工具
  • PCHUNTER 火绒剑(常见的 ARK 工具都被加了特征码)
  • 数据搜索工具: CheatEngine,通常用于分析游戏的数据和相关的操作

OllyDbg的使用

一、使用OD调试程序的几种方式

  1. 在菜单栏点击 -> 文件 -> 打开调试目标程序,可以设置命令行参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>

    // main 函数的另外一种接收命令行参数的标准写法
    int main(int argc, char* argv[])
    {
    // 第一个参数就是当前应用程序的路径,其余的附加参数保存在后面
    for (int i = 0; i < argc; ++i)
    printf("[%d]: %s\n", i, argv[i]);

    return 0;
    }
  2. 通过菜单 -> 文件 -> 附加,附加到一个正在运行的程序上。

  3. 将 OllyDbg 设置为当前操作系统的实时调试器(程序崩溃时的默认调试器)。

    通过菜单 -> 设置 -> 实时调试器 -> 将OllyDbg 设置为实时调试器。

  4. 最常见的是使用发送到将应用程序交给 OD 进行调试。在文件管理器输入 shell:sendto

  5. DLL调试,OD 的根目录下存在一个叫做 LoadDll.exe 的文件,当将一个 DLL 拖拽到 OD 中时,就会使用这个exe加载 DLL 文件,并且自动断到 dllMain 处,再进行调试.[操作系统提供了一个类似的 exe 叫做 rundll32.exe 经常会被恶意程序进行白利用].

二、认识OD的界面

  • OD主界面中的工具栏

    image-20191217144852305

  • L:日志窗口,查看调试过程中的信息

    image-20191217145119084

  • E:模块窗口,保存了模块相关的信息

    image-20191217145347273

  • M:应用程序的内存布局窗口,通常查看区段信息

    image-20191217145704650

  • T:线程信息窗口,可以操作线程

    image-20191217145915357

  • W:窗口信息,可以获取窗口的标题等,方便进行逆向分析

    image-20191217150336110

  • H:内核句柄窗口,没什么使用意义

    image-20191217150516133

  • C:CPU窗口,显示指令和内存等,是调试的主窗口

    image-20191217150940212

  • /:补丁窗口,显示当前所有对应用的修改

    image-20191217151329202

  • K :调用堆栈,逆向的时候使用的非常多,用于进行栈回溯查找关键代码

    image-20191217151652384

  • B:断点窗口,可以查看和操作断点

    image-20191217151840203

  • R: 查找参考,查找当前的指令被哪一些地方调用了,在IDA中叫做(交叉引用)

    image-20191217152051149

  • … : RUN跟踪,脱壳的时候会用到,会模拟执行并记录每一行代码的执行结果

三、OD提供的相关功能

  • 查看内存信息 - 支持两种编码

    image-20191217154439554

  • 通过数据窗口查看函数地址和名称

    image-20191217154645261

  • 指定PE文件,主要用于查看内存中的PE文件(没有对应磁盘文件的),用于DUMP

    image-20191217154954716

  • 通过在内存窗口双击PE文件头也可以解析一个PE文件

    image-20191217155050032

  • 查找数据:查找名称(导入导出函数)

    image-20191217155317117

  • 查找指令(序列):通过 ctrl+S ctrl+F ctrl+L

    image-20191217155513785

  • 二进制查找:用于查找特征值

    image-20191217155703961

  • 查找模块间的调用

    image-20191217155914280

  • 查找用户定义的注释. 用户的注释不应该写在堆空间

    image-20191217160115723

  • OD 提供的自动分析功能 - 汇编代码界面,如果没有自动识别,应该通过 ctrl+a 进行识别

    image-20191217160859724

  • OD 提供的自动分析功能 -堆栈界面

    image-20191217161548806

  • 对应用程序执行修改之后,可以通过菜单中的补丁功能保存修改

    image-20191217164144005

  • 假定参数:使用假定参数设置消息断点

    image-20191217165211437

    image-20191217165316689

    image-20191217165605366

分析程序的方法

  • 字符串搜索找到关键点
  • 通过关键函数进行栈回溯找到关键点