如何跳转到与程序相关的新空内存以在那里编写另一个代码?

逆向工程 拆卸 记忆
2021-07-09 02:12:10

我有一行类似 ex: 的代码MOV EAX, 100,我想写一个更大的代码而不是那个代码,但我不能,所以我想写一个跳转指令 ex:jmp 0x123456跳转到另一个与我的程序相关的空内存在那里编写新代码。

我如何知道/保留与我的程序相关的空内存来编写新代码?

1个回答

熟悉二进制格式 两种主要格式是
PE 或 COFF for Windows
ELF for Linux

名为 .xyz 的 Windows PE 部分可能具有以下属性

SECTION HEADER #1
    .xyz name
      15 virtual size
    1000 virtual address (00401000 to 00401014)
     200 size of raw data
     200 file pointer to raw data (00000200 to 000003FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         Execute Read

节通常在物理二进制文件中的 0x200 字节上
对齐 当您执行二进制文件时,Windows 加载程序通常将节映射为 0x1000 对齐

这个空间

( sizeof(RawData) - sizeof(VirtualSize) )
( sizeof(PageSize) - sizeof(VirtualSize) )

本质上可用于操纵

在上面的部分标题中,您可以拥有物理和永久可修改空间

:\>python -c print(hex(0x200-0x15))
0x1eb 

或暂时可修改的空间

:\>python -c print(hex(0x1000-0x15))
0xfeb

就像确认一样,您可以从
位于物理文件中 0x200 的.xyz 部分转储 50 个字节,
注意在 0x15 的 VirtualSize 之后,它填充了 0x00(NULLS)到 0x400(文件对齐大小)

:\>xxd -s 0x200 -l 0x50 -g 0x16 winmsgbox.exe
00000200: 558bec6a006a006a006a00ff15002040  U..j.j.j.j.... @
00000210: 005dc210000000000000000000000000  .]..............
00000220: 00000000000000000000000000000000  ................
00000230: 00000000000000000000000000000000  ................
00000240: 00000000000000000000000000000000  ................

0x215 to 0x3ff is free in the section shown above 


:\>xxd -s 0x3f0 -l 0x20 -g 0x16 winmsgbox.exe
000003f0: 00000000000000000000000000000000  ................
00000400: fc200000000000000000000000000000  . ..............

由于此部分已经是一个可执行部分,因此您可以在此部分中添加代码并执行它,而无需担心系统强制执行的页面保护限制。

您可以使用十六进制编辑器对二进制文件进行物理修改,最多 0x1eb 字节,

可以在内存中修补最多 0xfeb 字节

下面的示例代码是一个简单的 MessageBox,没有使用 vs 2017 作为 x86(32 位)编译的消息或标题,其中部分标题显示在上面

:\>ls -lg
total 2
-rw-r--r-- 1 197121 130 Jun 20 19:51 complink.bat
-rw-r--r-- 1 197121 215 Jun 20 20:08 winmsgbox.cpp

:\>type winmsgbox.cpp
#include <windows.h>
#pragma comment(lib, "user32.lib")
#pragma code_seg(".xyz")
int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR, _In_ int)
{
    return MessageBoxW(NULL, NULL, NULL, NULL);
}


:\>type complink.bat
del *.exe
cl /W4 /analyze:autolog- /Od /nologo /GS- %1.cpp /link /release /ENTRY:WinMain /SUBSYSTEM:Windows /FIXED
del *.obj

执行时消息框将显示系统默认字符串“错误”的标题

如下

在此处输入图片说明

想办法把标题改成“成功”

一种可能的方法是使用所需的信息重新编译它,撕下字节粘贴并调整另一种可能的方法是对字符串进行十六进制编辑,计算偏移量和绕行

还有其他方法吗?