Нужно сделать перехват CreateProcessA. внутри приложения, но нужно перехватить именно возвращаемый результат. Сделал так : 1. загрузил k32(копия kernel32). 2. получил в ней адрес CreateProcessA 3. поставил jmp в CreateProcessA на : Код (Text): mov ebx,[esp] ; регистр не изменяется, сохраняем адрес возврата call GetEIP add eax,12 mov [esp],eax ;подделываем адрес возврата на push ebx jmp [OriginCreateProcess] ; k32->CreateProcessA push ebx push eax call Test pop eax ret 0 4. делаю вызов k32->CreateProcessA 5. смотрю нужные мне данные возвращаю управление вызывающему коду. Самое интересное что внутри k32->CreateInternalProcessA получает точно такие же параметры как и kernel32->CreateInternalProcessA и завершаются обе функ. успешно(возвращают 1 а также заполняют структуру PROCESS_INFORMATION). Но если делать вызов через мой хук приложение(calc.exe) не запускается. Код (Text): LPVOID OriginCreateProcess = 0; void __stdcall Test() { MessageBox(0,TEXT("HookProc"),TEXT(""),0); }; VOID __declspec(naked)GetEIP(){ __asm{ mov eax,[esp] ret 0 }; }; VOID __declspec(naked)HookCreateProcess(){ __asm { mov ebx,[esp] ; регистр не изменяется, сохраняем адрес возврата call GetEIP add eax,12 mov [esp],eax ;подделываем адрес возврата на push ebx jmp [OriginCreateProcess] ; k32->CreateProcessA push ebx push eax call Test pop eax ret 0 }; }; LPVOID SetHook(DWORD start,DWORD address) { DWORD old; VirtualProtect((LPVOID)start,16,PAGE_EXECUTE_READWRITE,&old); __try{ LPVOID proc = (LPVOID)((DWORD)&HookCreateProcess - (DWORD)start-5); *(PBYTE)(start) = 0xe9; CopyMemory((PBYTE)(start)+1,&proc,4); } __finally { VirtualProtect((LPVOID)start,16,old,&old); return NULL; }; }; int _tmain(int argc, _TCHAR* argv[]) { WCHAR Dir[MAX_PATH],Dir1[MAX_PATH]; GetSystemDirectory(Dir,sizeof(Dir)); GetSystemDirectory(Dir1,sizeof(Dir1)); wcscat(Dir,TEXT("\\kernel32.dll")); wcscat(Dir1,TEXT("\\k32.dll")); CopyFile(Dir,Dir1,FALSE); OriginCreateProcess=GetProcAddress(LoadLibrary(Dir1),"CreateProcessA"); MoveFileEx(Dir1,NULL,MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING); HMODULE hKernell32 = GetModuleHandle(TEXT("kernel32.dll")); LPVOID pCreateProccess = GetProcAddress(hKernell32,"CreateProcessA"); SetHook((DWORD)pCreateProccess,(DWORD)&HookCreateProcess); STARTUPINFOA info={0}; PROCESS_INFORMATION proc={0}; info.cb = sizeof(info); CHAR dir[MAX_PATH]; CHAR BUF[4] = {'c',':','\\',0}; GetSystemDirectoryA(dir,sizeof(dir)); strcat(dir,"\\calc.exe"); CreateProcessA(dir,"",NULL,NULL,FALSE,0,NULL,"C:\\",&info,&proc); WaitForSingleObject(proc.hProcess,INFINITE); return 0; } Интересно что я сделал не так.
Все таки странно даже если убрать хук и попытаться запустить процесс через k32->CreateProcessA то calc не запускается. ОС WinXP sp2.
Rustem не понял, я это и так делаю. Код (Text): mov ebx,[esp] ; регистр не изменяется, сохраняем адрес возврата call GetEIP add eax,12 mov [esp],eax ;подделываем адрес возврата на push ebx jmp [OriginCreateProcess] ; k32->CreateProcessA push ebx push eax call Test pop eax ret 0 Только что провел такой опыт в ollydbg Когда идет вызов call kernel32.CreateProcessA ставил такой вызов call k32.CreateProcessA в таком случаи возвращаемый результат говорил что все хорошо, а на сам дело все плохо калькулятор не запустился.
>>Для этих тупых патчей отведён топик. Ёпта ну сколько можно повторять. С одной стороны верно, программер должен почитать мануал и понять че ему надо ща накодить и как это решается. Но с другой стороны, на кой икс нужен форум? Смысл форума в чем? Может имеет смысл пополнять статьи на васме, а форум нахрен отключить? Это я к тому, что современный васм это или ацки сложные темы, т.е. не для ньюба или флейм! Второе-то понятно, что нафиг не надо форуму, но вот для притока ньюбов, а все когда-то ими были, имеет смысл больше пинать в прочтение "Как задавать вопрос?", а не зарубать на корню тему нафиг ) Другими словами, надо дать челу шанс еще раз подумать, промотивировать его на тщательное обдумывание своего вопроса. ЗЫ: 2 Aquila: может действительно имеет смысл форум отрубить напрочь? Все равно чуть ли не каждый ответ в теме посылание в чтение статей, а не ответы.
может имеет смысл удалять тупые посты? ( особенно из хипа, там их немеренно развелось ) или это затруднительно? и разрешить постить во всех разделах кроме для начинаюсчих - после годичного стажа
EvilsInterrupt В обсуждении не стандартных проблем и идей, на которые нет ответа. Патчи рассмотрены вдоль и поперёк, так зачем есчо и есчо одно и тоже повторять. Если человек к примеру спрашивает почему не работает атрибут PAGE_EXECUTE это нормально. Если он спрашивает как изменять атрибуты памяти - накол его, так как даже не соизволил использовать поиск или в маны заглянуть. Както так.
ClerkЭто форум. Челавек имеет проблему- спрашивает, что сложного дать ответ. Вы умный чилавек, поему вас так напрягает помогать новочкам или тем кто не дошел до вашего уровня в асме и ядре, поверьте программирование этим не заканчивается, и многие умнее вас в немного других областях, но так сложилось что многим этот форум стал родным из за статей , участников, времени прибывания, разве сложно переосилить себя и помочь а не шпынять сразу/ Я понимаю что без основ WIN32 не придти в кернел мод, НО ЭТО ФОРУМ прстите повторюсь, и суть его в помощи тем кто не может справиться и даже если это очевидно ответить намного эффективнеее чем написать ищите статьи на сайте и читайте гугл
punxer Так вы тоже поиск не используете. Вы уже задолбали своим NtUserSendInput. Вам уже про него стопяцот раз обьяснили. Вас напрягает использовать поиск, открыть сурцы или отладчик ? Так зачем мне это за вас делать.
вот странность..возник вопрос у человека и нет чтоб самостоятельно найти на него ответ и получить глубочайшее удовлетворение, он пишет пост типа "ты напиши мне тут пример или найди мне ссылку"..форум форумом, но ёпт..
Clerk Так не выходит ничего ни с сервисом ни с API. Ну нивкакую. И по сути проблемы на форуме нет ничего(