Проблемка с перехватом епилога функции

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 21 сен 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Нужно сделать перехват CreateProcessA. внутри приложения, но нужно перехватить именно возвращаемый результат.
    Сделал так :
    1. загрузил k32(копия kernel32).
    2. получил в ней адрес CreateProcessA
    3. поставил jmp в CreateProcessA на :
    Код (Text):
    1.         mov ebx,[esp]    ; регистр не изменяется, сохраняем адрес возврата
    2.         call GetEIP
    3.         add eax,12
    4.         mov [esp],eax   ;подделываем адрес возврата на push ebx
    5.         jmp [OriginCreateProcess] ; k32->CreateProcessA
    6.         push ebx
    7.         push eax
    8.         call Test
    9.                pop eax
    10.         ret 0
    4. делаю вызов k32->CreateProcessA
    5. смотрю нужные мне данные возвращаю управление вызывающему коду.

    Самое интересное что внутри k32->CreateInternalProcessA получает точно такие же параметры как и kernel32->CreateInternalProcessA и завершаются обе функ. успешно(возвращают 1 а также заполняют структуру PROCESS_INFORMATION).
    Но если делать вызов через мой хук приложение(calc.exe) не запускается.


    Код (Text):
    1. LPVOID OriginCreateProcess = 0;
    2.  
    3.  
    4. void __stdcall Test()
    5. {
    6.     MessageBox(0,TEXT("HookProc"),TEXT(""),0);
    7. };
    8.  
    9. VOID __declspec(naked)GetEIP(){
    10.     __asm{
    11.         mov eax,[esp]
    12.         ret 0
    13.     };
    14. };
    15. VOID __declspec(naked)HookCreateProcess(){
    16.     __asm
    17.     {
    18.                 mov ebx,[esp]    ; регистр не изменяется, сохраняем адрес возврата
    19.         call GetEIP
    20.         add eax,12
    21.         mov [esp],eax   ;подделываем адрес возврата на push ebx
    22.         jmp [OriginCreateProcess] ; k32->CreateProcessA
    23.         push ebx
    24.         push eax
    25.         call Test
    26.                pop eax
    27.         ret 0
    28.     };
    29. };
    30. LPVOID SetHook(DWORD start,DWORD address)
    31. {
    32.  
    33.     DWORD old;
    34.     VirtualProtect((LPVOID)start,16,PAGE_EXECUTE_READWRITE,&old);
    35.     __try{
    36.         LPVOID proc = (LPVOID)((DWORD)&HookCreateProcess - (DWORD)start-5);
    37.          *(PBYTE)(start) = 0xe9;
    38.          CopyMemory((PBYTE)(start)+1,&proc,4);
    39.     }
    40.     __finally
    41.     {
    42.         VirtualProtect((LPVOID)start,16,old,&old);
    43.         return NULL;
    44.     };
    45. };
    46. int _tmain(int argc, _TCHAR* argv[])
    47. {
    48.     WCHAR Dir[MAX_PATH],Dir1[MAX_PATH];
    49.     GetSystemDirectory(Dir,sizeof(Dir));
    50.     GetSystemDirectory(Dir1,sizeof(Dir1));
    51.     wcscat(Dir,TEXT("\\kernel32.dll"));
    52.     wcscat(Dir1,TEXT("\\k32.dll"));
    53.     CopyFile(Dir,Dir1,FALSE);
    54.     OriginCreateProcess=GetProcAddress(LoadLibrary(Dir1),"CreateProcessA");
    55.     MoveFileEx(Dir1,NULL,MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING);
    56.  
    57.     HMODULE hKernell32 = GetModuleHandle(TEXT("kernel32.dll"));
    58.     LPVOID pCreateProccess = GetProcAddress(hKernell32,"CreateProcessA");
    59.     SetHook((DWORD)pCreateProccess,(DWORD)&HookCreateProcess);
    60.  
    61.  
    62.     STARTUPINFOA info={0};
    63.     PROCESS_INFORMATION proc={0};
    64.     info.cb  = sizeof(info);
    65.     CHAR dir[MAX_PATH];
    66.  
    67.     CHAR BUF[4] = {'c',':','\\',0};
    68.     GetSystemDirectoryA(dir,sizeof(dir));
    69.     strcat(dir,"\\calc.exe");
    70.     CreateProcessA(dir,"",NULL,NULL,FALSE,0,NULL,"C:\\",&info,&proc);
    71.     WaitForSingleObject(proc.hProcess,INFINITE);
    72.  
    73.     return 0;
    74. }
    Интересно что я сделал не так.
     
  2. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Все таки странно даже если убрать хук и попытаться запустить процесс через k32->CreateProcessA то calc не запускается.
    ОС WinXP sp2.
     
  3. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    XshStasX подменяй адрес возврата из CreateProcess
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Rustem
    не понял, я это и так делаю.
    Код (Text):
    1.  mov ebx,[esp]    ; регистр не изменяется, сохраняем адрес возврата
    2.         call GetEIP
    3.         add eax,12
    4.         mov [esp],eax   ;подделываем адрес возврата на push ebx
    5.         jmp [OriginCreateProcess] ; k32->CreateProcessA
    6.         push ebx
    7.         push eax
    8.         call Test
    9.                pop eax
    10.         ret 0
    Только что провел такой опыт в ollydbg

    Когда идет вызов
    call kernel32.CreateProcessA
    ставил такой вызов
    call k32.CreateProcessA
    в таком случаи возвращаемый результат говорил что все хорошо, а на сам дело все плохо калькулятор не запустился.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Для этих тупых патчей отведён топик. Ёпта ну сколько можно повторять.
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    ошибся топиком если вопрос очень принципиален переносите его)
    Clerk
    а по теме можешь сказать что?
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Он по теме уже много чего сказал.
    https://wasm.ru/forum/viewtopic.php?id=38110
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >>Для этих тупых патчей отведён топик. Ёпта ну сколько можно повторять.
    С одной стороны верно, программер должен почитать мануал и понять че ему надо ща накодить и как это решается. Но с другой стороны, на кой икс нужен форум? Смысл форума в чем? Может имеет смысл пополнять статьи на васме, а форум нахрен отключить?
    Это я к тому, что современный васм это или ацки сложные темы, т.е. не для ньюба или флейм! Второе-то понятно, что нафиг не надо форуму, но вот для притока ньюбов, а все когда-то ими были, имеет смысл больше пинать в прочтение "Как задавать вопрос?", а не зарубать на корню тему нафиг ) Другими словами, надо дать челу шанс еще раз подумать, промотивировать его на тщательное обдумывание своего вопроса.

    ЗЫ:
    2 Aquila: может действительно имеет смысл форум отрубить напрочь? Все равно чуть ли не каждый ответ в теме посылание в чтение статей, а не ответы.
     
  9. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    может имеет смысл удалять тупые посты? ( особенно из хипа, там их немеренно развелось ) или это затруднительно?

    и разрешить постить во всех разделах кроме для начинаюсчих - после годичного стажа
     
  10. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    только, пажалста - "ефрейтор дзена" ... не надо
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    EvilsInterrupt
    В обсуждении не стандартных проблем и идей, на которые нет ответа. Патчи рассмотрены вдоль и поперёк, так зачем есчо и есчо одно и тоже повторять. Если человек к примеру спрашивает почему не работает атрибут PAGE_EXECUTE это нормально. Если он спрашивает как изменять атрибуты памяти - накол его, так как даже не соизволил использовать поиск или в маны заглянуть. Както так.
     
  12. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    всем спасибо вопрос исчерпан, была ошибка в патче.
     
  13. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ClerkЭто форум. Челавек имеет проблему- спрашивает, что сложного дать ответ. Вы умный чилавек, поему вас так напрягает помогать новочкам или тем кто не дошел до вашего уровня в асме и ядре, поверьте программирование этим не заканчивается, и многие умнее вас в немного других областях, но так сложилось что многим этот форум стал родным из за статей , участников, времени прибывания, разве сложно переосилить себя и помочь а не шпынять сразу/
    Я понимаю что без основ WIN32 не придти в кернел мод, НО ЭТО ФОРУМ прстите повторюсь, и суть его в помощи тем кто не может справиться и даже если это очевидно ответить намного эффективнеее чем написать ищите статьи на сайте и читайте гугл
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    punxer
    Так вы тоже поиск не используете. Вы уже задолбали своим NtUserSendInput. Вам уже про него стопяцот раз обьяснили. Вас напрягает использовать поиск, открыть сурцы или отладчик ?
    Так зачем мне это за вас делать.
     
  15. fadday

    fadday New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2009
    Сообщения:
    63
    вот странность..возник вопрос у человека и нет чтоб самостоятельно найти на него ответ и получить глубочайшее удовлетворение, он пишет пост типа "ты напиши мне тут пример или найди мне ссылку"..форум форумом, но ёпт..
     
  16. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Clerk
    Так не выходит ничего ни с сервисом ни с API. Ну нивкакую.
    И по сути проблемы на форуме нет ничего(