![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка записи при попытке установки хука
MALAN © (2009-03-01 11:41:00)Попробовал я перехватывать 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-04 00:36:00) [1]> [5] MALAN © (03.03.09 22:24)
все таки советую не заниматься такими вещицами как хуки, программируя наугад. тут услышал, там сокпипастил.
не плохо бы разобраться во всем досконально. в этом поможет дядя Рихтер. если нужны примеры на делфи, то читай Тейксейру с Пачеко "Руководство разработчика Делфи".
MALAN (2009-03-03 23:42:00) [2]Прошу прощения, вопрос снимается, путь к библиотеке не был указан.
MALAN (2009-03-03 22:24:00) [3]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'.
Вообщем что я упускаю и как это исправить?
Eraser (2009-03-01 16:44:00) [4]вот еще http://www.wasm.ru/author.php?author=Ms-Rem
там все на Делфи.
Игорь Шевченко (2009-03-01 16:39:00) [5]http://rsdn.ru/article/baseserv/apispy.xml
http://rsdn.ru/article/baseserv/apicallsintercepting.xml
http://rsdn.ru/article/baseserv/IntercetionAPI.xml
MALAN (2009-03-01 15:27:00) [6]нет, не уверен, а как надо правильно выделять память(кстати, RestoreDATA^ указывает на перехватываемую функцию)? Просто в статье про это ни слова.
Eraser (2009-03-01 14:54:00) [7]> [0] MALAN © (01.03.09 11:41)
уверен, что память выделена под структуру и выделена правильно?