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

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

VirtualProtect [D7]


Страницы:   1 2

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 вызывался из моего процесса. Так вот напрашивается вывод, что дллка загружается не в мой процесс.


Страницы:   1 2

Наверх

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