![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
VirtualProtect [D7]
Rem © (2004-10-07 12:27:00)Добрый день, мастера! Начну с главного, мне необходимо перехватить winapi'шную функцию CreateFile из одной другой проги, послать эту же функцию, но с другими параметрами из своей, получить результат и вернуть его той другой проге. Я знаю, что надо использовать функцию VirtualProtect, но я не знаю как, в MSDN практически ниче не описано по этому поводу, помогите мне плз решить эту проблему.
Rem (2004-10-12 15:07:00) [1]Господа, большое спасибо всем за помощь, у меня все получилось!!!
Rem (2004-10-12 14:44:00) [2]У меня ошибка вываливается в процедуре LockLoader, все таки не понятно, откуда взята функция RtlEnterCriticalSection.
Rem (2004-10-12 14:25:00) [3]но, если Rtl убрать, а оставить все остальное, то получается winайпишная функция
Суслик (2004-10-12 14:07:00) [4]
> [33] Rem (12.10.04 13:13)
действительно нет.
Это 1%, когда поиск не помогает :(
Rem (2004-10-12 13:13:00) [5]
> прежде чем справшивать сделай сквозной поиск по исходникам
Если б нашел, не спрашивал бы...
Суслик (2004-10-12 11:56:00) [6]
> откуда он их взял
прежде чем справшивать сделай сквозной поиск по исходникам, поставляемым с дельфи.
в 99% случаев помогает.
Rem (2004-10-12 11:43:00) [7]Да, я понимаю, извиняюсь если что не так, у Digitman есть функция RtlEnterCriticalSection и RtlLeaveCriticalSection, откуда он их взял, компилятор на них ругается?
Erik1 (2004-10-12 10:49:00) [8]Ты вобще понимаеш, что твоя функция неможет работать? Если будеш продолжать в такомже духе тебе просто перестанут отвечать. Ты посмотри как осуцествляется перехват у Digitman. Он тут давал пример как это надо делать. Пользуйся поисковиками! Вобщето есть очень простое решение, надо сделать path который будет изменять dll в памяти и менять имя создоваемого файла. Для этого есть спецальные программы по созданию таких пачей.
Или изучи перехват API функций.
Юра (2004-10-12 10:48:00) [9]Хмм. рановато ты за это дело взялся, имхо. Поучи матчасть сначала, хотя бы того же Рихтера.
Rem (2004-10-12 10:30:00) [10]Вообщем, я пробую отслеживать изменения файловой системы при создании файла, вот код, кот. это делает:
procedure ChangeFileSystem;
var ChangeHandle : THandle;
begin
ChangeHandle:= FindFirstChangeNotification(FileName,false, FILE_NOTIFY_CHANGE_FILE_NAME);
if ChangeHandle <> INVALID_HANDLE_VALUE then
while true do
begin
if WaitForSingleObject(ChangeHandle,500) = WAIT_OBJECT_0 then
begin
//Событие...
end;
FindNextChangeNotification(ChangeHandle);
end;
end;
И вот где написано событие, что должно быть? Я определил, что я вызываю функцию создания файла и вызвается эта процедура, но файл еще не создан, т.е. фактическим можно перехватить событие создания файла. А какое событие создания файла?
Rem (2004-10-12 09:04:00) [11]А если попробовать другой путь, не перехват функций, а, например, можно ли удалить файл средствами winapi, если он создан другим процессом с монопольным доступом?
Rem (2004-10-12 08:30:00) [12]Я пробовал отлавливать в explorer.exe, но не отлавливается, функцию InterceptDllCall я запихивал в дллку, а в своей проге писал все остальное, плюс еще следующую функцию:
//Процедура подключения дллки к процессу
//pID - идентификатор процесса
//LibName - подключаемая библиотека
procedure AttachDllToProcess(pID: integer; LibName: string);
var ThreadID : Cardinal;
ThreadHndl : THandle;
AllocBuffer : Pointer;
BytesWritten : Cardinal;
ProcAddr : Pointer;
ExitCode : Cardinal;
hProcess : integer;
begin
hProcess:=OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE, false, pID);
if (hProcess=0) then Exit;
AllocBuffer:=VirtualAllocEx(hProcess, nil, length(LibName)+1, MEM_COMMIT, PAGE_READWRITE);
if (AllocBuffer<>nil) then WriteProcessMemory(hProcess, AllocBuffer, PChar(LibName), length(LibName)+1, BytesWritten)
else Exit;
ProcAddr:=GetProcAddress(LoadLibrary(PChar('Kernel32.dll')), PChar('LoadLibraryA'));
ThreadHndl:=CreateRemoteThread(hProcess, nil, 0, ProcAddr, AllocBuffer, 0, ThreadID);
WaitForSingleObject(ThreadHndl, INFINITE);
GetExitCodeThread(ThreadHndl, ExitCode);
CloseHandle(ThreadHndl);
VirtualFreeEx(hProcess, AllocBuffer, 0, MEM_RELEASE);
CloseHandle(hProcess);
end;
//Функция ищет процесс, к кот. надо подключиться и
//вызывает функцию подключения дллки к найденному процессу
function PrepareToAttachToDLL(PathToDll : PAnsiChar):boolean;
var
hSnapshoot: THandle;
pe32: TProcessEntry32;
PathToDLL : PAnsiChar;
hndDLLHandle : THandle;
begin
Result:=false;
//Получаем PID процесса эксплорера
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshoot = -1) then Exit;
pe32.dwSize := SizeOf(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) then
repeat
//Пробовал подключать дллку ко всем порцессам,
//закомментировав строку ниже, т.е.
//if pe32.szExeFile='explorer.exe' then
if pe32.szExeFile='explorer.exe' then
begin
//Здесь именно подключаем дллку к найденному процессу
AttachDllToProcess(pe32.th32ProcessID,PathToIntrcptDll);
hndDLLHandle:=LoadLibraryA(PathToDll);
if hndDLLHandle<>0 then
begin
@InterceptDllCall:=GetProcAddress(hndDLLHandle,'InterceptDllCall');
if Addr(InterceptDllCall)<>nil then
InterceptDllCall(pe32.th32ProcessID{HInstance},'Kernel32.dll','CreateFileA', Pointer(@MapRuleCreateFile),PPointer(@OldCreateProc),nil);
end;
CloseHandle(hSnapshoot);
Result:=true;
exit;
end;
until not Process32Next(hSnapshoot, pe32);
CloseHandle (hSnapshoot);
end;
//Переписываем тогда процедуру Start
procedure Start;
var PTH : PAnsiChar;
begin
CreateFile(PAnsiChar('c:\Before.TMP'),1,2,nil,2,4,0);
GetMem(PTH,sizeof('C:\MyLib.dll'))
PTH:='C:\MyLib.dll';
PrepareToAttachToDLL(PTH);
InterceptDllCall(hInstance,'Kernel32.dll','CreateFileA', Pointer(@MapRuleCreateFile),PPointer(@OldCreateProc),nil);
{Здесь через интерфейс вызываем функцию из дллки, в которой (дллке) должна вызываться функция CreateFile, но ничего не работает}
end;
Erik1 (2004-10-11 13:49:00) [13]В коде у тебя точно ошибка, точнее весь код ошибка. Как я понял ты пытаешся отловить вызов API в своем процессе, а тебе нужно в чужом! Думаю, что это explorer.exe
Rem (2004-10-11 12:28:00) [14]
> Может проще залезть в Dll и изменить ей имя файла?
Нет, это не проще т.к. это грубый хак, мне этого нельзя делать, я не для себя пишу, а по поводу всех активных процессов, я пробовал, но также не хочет отлавливать, может у меня ошибка в коде, посмотрите плз, но я пробовал на функции MessageBox - все работает нормально.
Erik1 (2004-10-11 11:41:00) [15]А может тебе перехватить все вызовы CreateFile, во всех активных процесах? Кроме своего конечно. И если вызов происходит с именем нужного тебе файла то подменяй его. Скорее всего тебе придется перехватить еще ReadFile и WriteFile. Но все это муторно и непонятно. Может проще залезть в Dll и изменить ей имя файла?
Rem (2004-10-11 11:13:00) [16]Господа, ну промогите мне плз, я в тупике... Может есть другой выход, мне надо сделать так, чтоб не создавался файл с указанным именем или хотя бы удалить его после создания, но удалить его просто нельзя, т.к. он создан не мной и с монопольным доступом.
Rem (2004-10-09 01:31:00) [17]Вообщем, есть актив икс дллка, в ней описан класс, в этом классе есть метод, этот метод вызывает функцию CreateFile. Мне именно надо перехватить вызов этой функции в этом методе. Имя метода я знаю. Объект этого класса я использую у себя в программе. Явной загрузки дллки, т.е. через LoadLibrary, у меня не было, я получаю доступ к методам через интерфейс.
> ты хоть определись, в каком тек.процессе происходит перехват
> ...
И вот тут вопрос, как я могу определиться в каком тек. процессе идет перехват, если я не знаю в каком процессе загружена актив икс дллка. Если в моем, тогда почему не перехватывается функцию вышеописанным кодом?
Rem (2004-10-09 01:22:00) [18]вот я не могу определить в каком процессе загружена актив икс дллка, чтобы произвести перехват. Я перехватываю в своем процессе, ты утверждаешь, что актив икс дллка загружается в мой процесс, тогда почему не перехватывается функцию вышеописанным кодом?
Digitman (2004-10-08 15:47:00) [19]ты хоть определись, в каком тек.процессе происходит перехват ...
на то есть ф-ции GetCurrentThreadId и MaunThreadId
Rem (2004-10-08 15:40:00) [20]Вообщем, не получается перехватить функцию CreateFile, т.е. через интерфейс вызывается метод класса, он в свою очередь вызывает CreateFile, и, вот используя вышеописанный код, мне не удается перехватить вызов CreateFile. Если вы утверждаете, что дллка находится в моем процессе, то функция CreateFile должна перехватываться. Этотим кодом я пробовал перехватывать сообщение MessageBox, все замечательно перехватывался, но MessageBox вызывался из моего процесса. Так вот напрашивается вывод, что дллка загружается не в мой процесс.