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

Вниз

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

 
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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.049 c
3-1238738221
Cabyrc
2009-04-03 09:57
2010.08.27
ConnectionString для FoxPro


2-1272870252
Виктор
2010-05-03 11:04
2010.08.27
could not find program


15-1270719800
oxothuk
2010-04-08 13:43
2010.08.27
COM порт


15-1269250635
Delphist2
2010-03-22 12:37
2010.08.27
уменьшение размера exe


15-1264580056
12
2010-01-27 11:14
2010.08.27
А кто-то во что-то играет?Интересуют неглупые стрелялки от 1 лица