0%

逆向工程核心原理第二十章

"内嵌补丁"练习

  • "内嵌补丁"是"内嵌代码补丁"(Inline Code Patch)的简称,难以直接修改指定代码时,插入并运行被称为"洞穴代码"(Code Cave)的补丁代码后,对程序打补丁。常用于运行时压缩(或加密处理)而难以直接修改的情况。

    image-20211206113450362

阅读全文 »

逆向工程核心原理第十八章

UPack PE文件头分析

使用UPack压缩abexcm1.exe
  • 使用WinUpack 0.39 Final版本压缩abexcm1.exe。直接拖拽abexcm1.exe到WinUpack,按以下勾选参数进行压缩,其中默认是没有清除重定位表的,这里勾选上以便复现原文。将压缩后abexcm1.exe重命名为abexcm1_upack.exe

    image-20211204162922497

阅读全文 »

《逆向工程核心原理》第十六章

基址重定位表

  • PE在重定位过程会用到基址重定位表(Base Relocation Table)
PE重定位
  • 向进程的虚拟内存加载PE文件(EXE/DLL/SYS)时,文件会被加载到PE头的ImageBase所指的地址处。若加载的是DLL(SYS)文件,且在ImageBase位置处已经加载了其他DLL(SYS)文件,那么PE装载器就会将其加载到其他未被占用的空间。这就涉及到PE文件重定位的问题,PE重定位是指PE文件无法加载到ImageBase所指位置,而是被加载到其他地址时,发生的一系列的处理问题。

    使用SDK(Software Development Kit,软件开发工具包)或Visual C++创建的PE文件时,EXE默认的ImageBase为00400000,DLL默认的为ImageBase为10000000。此外使用DDK(Driver Development Kit,驱动开发工具包)创建的SYS文件默认的ImageBase为10000。

  • 下图为DLL重定位示意图,A.DLL被加载到TEXT的10000000地址处。此后,B.DLL试图加载到相同地址(10000000)时,PE装载器将B.DLL加载到另一个尚未被占用的地址(3C000000)处。

    image-20211203093559819

阅读全文 »

逆向工程核心原理第十四章

运行时压缩

  • 运行时压缩器(Run-TimePacker)是软件逆向分析学的常见主题。为了理解好它,需要掌握有关PE文件格式、操作系统的基本知识(进程、内存、DLLL等),同时也要了解有关压缩/解压缩算法的基本内容。

数据压缩

  • 计算机中文件(数据)都是由二进制(0或1)组成的,只要使用合适的压缩算法,就能缩减其大小。经过压缩的文件若能100%恢复,则称该压缩为"无损压缩"(Lossless Data Compression);若不能恢复原状,则称该压缩为"有损压缩"(Loss Data Compression)。
阅读全文 »

逆向工程核心原理第十三章

PE文件格式

介绍
  • PE(Portable Executable)是Windows下的可执行文件,是微软在UNIX平台的COFF(Common Object File Format)基础上制作的。最初(正如Portable这个单词所代表那样)设计用来提高程序在不同操作系统的移植性,但实际上这种文件格式只有在Windows系列的操作系统能运行
阅读全文 »

逆向工程核心原理第十章

函数调用约定
  • 函数调用约定是对函数调用时如何传递参数的一种约定

  • 函数调用前会把各个参数逆序压入栈(因为栈是先进后出),栈是定义在进程中的一段内存空间,向低地址方向扩展,且其大小被记录在PE头中,进程运行时就确定了栈内存大小

  • 函数执行完后,栈中参数如何处理?

    不用管,因为只是临时存储在栈中,即使不在使用,清除相应的值也会浪费CPU资源,下一次向栈中存入其他值时会覆盖原来的值,因此函数执行完后不用管栈中参数

  • 函数执行完后,ESP如何变化?

    栈内存是固定的,ESP用来指示栈当前的位置,如果ESP指向栈底,则无法继续使用该栈。函数调用后如何处理ESP,这就是函数调用约定要解决的问题。

阅读全文 »

逆向工程核心原理第七章

准备阶段
  • 软件:Ollydbg,visual studio community

  • 使用visual studio创建一个名为StackFrame的c++控制台项目,粘入以下代码,然后运行生成x86(Win32)的StackFrame.exe文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "stdio.h"
    long add(long a, long b) {
    long x = a, y = b;
    return (x + y);
    }
    int main(int argc, char* argv[]) {
    long a = 1, b = 2;
    printf("%d\n", add(a, b));
    return 0;
    }
阅读全文 »

逆向工程核心原理第三章

准备阶段
  • 软件:Ollydbg,visual studio community

  • 使用visual studio创建一个名为LittleEndian的c++控制台项目,粘入以下代码,然后运行生成x86(Win32)的LittleEndian.exe文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "windows.h"

    BYTE b = 0x12;
    WORD w = 0x1234;
    DWORD dw = 0x12345678;
    char str[] = "abcde";
    int main()
    {
    byte lb = b;
    WORD lw = w;
    DWORD ldw = dw;
    char* lstr = str;
    return 0;
    }
阅读全文 »