|
Программинг Форум для тем связанных с программированием |
04.10.2010, 01:15
|
#1
|
Пользователь
Регистрация: 18.09.2010
Адрес: Киев
Сообщений: 70
Сказал Спасибо: 9
Имеет 10 спасибок в 6 сообщенях
|
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 - хз как там
__________________
Все относительно...
Последний раз редактировалось ALF, 04.10.2010 в 01:18.
|
|
|
04.10.2010, 01:19
|
#2
|
Местный
Регистрация: 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 - хз как там
|
выложи скрин че там получилось)
|
|
|
За это сообщение mira нажился спасибкой от:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:00.
|
|