前两天想搞出一个游戏的封包解密函数,又懒怕还原成高级语言 想直接调用他EXE内部的解密函数,
本来记得PEDIY的有篇文章是增加节来导出内部函数的,但是找不到那篇文章了;所以就开始自己尝试一下,现在以自己写的一个EXE为类型
先写一个EXE程序
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure DoPub;//内部函数 等待导出
begin
MessageBox(0, 'Test', 'Test', MB_OK);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBox(0, 'Test', 'Test', MB_OK);
end;
end.
上面编译成成 hook32.exe 名字为Hook没什么意思 只是个人习惯 跟钩子没关联 呵呵
然后用OD载入我们的程序 下段BP MessageBoxA 按 按钮运行 断下 执行到返回
00456498 >/$ 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0045649A |. 68 AC644500 PUSH hook32.004564AC ; |Title = "Test"
0045649F |. 68 AC644500 PUSH hook32.004564AC ; |Text = "Test"
004564A4 |. 6A 00 PUSH 0 ; |hOwner = NULL
004564A6 |. E8 A509FBFF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
004564AB \. C3 RETN
得知我们的内部函数地址为 00456498 这里我就偷懒啦 用LORDPE的文件计算器
计算 RVA=00056498
Offset=00055898
好了现在来修改导出表,再次偷懒 不加新节啦,WinHex打开文件 直接找个程序空白的地方
我在偏移64B90找到大片0字节区域 好就在这里开刀啦
这里我们先来熟悉一下导出表结构
Characteristics 4字节
TimeDateStamp 4字节
MajorVersion 2字节
MinorVersion 2字节
Name 4字节
Base 4字节
NumberOfFunctions 4字节 你要导出函数的个数
NumberOfNames 4字节 你要导出函数名称的个数
AddressOfFunctions 4字节 //函数地址
AddressOfNames 4字节 //函数名地址
AddressOfNameOrdinals 4字节 //函数名顺序地址
注意上面都是保存RVA的值哦 千万别搞错了
好了 让我们来根据上面结构来在偏移64B90 处构造导出表
我们的模块名字是 hook32.exe 到出名字就随便起个吧 我这里叫 _W
构建如下
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00064B90 00 00 00 00 00 00 00 00 00 00 00 00 C2 E7 06 00 ............络..
00064BA0 01 00 00 00 01 00 00 00 01 00 00 00 B8 E7 06 00 ............哥..
00064BB0 BC E7 06 00 C0 E7 06 00 98 64 05 00 CD E7 06 00 肩..犁....顽..
00064BC0 00 00 68 6F 6F 6B 33 32 2E 65 78 65 00 5F 57 00 ..hook32.exe._W.
也就是
->Export Table
Characteristics: 0x00000000
TimeDateStamp: 0x00000000 (GMT: Thu Jan 01 00:00:00 1970)
MajorVersion: 0x0000
MinorVersion: 0x0000 -> 0.00
Name: 0x0006E7C2 ("hook32.exe")
Base: 0x00000001
NumberOfFunctions: 0x00000001
NumberOfNames: 0x00000001
AddressOfFunctions: 0x0006E7B8
AddressOfNames: 0x0006E7BC
AddressOfNameOrdinals: 0x0006E7C0
Ordinal RVA Symbol Name
------- ---------- ----------------------------------
0x0001 0x00056498 "_W"
- 标 题:修改PE头 添加EXE导出表,强行导出EXE内部函数
- 作 者:bujin888
- 时 间:2008-06-22 02:51:54
- 链 接:http://bbs.pediy.com/showthread.php?t=67046