używam następujący kod:
procedure PatchCode(Address: Pointer; const NewCode; Size: Integer);
var
OldProtect: DWORD;
begin
if VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, OldProtect) then
begin
Move(NewCode, Address^, Size);
FlushInstructionCache(GetCurrentProcess, Address, Size);
VirtualProtect(Address, Size, OldProtect, @OldProtect);
end;
end;
type
PInstruction = ^TInstruction;
TInstruction = packed record
Opcode: Byte;
Offset: Integer;
end;
procedure RedirectProcedure(OldAddress, NewAddress: Pointer);
var
NewCode: TInstruction;
begin
NewCode.Opcode := $E9;//jump relative
NewCode.Offset := NativeInt(NewAddress)-NativeInt(OldAddress)-SizeOf(NewCode);
PatchCode(OldAddress, NewCode, SizeOf(NewCode));
end;
by wdrożyć swój hak/patch/objazd przez wywołanie RedirectProcedure
:
RedirectProcedure(@LoadResourceModule, @MyLoadResourceModule);
to będzie pracować dla 32 bitowego kodu. Będzie również działać pod kodem 64-bitowym, pod warunkiem, że zarówno stare, jak i nowe funkcje znajdują się w tym samym module wykonywalnym. W przeciwnym razie odległość skoku może przekraczać zakres 32-bitowej liczby całkowitej.
Byłbym bardzo zainteresowany, gdyby ktoś mógł zapewnić alternatywę, która działałaby na 64-bitową przestrzeń adresową, niezależnie od tego, jak daleko od siebie znajdowały się te dwa adresy.
To się nazywa 'detour' sprawdzić to pytanie [Jak zmienić realizacji (objazdu) zewnętrznie zadeklarowanej funkcji] (http://stackoverflow.com/questions/6905287/ jak-zmienić-implementację-objazdu-z-zewnętrznie-zadeklarowanej-funkcji) – RRUZ
Po prostu myślałem o tym samym dzisiaj - więc użycie tej techniki pozwoliłoby np. na dodanie kodu w strumieniu komponentu (z DFM do zastosowania) mechanizmu? Tak więc, na przykład, mogę mieć centralne miejsce do rejestrowania używanych klas komponentów lub do zapewnienia jakości ("nie stosuj klas BDE!" Lub starej wersji komponentu X!)? – mjn
@mjn Istnieją inne punkty rozszerzenia, które umożliwiają łatwiejsze wykonanie. Na przykład 'TReader.OnFindComponentClass'. Kod paskowy powinien być zawsze ostatecznością, kiedy nic innego nie może wykonać zadania. –