0%

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

基址重定位表

  • 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;
    }
阅读全文 »

逆向工程核心原理第二章

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

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

    1
    2
    3
    4
    5
    6
    7
    #include <windows.h>
    #include <tchar.h>

    int _tmain(int argc, TCHAR* argv[]) {
    MessageBox(NULL, L"HelloWorld", L"blog.iz4.cc", MB_OK);
    return 0;
    }
  • 《逆向工程核心原理》作者提供的资源下载github仓库:https://github.com/reversecore/book.git;书中用到的代码和可执行文件都能在里面获取

阅读全文 »

前言

  • 最近尝试给谷歌nexus 5编译HavocOS (android 11分支),折腾一大堆后终于生成了zip刷机包,结果死活刷不进去,卡在"E1001: Failed to update system image",原因推测是:system分区太小,因为编译时报错提示system镜像过小,所以在编译配置文件中BoardConfig.mk调整过system分区的大小,修改后才编译打包成功。
  • 显然只改BoardConfig.mk,只是能正常编译打包,但是手机(物理)上的system分区还是那么大,太大刷不进去
  • 为了验证是否是system分区太小缘故,因为编译还生成了system.img的中间文件,这个img是可以用fastboot刷入的,手机usb连接到电脑,进入bootloader模式,运行fastboot system system.img,不出意外失败了,而且报错信息为:"remote: 'size too large'",这就验证了是手机/system分区不够大的原因。所以问题就变为了怎么扩增system分区?
  • 经过网上查找相关教程,最终按这个问题里的答案:https://android.stackexchange.com/questions/216123/android-how-to-increase-system-partition-and-decrease-data-partition尝试成功

准备阶段

阅读全文 »