【Day 05】你逆 - 逆向工程工具介绍

环境

  • Windows 10 21H1
  • IDA PRO 7.5
  • Python 3.9
  • x64Dbg Aug 2 2020, 13:56:14

前言

虽然这个系列并不是逆向工程为主,但是在探讨一些技巧或是讲解 POC 原理的时候,难免会需要一些逆向工具的帮忙。

这篇文章会以让大家能够看懂其他篇文章为目的撰写,所以不会讲太深入的逆向工程技巧,例如 Deobfuscation、Anti-Anti-Debug 之类的。主要讲些基础的逆向,让大家能快速的找到目标,并看懂程序在做什麽。

由於这个系列是在讲 Windows 的东西,所以介绍的工具、概念都会偏向 Windows,虽然部分知识可以适用於其他作业系统,不过也有些不行。工具的部分是介绍我自己习惯的,但是也会稍微提到一些能做到相同功能的工具。

以下拿大家熟悉的小算盘(calc.exe)开刀。

工具

IDA

IDA 基本功能

这个工具大概已经被讲到烂了,几乎所有讲逆向工程的文章都会提到它。虽然很方便,但是要钱。每年都会办 Plugin 制作比赛,让程序功能更丰富,GitHub 上还有人整理好 IDA Plugin,然而似乎一阵子没更新了。

只要动动手指就可以反组译。

只要按个键盘(F5)就可以反编译。

其他还有可以看 String、Import Function、Export Function 等等的视窗,应该用滑鼠点一点就知道了。

IDA Plugin

这里介绍几个 Angelboy 推荐的 Plugin:

  • BinDiff: 可以同时比对两个程序的相似度,通常是 Patch 前後的两个版本,或是很可能来自同个家族的 Malware。
  • Signsrch: 能够搜寻特定的 Signature 自动辨认 Encryption、Compression 等演算法

另外是我觉得非常实用的 Plugin - LazyIDA,开发者是台湾人 Lays。可以做到把选定范围的位址的值转成自己要的型别,例如 String、C/C++ Array、Python List,也可以用快捷键复制位址或是字串。在逆向时非常省时间。

IDA Python

基本上在前面 IDA 基本功能所看到的大多功能,都可以使用 IDA Python 完成。可以自动化 Parse 反组译後的组语和反编译後的程序,也可以做 Symbol Rename、变色等等,弹性颇大。

这些在要处理许多重复性工作时十分有帮助,尤其是在分析 Malware 时可能需要反混淆(Deobfuscation),这时重复性的工作就会很多。或者是如果要分析大型的专案,IDA Python 的自动化脚本也能让自己快速的有些头绪。

Ghidra

一个跟 IDA 并驾齐驱的软件,最吸引人的点是它是开源的,也就是说免费。基本功能上 IDA 有的它都有,例如反组译、反编译等等。

Plugin 的部分虽然比 IDA 少一些,但是数量也是颇惊人,GitHub 上也有人整理了 Ghidra Plugin,然而我对 Ghidra 不熟,无法推荐 Plugin。目前的现状是有些 IDA 有的 Plugin 在 Ghidra 可能没有,因此需要各位的开源之力,把 IDA Plugin 移植到 Ghidra。

自动化脚本 Ghidra 使用的语言是 Java,用法可以参考官方网站

x64dbg

顾名思义就是一个 Debugger。当静态分析太复杂,导致有些记忆体资料不知道是什麽时,可以直接追进去看。

开始 Debug 一个程序後大致如下图,如图所见左上区块是目前执行的 Instruction,右上是 Register,左下是看 Memory Dump,右下是 Stack。

Symbols 这个 Tab 左半边可以用来观察载入的 Image,得知 Image Base Address 与完整路径,右半边能够找到对应的 Export Function,锁定目标下断点逆向。这功能在这系列的文章会很常用到,因为常常会需要观察特定的函数。

WinDbg

这是微软开发的 Debugger,所以对於 Windows 的相容性也较高。Kernel Debug 也是需要使用 WinDbg。

不过因为我是从 x64Dbg 入手的,操作上还是比较习惯 x64Dbg,所以这个系列大部分在 Debug 时还是会使用 x64Dbg。

