前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过逆向工程学习如何读懂二进制代码

通过逆向工程学习如何读懂二进制代码

作者头像
红客突击队
发布2022-09-29 21:19:52
7210
发布2022-09-29 21:19:52
举报
文章被收录于专栏:kaydenkayden

通过逆向工程学习如何读懂二进制代码

前言

上一篇学完内网之后,打算学习一些逆向相关知识

本篇开始阅读学习《有趣的二进制:软件安全与逆向分析》,本章是通过逆向工程学习如何读懂二进制代码,主要是体验软件分析、静态分析和动态分析(可以理解为怕劝退读者)

作者有句话很有意思:

在编写这本书的过程中,我再一次感到,在不计其数的编程语言中,汇编语言是最‘有趣’的一种

配套资源在:https://github.com/shyujikou/binarybook

一、软件分析体验

首先是一些工具安装:

  • 二进制编辑 WinHex:建议到吾爱破解下载
  • 网络监控 Wireshark:https://www.wireshark.org/
  • 文件和注册表监控 Process Monitor:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procmon
  • 反汇编 IDA:建议到吾爱破解下载
  • 调试器 OllyDbg:建议到吾爱破解下载

本节要用到的是 chap01\sample_mal\Release 目录中的 sample_mal.exe 文件

1、通过 Process Monitor 的日志来确认程序的行为

sample_mal.exe 文件运行后,弹出一个内容为“Hello Malware!”的对话框,如下:

Process Monitor 的日志如下:

可以看到 sample_mal.exe 文件连续执行了 CreateFile、WriteFile 和 CloseFile 这几个操作,这些操作加起来的功能相当于在指定文件夹创建并写入一个名为 0.exe 的文件

进入C:\Users\ 用户名 \AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup可以看到 0.exe 文件

用 Winhex 与 sample_mal.exe 文件进行对比,发现两个文件完全一致

此外,sample_mal.exe 还在 我的文档 目录下创建了1.exe文件:

2、从注册表访问中能发现些什么

Windows 重启时自动运行的程序可以注册在下列任一注册表的位置:

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce

可以发现注册表里面的确注册了 C:\Documents and Settings\XPMUser\My Documents\1.exe 这样的内容

3、小结

通过上述,sample_mal.exe 程序会执行以下操作:

  • 修改注册表以便在系统重启时自动运行
  • 将自己复制到“启动”文件夹以便在系统重启时自动运行

因此,我们只要将“启动”文件夹、“我的文档”以及 注册表中新增的内容(文件路径)删除,系统环境就可以完全恢复原状 了

二、静态分析体验

静态分析与动态分析简单定义如下:

  • 静态分析:在不运行目标程序的情况下进行分析
  • 动态分析:在运行目标程序的同时进行分析

静态分析主要包括以下方法:

  • 阅读反汇编代码
  • 提取可执行文件中的字符串,分析使用了哪些单词

这里用到 chap01\wsample01a\Release 中的示例程序 wsample01a.exe

1、WinHex 查看文件内容

用 WinHex 打开 wsample01a.exe

可以看到这些内容:

  • 字符串 MESSAGE 和 Hello! Windows
  • 文件路径 C:\Documents and Settings\XPMUser\My Documents\Visual Studio 2010\Projects\wsample01a\Release\wsample01a.pdb
  • 字符串 KERNEL32.dll、MessageBoxW

主要是感受下

2、IDA 反汇编

将 wsample01a.exe 扔进 IDA:

也是感受下

跟源码对比下:

代码语言:javascript
复制

#include <Windows.h>
#include <tchar.h>

int APIENTRY _tWinMain(
  HINSTANCE hInstance, 
  HINSTANCE hPrevInstance, 
  LPTSTR    lpCmdLine, 
  int       nCmdShow)
{
  if(lstrcmp(lpCmdLine, _T("2012")) == 0){
    MessageBox(GetActiveWindow(), 
      _T("Hello! 2012"), _T("MESSAGE"), MB_OK);
  }else{
    MessageBox(GetActiveWindow(), 
      _T("Hello! Windows"), _T("MESSAGE"), MB_OK);
  }  
  return 0;
}

三、动态分析体验

动态分析:

在目标程序运行的同时跟踪其行为,主要用调试器来跟踪程序逻辑

获取文件和注册表访问日志

抓取网络包

这里用 chap01\wsample01b\Release 中的示例程序 wsample01b.exe

1、 Process Monitor 跟踪

为了跟踪程序,设置 Process Monitor 的过滤规则:

然后可以发现其行为类似于开头的 sample_mal.exe

2、OllyDbg 调试

调试器是一种帮助发现程序问题和 bug 的软件:

  • 断点
  • 单步跳入、跳出
  • 查看寄存器和内存数据

看看 00401000 之后的程序逻辑,发现程序依次调用了 GetModuleFileNameWSHGetFolderPathWlstrcatWCopyFileW 这几个函数

通过设置断点和单步前进可以了解每一步或者说上面每一个函数在做什么

同样与源代码对比:

代码语言:javascript
复制
#include <Windows.h>
#include <tchar.h>

int APIENTRY _tWinMain(
  HINSTANCE hInstance, 
  HINSTANCE hPrevInstance, 
  LPTSTR    lpCmdLine, 
  int       nCmdShow)
{
  if(lstrcmp(lpCmdLine, _T("2012")) == 0){
    MessageBox(GetActiveWindow(), 
      _T("Hello! 2012"), _T("MESSAGE"), MB_OK);
  }else{
    MessageBox(GetActiveWindow(), 
      _T("Hello! Windows"), _T("MESSAGE"), MB_OK);
  }  
  return 0;
}

四、基础汇编指令

1、常用汇编指令

常用汇编指令如下:

JNZ 指令和 TEST 指令结合就是条件分支

2、参数存放在栈中

CALL 指令是用来调用子程序的,当我们用汇编语言编写子程序的时候,将返回值存放在 EAX 中,这是一种习惯

参数要通过 PUSH 指令存放在栈中:每当执行 PUSH 指令时,PUSH 的值就会被放入栈中

3、例子

一个 hello world 的汇编如下:

代码语言:javascript
复制
extern MessageBoxA

section .text
global main

main:
  push dword 0
  push dword title
  push dword text
  push dword 0
  call MessageBoxA
  ret

section .data
title: db 'MessageBox', 0
text: db 'Hello World!', 0

结语

主要是体验下几种最常用的逆向工具


红客突击队于2019年由队长k龙牵头,联合国内多位顶尖高校研究生成立。其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验。团队现有三十多位正式成员及若干预备人员,下属联合分队数支。红客突击队始终秉承先做人后技术的宗旨,旨在打造国际顶尖网络安全团队。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 红客突击队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过逆向工程学习如何读懂二进制代码
    • 2、OllyDbg 调试
    • 四、基础汇编指令
      • 1、常用汇编指令
      • 结语
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档