逆向学习--将messagebox添加到空白区

  1. MessageBox
  2. E8/E9公式
  3. 写入OEP的代码
  4. 找到文件中的MessageBox地址
  5. 找到我们写入代码的空白区
  6. 通过公式计算出最终写入的代码

好久没写blog了,但是一直有在学逆向,就是不晓得写什么,感觉很多都是很基础的东西,写的价值不大。

这里看着教程做了个小小的程序改动,这里自己也来尝试一下吧。

  • 前置知识:逆向、PE结构、进制
  • 实现目的:修改OEP(即程序的入口点),使得程序开始的时候先弹出一个MessageBox然后再运行

MessageBox

这个函数简单来说就是弹个小框框,里面的参数我们先不管

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


int main()
{
MessageBox(0, 0, 0, 0);
}

VS下进行编译,呼啦啦~

E8/E9公式

知道了作用之后,我们在MessageBox函数这里设置断点,来看反汇编代码

我这里把汇编代码整理一下更加清楚一点:

1
2
3
# 地址 #  #   硬编码   #    #                函数                #   #   跳转地址  #
00F71723 E8 E0 FA FF FF call @__CheckForDebuggerJustMyCode@4 (0F71208h)
00F71208 E9 63 05 00 00 jmp __CheckForDebuggerJustMyCode (0F71770h)

我们可以看出 call命令对应的硬编码为E8,jmp对应的硬编码为E9。那么硬编码后面的四位,和我们跳转的地址是 如何和进行转换的呢。

上公式:
真正要跳转的地址 = E8这条命令的下一行地址 + E8后面的四位

我们看上面的图可以带入公式里面验证一下

00F71208 = 00F71728 + FFFFFAE0

我们使用计算器计算,发现结论正确。

又∵ E8这条命令的下一行地址 = E8的地址 + 硬编码的长度

所以这条命令就可以变成:

真正要跳转的地址 = E8的地址 + 硬编码的长度 + E8后面的四位

写入OEP的代码

因为我们的程序最终是要用记事本的方式打开修改其中的十六进制数,所以我们不能直接写汇编代码进去的

从反汇编后的汇编代码我们可以看出,首先我们的代码做了4个push,也就是MessageBox这个函数传入的四个参数,我们这里由于全部都是0,所以我们对应push的值也是0
最终我们将会加入在OEP后面的十六进制为:

1
6A 00 6A 00 6A 00 6A 00 E8 .. .. .. .. E9 .. .. .. ..

找到文件中的MessageBox地址

我们的逻辑是这样的,开始运行之后首先跳转到MessageBox,然后jmp到开始的位置重新开始

这里我拿任意一个软件做例子,用OD打开,然后再右下角输入 bp MessageBoxA,点击菜单栏中的那个 B 按钮,我们就能发现MessageBox在这个程序中跳转的地址。

此处的程序为 75D90F40

找到我们写入代码的空白区

我这里打开的程序,这里用PETOOLS观察第一个节的相关数据

这个时候我们要写入的数据空白处开始的位置就是 十六进制的 002558D7 + 400

所以在这个计算后的位置我们开始写入上面的代码,如图,这里还有E8/E9后面的数没有写

通过公式计算出最终写入的代码

E8:255ce8
E9:255ced
E8下一行地址:
E9下一行地址:
MessageBox:75B50F40
ImageBase:00400000
OEP:002085D8

E8下一行地址相对PointerToRawData偏移量:0x255ce8+5-0x400=0x2558E8+5
映射到内存中,E8下一行地址:ImageBase+VirtualAddress + 0x2558E8+5= 6568E8
E8后面的值:MessageBox - 0x6568E8-5 = 0x754FA658 0x754FA653

计算E9后面的值:
原来OEP:ImageBase + AddressOfEntryPoint = 6085D8

文件中,E9下一行地址相对PointerToRawData偏移量:0x255ced-0x400=0x2558ed +5

映射到内存中,E9下一行地址:ImageBase + VirtualAddress + 0x2558ed =6568ed

E9后面的值:MessageBox - 6568ed = 754FA653 754FA64E

修改OEP:
文件中shellcode起始地址相对PointerToRawData偏移量:255ce0 - 400 = 2558E0
映射到内存中相对ImageBase偏移:VitualAddress + 2558E0 = 2568e0

编写就完事了


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sher10cksec@foxmail.com

文章标题:逆向学习--将messagebox添加到空白区

本文作者:sher10ck

发布时间:2020-03-21, 16:23:56

最后更新:2020-03-27, 11:04:09

原始链接:http://sherlocz.github.io/2020/03/21/逆向学习-将messagebox添加到空白区/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录