PE-bear

一个用来观察 PE 档案的软件,可以知道目前要分析的档案的架构,例如 Header 和 Section 的资讯。

实际使用

以下直接拿分析 calc.exe 为例子。

用 IDA 观察

把 calc.exe 汇入 IDA 後,点选 WinMain 後反编译如下图。可以看到 Function 基本上都有 Symbol,其实逆向 Windows 内建的东西基本上都会有 Symbol,节省了许多分析时间,所以其实非常快乐。

从程序码中知道这边的程序流程

  1. 前面三个 Function,EventRegisterEventSetInformationEventWriteTransfer 在处理 ETW 的工作,主要目的是记录事件。至於 ETW 的运作原理,会在後面文章讲解。
  2. 执行 ShellExecuteW。仔细看其中的参数,并对应到 ShellExecuteW MSDN 连结的说明,主要关注第二根第三个参数。第二个参数是 0,也就是 NULL,代表现在要执行的动作是 Open;第三个参数是 ms-calculator: 代表要开启的物件。根据以上资讯可以发现一个 Windows 冷知识(?),在资料夹路径上打 ms-calculator: 会跳出小算盘。

用 x64Dbg 观察

假设现在我们想要知道刚刚 IDA 看到的 EventRegister 函数的第一个参数的具体的值,可以用 Debug 的方式追到函数执行之前的地方观察。

在 x64Dbg 开启小算盘,载入後首先看到的还不是 WinMain 的地方,所以要做的事是确认目标的位址。点上方 Symbols 的 Tab 可以看目前载入的 Image,其中可以发现 calc.exe 的 Base Address。

因为我们用 IDA 打开看的部分就是 calc.exe,所以要看它的 Base Address。得知了 Base Address 後,在 IDA 的 Edit => Segments => Rebase Program,把值改成 x64Dbg 看到的 Base Address,这样 IDA 跟 x64Dbg 两边的位址就一致了。

这时再看 IDA 中 WinMain 的位址,并记录下来。点回去 x64Dbg 上方的 CPU Tab,按下 Ctrl-g 後输入位址,就可以看到那边的 Assembly。

在这个位址按 F2 下断点,那一行就会变红色的,等等程序执行到这边就会停在这。接着按 F9 继续执行,就会停在下断点的地方。

接下来就可以开始 Debug 这个函数,因为现在目标是 EventRegister 的参数,所以一直按 F8 单步执行到呼叫 EventRegister 那一行。

那要怎麽知道参数是什麽呢?这边要说明一下 Windows x64 的 Calling Convention,如果是整数参数,从第一个参数开始分别是 RCX、RDX、R8、R9、Stack。也就是说如果要知道第一个参数是什麽,就要看 RCX 的值,以下图为例就是 3CB578FC30

因为这边的 3CB578FC30 是个位址,具体的值放在这个位址中,所以在左下角 Memory Dump 的地方按下 Ctrl-g,并输入这个位址,就可以看到这个位址中的值。

到这边就找到 EventRegister 函数的第一个参数的值了,那这个值其实是 Provider 的 GUID,代表的意义会在後续文章介绍。


<<:  [Day04] 第四章- 初探金流API文件-3 (sign透过nodejs实作)

>>:  EP 05 - [TDD] HashID 计算

Day 11 | 进阶清单元件RecyclerView

RecyclerView RecyclerView是进阶版的清单元件,它取代了基本的ListView...

Day20 vue.js椅毒供毒之整理code

写出不乾净的code跟WEED一样 一开始写的时候可能会感到轻松快乐 但是後续的维护或修改会把自己搞...

【PHP 设计模式大头菜】策略模式 Strategy Pattern

策略模式 Strategy Pattern 策略模式,可以让物件在运作时更改其行为或算法,你可以透...

Angular Stock上市个股日成交(三)(Day29)

今天我们要来使用zingChart的套件产出视觉化的图表 首先我们先在daily-tranction...

[Day03] swift & kotlin 入门篇!(1) 基础语法-变数与常数宣告

章节说明 在开始写APP之前 我们需要先对 Swift&Kotlin 的语法有基本上的认知 先练会使...