04.10.2010, 01:19
|
#29
|
Местный
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
|
Цитата:
Сообщение от ALF
PHP код:
library MyFirstDLL;
uses
SysUtils,
Classes,
Graphics,
Forms,
Windows;
const
adres = '?DrawString@FCanvasUtil@@QAEHHHPBGPAVUFont@@VFColor@@@Z';
adres1 = '??1FCanvasUtil@@UAE@XZ';
adres2 = '?Render@FPlayerSceneNode@@UAEXPAVFRenderInterface@@@Z';
text ='ALF';
procedure HelloWorld();
var
DLLInstance : THandle;
FCanvasUtilAddr,BOB: PByte;
font:string;
x,y:integer;
begin
{ загружаем DLL }
DLLInstance := LoadLibrary('Engine.dll');
BOB := GetProcAddress(DLLInstance, adres);
FCanvasUtilAddr := GetProcAddress(DLLInstance, adres1);
font :='Engine.DefaultFont'; {ХЗ КАКОЙ ШРИФТ ЮЗАЕТ ЛИНЕЙКА}
x:=200;
y:=200;
asm
push 00FF0000h {цвет}
push dword [font]{Шрифт, В ФОРМАТЕ UFont - я хз как}
push word [text] {Текст}
push y {у}
push x {х}
mov ecx, FCanvasUtilAddr
call [BOB] {вызываем FCanvasUtil :: DrawString(int x, int y, ushort const *, UFont *, FColor)}
end;
FreeLibrary(DLLInstance);
end;
procedure FLayerCanvasRender; cdecl;
asm
{перед вызовом FPlayerSceneNode :: Render рисуем текст}
call HelloWorld
retf 0DC24h
end;
procedure doDll();
var
DLLInstance : THandle;
PlayerScenAdr: PByte;
Offset: DWORD;
begin
{ загружаем DLL }
DLLInstance := LoadLibrary('Engine.dll');
{перехвачиваем FPlayerSceneNode::Render}
PlayerScenAdr := GetProcAddress(DLLInstance, adres2);
if VirtualProtectEx(GetCurrentProcess,PlayerScenAdr,10,PAGE_EXECUTE_READWRITE,Offset) then begin
PlayerScenAdr^ := $E9;
Offset := Dword(@FLayerCanvasRender)-DWord(PlayerScenAdr)-5;
move(Offset,Pointer(DWord(PlayerScenAdr)+1)^,sizeof(Offset));
end;
end;
exports
doDll;
begin
doDll();
end.
Вот мой код.
Осталось подправить аргумент шрифта)
UFont - хз как там
|
выложи скрин че там получилось)
|
|
|