最近准备花一个月左右的时间把加密与解密这本书看了,这里记录一些读书笔记

今天把基础篇和调试篇学了

加密与解密全书共分为10篇,分别是

  • 基础篇
  • 调试篇
  • 解密篇
  • 系统篇
  • 漏洞篇
  • 脱壳篇
  • 保护篇
  • 软件重构篇
  • 语言和平台篇
  • 取证篇

基础篇

基础篇介绍了啥是加密和解密、软件逆向工程、逆向分析技术、文本字符、windows操作系统

逆向分析技术

逆向分析技术包括了通过软件使用说明和操作格式分析软件、静态分析技术、动态分析技术,所谓静态分析,就是在程序没有加载起来的时候,使用一些反汇编软件(IDA)逆向分析代码逻辑,动态分析就是使用动态调试工具(x86/x64dbg、ollydbg、Windbg)让程序跑起来去分析,一般我们可以先粗调,理清楚程序的整体逻辑,然后细调分析各个函数实现的功能

文本字符

文本字符介绍了ascii、unicode字符集

windows操作系统

windows的核心是动态链接,由消息驱动

常见的windows消息

// 将消息发送给窗口,消息投递成功返回 true
LRESULT SendMessage(
    HWND hWnd,        // 窗口句柄
    UINT Msg,        // 消息标识符
    WPARAM wParam,    // 消息的WPARAM域
    LPARAM lParam    // 消息的LPARAM域
);
// 当用户从菜单或者按钮中选择一条命令或控件时,该消息被发送给父窗口,或者一个快捷键被释放时发送,如果应用程序处理这条消息,则返回值为0
WM_COMMAND
    wNotifyCode = HIWORD(wParam);    // 通告代码
    WID = LOWORD(wParam);        // 菜单条目、控件、快捷键的标识符
    hwndCtl = (HWND) lParam;    // 控件句柄
// WM_DESTROY消息,当一个窗口被摧毁时发送该消息,若消息被处理则返回值为0
// 将文本复制到缓冲区中,返回被复制的字符数
WM_GETTEXT
    wParam = (WPARAM) cchTextMax;    // 需要复制的字符数
    lParam = (LPARAM) lpszText;        // 接受文本的缓冲区地址
// 当程序调用PostQuitMessage函数时,产生该消息,没有返回值
WM_QUIT
    nExitCode = (int) wParam;    // 退出代码
// 按下鼠标左键时发送该消息
WM_LBUTTONDOWN
    fwKeys = wParam;    // key旗帜
    xPos = LOWORD(lPARAM)    // 光标的水平位置
    yPos = HIWORD(lParam)    // 光标的垂直位置

当一个应用程序启动时,操作系统会创建一个进程,并分配2GB的虚拟地址,如果使用DLL,DLL也会被映射进虚拟地址

调试篇

动态分析技术

这一章节介绍了四个工具的使用(OllyDbg/x64dbg/MDebug/WinDbg)

OllyDbg

OllyDbg是一款具有可视化界面的用户调试器,有反汇编面板窗口、信息面板窗口、数据面板窗口、寄存器面板窗口、栈面板窗口五个窗口

反汇编面板窗口显示被调试程序的代码,有四列,分别是地址、十六进制的机器码、反汇编代码、注释

  • 地址:双击显示相对地址,再次双击显示标准地址
  • 机器码:设置断点,快捷键是F2
  • 反汇编代码:可直接修改汇编代码,快捷键是空格
  • 注释:允许添加或修改注释,快捷键是 ;

信息面板窗口在动态跟踪时,显示与指令相关的各寄存器的值、API函数调用提示、跳转提示等信息

数据面板窗口以十六进制和字符的方式显示文件在内存中的数据

寄存器面板窗口显示各寄存器的值

栈窗口显示栈中的数据,在调试的过程中,可以查看进栈、出栈的操作

常用快捷键

  • F7 : 单步步进,遇到call跟进,Ctrl + F7 可以重复步进直到按下Esc、F12或遇到断点停止
  • F8 : 单步步过,遇到call步过,Ctrl + F8和上面类似
  • Ctrl + F9 : 直到出现ret指令时中断,用来跳出函数
  • Alt + F9 : 若在系统层面,使用该命令可立即返回应用层面
  • F9 : 运行程序
  • F2 : 设置断点

常见断点:INT 3断点、硬件断点、内存断点、内存访问一次性断点、消息断点、条件断点、条件记录断点

X64dbg

OllyDbg只支持32位程序的调试,而x64dbg有32位和64位两个版本,我个人更喜欢使用x64dbg,用法和OllyDbg类似

MDebug

MDebug也分32位和64位两个版本,用于调试windows应用程序

WinDbg

WinDbg不仅可以调试用户态程序,还可以用来调试内核,这个软件我打算在后面学到内核的时候再来学习

静态分析技术

文件类型分析

常见的文件分析工具有PEiD、Exeinfo PE,可以用来检测文件的编译语言、加壳信息等

反汇编引擎

反汇编引擎 : ODDisasm/BeaEngine/Udis86/Capstone

汇编引擎 : ODAssemble/Keystone/AsmJit

静态反汇编

IDA Pro

这里重新查漏补缺一下

结构体的添加:

我们写一个有结构体的程序

#include <stdio.h>
struct student
{
    int id;
    char name[20];
    int age;
};
struct student stu[2] = {{01, "BOY", 10}, {02, "John", 15}};
int main(){
    struct student *p;
    for(p = stu; p < stu + 2; p++){
        printf("%5d %-20s%4d\n", p->id, p->name, p->age);
    }
    return 0;
}

我们将生成的程序丢到IDA里面查看,发现并没有识别出结构体

b7v9fS.png

b7vmkV.png

这里我们只需要添加结构体就可以了

首先我们先进结构体窗口(structures),可以看到里面没有结构体,这里我们创建student结构体

b7vdpD.png

我们在空白处右键,点击Add struct type,或者直接按insert键就可以插入了

image-20220312193216097

然后我们把名字修改为student

image-20220312193307053

这里我们看到已经成功添加student结构体了,使用按键 A 可以添加结构体成员

image-20220312193421848

点击OK

image-20220312193448759

然后就可以看见我们添加了一个结构体成员 field_0 我们点击按键 N 修改名字,然后点击按键 D 修改数据类型,这样我们结构体就创建好了

image-20220312193729608

这里name我们给20字节大小

image-20220312193814680

然后我们到data段给数据修改为结构体就OK了

我们选中0x403020和0x40303c两个地址然后在IDA的右上角点击Edit,然后点击Struct var,然后选中我们创建的结构体就ok了

image-20220312194012771

现在我们看main函数里面也成功识别出了结构体

image-20220312194206433

FLIRT签名:IDA有很强大的FLIRT签名功能,可以自动识别出很多函数,但偶尔也会遇到识别不出来的情况,这时候我们就需要在签名窗口添加签名文件 View->Open subview->Signatures或者直接按 Shift + F5

image-20220312195103849

然后我们在空白处右键选择,Apply new signature 或者按 Insert 就可以添加签名文件了

IDA还具有动态调试功能,具有本地调试和远程调试

十六进制工具:HexWorkshop、WinHex、Hiew等,这些工具可以查看可执行文件的十六进制代码