#1
得分:5
回复于:
2010-07-06 23:12:07
以下代码来自看雪论坛
[code]
前两天想搞出一个游戏的封包解密函数,又懒怕还原成高级语言 想直接调用他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 ; \MessageBoxA
004564AB \. C3 RETN
得知我们的内部函数地址为 00456498 这里我就偷懒啦 用LORDPE的文件计算器
计算 RVA=00056498
Offset=00055898
好了现在来修改导出表,再次偷懒 不加新节啦,WinHex打开文件 直接找个程序空白的地方