Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизОшибка записи при попытке установки хука Найти похожие ветки
← →
MALAN © (2009-03-01 11:41) [0]Попробовал я перехватывать API функции как расписано в этой статье: http://www.codenet.ru/progr/delphi/stat/api-hook.php?rss=1
но при попытке установить хук, в модуле APIHookTools в функции SetCodeHook при выполнении операций заполнения структуры RestoreDATA^ начинают вылетать сообщения об ошибках записи.
Стурктура RestroreDATA^:
type
PFunctionRestoreData = ^ TFunctionRestoreData;
TFunctionRestoreData = packed record
Address:Pointer;
val1:Byte;
val2:DWORD;
end;
Ошибки появляются при выполнении этих операторов:
...
RestoreDATA^.val1:= Byte(ProcAddress^);
RestoreDATA^.val2:= DWORD(Pointer(DWORD(ProcAddress)+1)^);
RestoreDATA^.Address:=ProcAddress;
....
Кто-нибудь знает как это лечится?
← →
Eraser © (2009-03-01 14:54) [1]> [0] MALAN © (01.03.09 11:41)
уверен, что память выделена под структуру и выделена правильно?
← →
MALAN © (2009-03-01 15:27) [2]нет, не уверен, а как надо правильно выделять память(кстати, RestoreDATA^ указывает на перехватываемую функцию)? Просто в статье про это ни слова.
← →
Игорь Шевченко © (2009-03-01 16:39) [3]http://rsdn.ru/article/baseserv/apispy.xml
http://rsdn.ru/article/baseserv/apicallsintercepting.xml
http://rsdn.ru/article/baseserv/IntercetionAPI.xml
← →
Eraser © (2009-03-01 16:44) [4]вот еще http://www.wasm.ru/author.php?author=Ms-Rem
там все на Делфи.
← →
MALAN © (2009-03-03 22:24) [5]Eraser © (01.03.09 14:54) [1]
>уверен, что память выделена под структуру и выделена правильно?
Спасибо, ты был прав не хватало простой команды New(RestDATA);
ну DLL"ку реализующую перехват вроде написал осталось внедрить в чужой процесс и тут о5 возникла проблема. Внедрение происходит при помощи функции:
function LoadLibrary_Ex(ProcessID:DWORD;LibName:PChar):boolean;
var
pLL,pDLLPath:Pointer;
hProcess,hThr:THandle;
LibPathLen,_WR,ThrID:DWORD;
begin
Result:=False;
LibPathLen:=Length(string(LibName));
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
if hProcess=0 then exit;
pDLLPath:=VirtualAllocEx(hProcess,0,LibPathLen+1,MEM_COMMIT,PAGE_READWRITE);
if DWORD(pDLLPath)=0 then exit;
pLL:=GetProcAddress(GetModuleHandle(kernel32),"LoadLibraryA");
WriteProcessMemory(hProcess,pDLLPath,LibName,LibPathLen+1,_WR);
hThr:=CreateRemoteThread(hProcess,0,0,pLL,pDLLPath,0,ThrID);
if hThr=0 then exit;
Result:=CloseHandle(hProcess);
end;
При попытке внедрения в чужой процесс функция работает без ошибок, но эффекта нет. Функция работает как надо только если внедряет библиотеку в свой собственный процесс.
Поясню: допустим есть два процесса pr1.exe, pr2.exe и библиотека lib1.dll которая при внедрении должна выдать сообщение, типа, "Hello World".
если процесс pr1.exe попытается внедрить lib1.dll в pr2.exe, то ничего не происходит, если же он пытается внедрить его в самого себя, то библиотека успешно грузится и выдаёт сообщение "Hello World".
Вообщем что я упускаю и как это исправить?
← →
MALAN © (2009-03-03 23:42) [6]Прошу прощения, вопрос снимается, путь к библиотеке не был указан.
← →
Eraser © (2009-03-04 00:36) [7]> [5] MALAN © (03.03.09 22:24)
все таки советую не заниматься такими вещицами как хуки, программируя наугад. тут услышал, там сокпипастил.
не плохо бы разобраться во всем досконально. в этом поможет дядя Рихтер. если нужны примеры на делфи, то читай Тейксейру с Пачеко "Руководство разработчика Делфи".
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.063 c