Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.26;
Скачать: CL | DM;

Вниз

Перехват API   Найти похожие ветки 

 
Иван   (2002-08-09 13:42) [0]

Я нашел статью http://delphi.mastak.ru/articles/Dapi/index.html посвященную перехвату, но исходник там неполный, а при попытке зайти на сайт автора оказывается, что он продается.
У кого-нибудь есть полный исходник ? Киньте на мыло,please!
Или ссылки на подобную тему (только для Delphi, а не для Си)


 
Ученик   (2002-08-09 14:02) [1]

Для своего приложения.

program Project2;

uses
SysUtils, Windows;

type
TImageImportDescriptor = packed record
OriginalFirstThunk : DWORD;
TimeDateStamp : DWORD;
ForwarderChain : DWORD;
Name : DWORD;
FirstThunk : DWORD;
end;
PImageImportDescriptor = ^TImageImportDescriptor;

TImageThunkData32 = packed record
_function : PDWORD;
end;
PImageThunkData = ^TImageThunkData32;

type
PPointer = ^Pointer;

function InterceptDllCall(
hLocalModule : HMODULE;
c_szDllName : PChar;
c_szApiName : PChar;
pApiNew : Pointer;
p_pApiOrg : PPointer;
pApiToChange : Pointer) : Bool;
var
pDOSHeader : PImageDosHeader;
pNTHeader : PImageNtHeaders;
pImportDesc : PImageImportDescriptor;
dwProtect : DWORD;
bSuccess : BOOL;
pThunk : PImageThunkData;
dwNewProtect : DWORD;
dwAddressToIntercept : DWORD;
begin
Result := False;
pDOSHeader := PImageDosHeader(hLocalModule);
bSuccess := FALSE;

if (pApiToChange <> nil) then
dwAddressToIntercept := DWORD(pApiToChange)
else
dwAddressToIntercept := DWORD(GetProcAddress(GetModuleHandle(c_szDllName), c_szApiName));

if IsBadReadPtr(Pointer(hLocalModule), sizeof(TImageNtHeaders)) then
Exit;
if (pDOSHeader^.e_magic <> IMAGE_DOS_SIGNATURE) then
Exit;
pNTHeader := PImageNtHeaders(DWORD(pDOSHeader) + DWORD(pDOSHeader^._lfanew));
if pNTHeader^.Signature <> IMAGE_NT_SIGNATURE then
Exit;

pImportDesc := PImageImportDescriptor(DWORD(hLocalModule) +
DWORD(pNTHeader^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));

if DWORD(pImportDesc) = DWORD(pNTHeader) then
Exit;

while (pImportDesc^.Name <> 0) do begin
pThunk := PImageThunkData(DWORD(hLocalModule) + DWORD(pImportDesc^.FirstThunk));
while (pThunk^._function <> nil) do begin
if (DWORD(pThunk^._function) = dwAddressToIntercept) then begin
if not IsBadWritePtr(@pThunk^._function, sizeof(DWORD)) then begin
if (p_pApiOrg <> nil) then
p_pApiOrg^ := pThunk^._function;
pThunk^._function := pApiNew;
bSuccess := TRUE;
end else begin
if VirtualProtect(@pThunk^._function, sizeof(DWORD),
PAGE_EXECUTE_READWRITE, dwProtect) then begin
if (p_pApiOrg <> nil) then
p_pApiOrg^ := pThunk^._function;
pThunk^._function := pApiNew;
bSuccess := TRUE;
dwNewProtect := dwProtect;
VirtualProtect(@pThunk^._function, sizeof(DWORD), dwNewProtect, dwProtect)
end
end;
end;
Inc(PChar(pThunk), SizeOf(TImageThunkData32));
end;
Inc(PChar(pImportDesc), SizeOf(TImageImportDescriptor));
end;
Result := bSuccess;
end;

type
TMessageBox = function (Wnd : HWND;
lpText : PChar;
lpCaption : PChar;
uType : UINT) : Integer; stdcall;

var
p_fnMessageBoxOrg : Pointer = nil;

function MyMessageBox(Wnd : HWND;
lpText : PChar;
lpCaption : PChar;
uType : UINT) : Integer; stdcall;
begin
if (p_fnMessageBoxOrg = nil) then
Result := 0
else
Result := TMessageBox(p_fnMessageBoxOrg)(Wnd, lpCaption, lpText, uType)
end;

var
c_szTitle : PChar;
uStyle : UINT;
begin
c_szTitle := "Перехват функций API";
uStyle := MB_OK or MB_ICONHAND or MB_SYSTEMMODAL;
MessageBox(0, "Нормальный текст", c_szTitle, uStyle);
InterceptDllCall(hInstance, "user32.dll", "MessageBoxA",
@MyMessageBox, @p_fnMessageBoxOrg, nil);
MessageBox(0, "Текст и заголовок поменялись", c_szTitle, uStyle);
InterceptDllCall(hInstance, "user32.dll", "MessageBoxA",
p_fnMessageBoxOrg, nil, @MyMessageBox);
MessageBox(0, "Снова нормальный текст", c_szTitle, uStyle);
end.



Страницы: 1 вся ветка

Текущий архив: 2002.09.26;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.006 c
14-85683
zxas
2002-09-01 20:39
2002.09.26
Документация по ADO


3-85375
Шурик Ш
2002-09-05 11:28
2002.09.26
Редактирование DBGrid


3-85395
BJValentine
2002-09-05 13:45
2002.09.26
Журнал транзакций


4-85735
CASU
2002-08-07 15:36
2002.09.26
НУЖНА ИКОНКА ИЗ ОКНА


3-85391
Таня
2002-09-05 12:35
2002.09.26
построители отчётов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский