Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка записи при попытке установки хука


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)

уверен, что память выделена под структуру и выделена правильно?


Наверх

Титульная страница Поиск, карта сайта Написать письмо