advApiHook.c

Тема в разделе "WASM.WIN32", создана пользователем supersonic777, 23 авг 2006.

  1. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    Такой вопрос - кто юзал это произведение Мс-Рема под С++ ?
     
  2. d4rkeagle

    d4rkeagle Алексей Шпунсель

    Публикаций:
    0
    Регистрация:
    3 мар 2006
    Сообщения:
    66
    Адрес:
    Тайланд
    а в чем собственно проблема?
     
  3. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    Хм...а проблема вот в чем...Там юзается LDasm.c(h), при компиляции VC++ ругается что unexpected end of file в LDasm.c, также там юзается ntddk.h хотя я глянув код не нашел ничего того что берется из этого хидера. Это раз, отказавшись от LDasm.c(h) и advApiHook.c(h) я поместил весь код находящийся в этих файлах в свой основной проект файл plugin.cpp (Это к слову сказать dll-ка) все скомпилилось без проблем, но при внедрении этой dll в таргет - процесс, тот при вызове перехватываемой АПИ накрылся (
     
  4. d4rkeagle

    d4rkeagle Алексей Шпунсель

    Публикаций:
    0
    Регистрация:
    3 мар 2006
    Сообщения:
    66
    Адрес:
    Тайланд
    http://unl0ck.net/releases/IATr00t.rar попробуй это. может поможет.
     
  5. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    Мне способ патчинга IAT не очень то и подходит, т.к. интересующие меня функ-и вызываются через LoadLibrary/GetProcAddress, при чем не самим интересующим меня процессом а одной из dll-к который этот процес подключает. Способ Мс-Рем'а это как раз то что нужно, но блин в VС++ не компилячится зараза
     
  6. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    Блин неужели никто не юзал advApiHook.c ?
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Блин, да нафиг она нужна. Своё и так работает.
     
  8. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    Ок что бы не поднимать новую тему скажите такую вещь
    В общем хочу получить указатель на PIMAGE_NT_HEADERS
    Делаю так:

    Код (Text):
    1. #include "stdafx.h"
    2. #include "imagehlp.h"
    3. #include "TLHELP32.H"
    4.  
    5. void ReplaceIAT(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller)
    6. {
    7.     ULONG ulSize;
    8.     PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hmodCaller;
    9.     if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) return;
    10.     PIMAGE_NT_HEADERS pNTHeaders = (PIMAGE_NT_HEADERS)(void *)(hmodCaller + pDosHeader->e_lfanew);
    11.     if (pNTHeaders->Signature != IMAGE_NT_SIGNATURE) return;
    12.     MessageBox(0,"TEST","TEST",0); !!!!!!!!!!!!! ВОТ ТУТ ПРЕД. IF СРАБАТЫВАЕТ И ПРОИСХОДИТ ВЫХОД ИЗ ПРОЦЕДУРЫ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    13.     PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(hmodCaller, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
    14.     if (pImportDesc == NULL)
    15.         return;
    16.     for (; pImportDesc->Name; pImportDesc++)
    17.     {
    18.         PSTR pszModName = (PSTR) ((PBYTE) hmodCaller + pImportDesc->Name);
    19.         if (lstrcmpiA(pszModName, pszCalleeModName) == 0) break;
    20.     }
    21.     if (pImportDesc->Name == 0) return;
    22.     PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ((PBYTE) hmodCaller + pImportDesc->FirstThunk);
    23.     for (; pThunk->u1.Function; pThunk++)
    24.     {
    25.         PROC* ppfn = (PROC*) &pThunk->u1.Function;
    26.         BOOL fFound = (*ppfn == pfnCurrent);
    27.         if (fFound)
    28.         {
    29.             DWORD dwOrgProtect, wr;
    30.             VirtualProtect( ppfn, sizeof(pfnNew), PAGE_READWRITE, &dwOrgProtect );
    31.             WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), &wr );
    32.             VirtualProtect( ppfn, sizeof(pfnNew), dwOrgProtect , &dwOrgProtect );
    33.             return;
    34.         }
    35.     }
    36. }
    37.  
    38.  
    39. void ReplaceIATEntryInAllMods(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew)
    40. {
    41.     HANDLE m_Snap = INVALID_HANDLE_VALUE;
    42.     MODULEENTRY32 me = { sizeof(me) };
    43.     m_Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,GetCurrentProcessId());
    44.     if (m_Snap == INVALID_HANDLE_VALUE)
    45.         return;
    46.     if (!Module32First(m_Snap, &me))
    47.         return;
    48.     do {
    49.         ReplaceIAT(pszCalleeModName, pfnCurrent, pfnNew, me.hModule);
    50.     } while (Module32Next(m_Snap, &me));
    51.     return;
    52. }
    53.  
    54.  
    55.  
    56. HMODULE WINAPI xLoadLibraryA(PCSTR a)
    57. {
    58.     HMODULE ret = LoadLibraryA(a);
    59.     MessageBox(0,a,"xLoadLibraryA",0);
    60.     return ret;
    61. }
    62.  
    63. BOOL APIENTRY DllMain( HANDLE hModule,
    64.                        DWORD  ul_reason_for_call,
    65.                        LPVOID lpReserved
    66.                      )
    67. {
    68.     if(ul_reason_for_call == DLL_PROCESS_ATTACH)
    69.     {
    70. ReplaceIATEntryInAllMods("kernel32.dll", GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"), (PROC)xLoadLibraryA);
    71.     }
    72.     return TRUE;
    73. }
    По ходу получается что я неправильно получаю этот
    PIMAGE_NT_HEADERS pNTHeaders = (PIMAGE_NT_HEADERS)(void *)(hmodCaller + pDosHeader->e_lfanew);

    Пробовал по разному
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    supersonic777
    Даже код скопировать не могут нормально..
    Код (Text):
    1. void CDirector::ReplaceIATEntryInOneMod(PCSTR pszCalleeModName,
    2.    PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller, PCSTR pszFuncName)
    3. {  
    4.    if (
    5.         (!IsModuleNeeded()) ||
    6.         (bModulePathOnly && (!IsModuleNeeded(hmodCaller) && (!IsModuleNeeded(hmodCaller, "OLEAUT32.dll"))))
    7.    ) return;
    8. //
    9.    ULONG ulSize;
    10.    PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
    11.        (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hmodCaller, TRUE,
    12.        IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
    13.    if (pImportDesc == NULL) return;  
    14.  
    15. //
    16.    for (; pImportDesc->Name; pImportDesc++)
    17.    {
    18.        PSTR pszModName = (PSTR)((PBYTE) hmodCaller + pImportDesc->Name);
    19.        if (lstrcmpiA(pszModName, pszCalleeModName) == 0)
    20.        {
    21.            if (pImportDesc->Name == 0) return;  
    22.  
    23.            PIMAGE_THUNK_DATA pThunk =
    24.                (PIMAGE_THUNK_DATA)((PBYTE) hmodCaller + pImportDesc->FirstThunk);
    25.  
    26.            for (; pThunk->u1.Function; pThunk++)
    27.            {
    28.                PROC* ppfn = (PROC*) &pThunk->u1.Function;
    29.                BOOL fFound = (*ppfn == pfnCurrent);    
    30.                if (!fFound && (*ppfn > sm_pvMaxAppAddr))
    31.                {
    32.                    PBYTE pbInFunc = (PBYTE) *ppfn;
    33.                    if (pbInFunc[0] == cPushOpCode)
    34.                    {
    35.                        ppfn = (PROC*) &pbInFunc[1];
    36.                        fFound = (*ppfn == pfnCurrent);
    37.                    }
    38.                }
    39.  
    40.                if (fFound)
    41.                {
    42.                    DWORD dwDummy;
    43.                    VirtualProtect(ppfn, sizeof(ppfn), PAGE_EXECUTE_READWRITE, &dwDummy);
    44.                    WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew,
    45.                        sizeof(pfnNew), NULL);
    46.                    VirtualProtect(ppfn, sizeof(ppfn), dwDummy , &dwDummy);
    47.                    return;
    48.                }
    49.            }
    50.        }
    51.    }
    52. }
     
  10. николай gorl

    николай gorl New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2006
    Сообщения:
    4
    мда, там какая-то очень древняя версия моего userland-стелса
    вообще жесть...
    да ее еще кто-то и модифицировал... вот уж не знал что этим можно пользоваться

    supersonic777: юзай просто детоурс, вполне нормальная библиотечка
     
  11. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    николай gorl
    почитай про dark eagle'a in da defaced :lol:
     
  12. николай gorl

    николай gorl New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2006
    Сообщения:
    4
    да я уже в Хакере начитался )
     
  13. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    2 николай gorl хочу тоже почитать про dark eagle'a in da defaced
     
  14. d4rkeagle

    d4rkeagle Алексей Шпунсель

    Публикаций:
    0
    Регистрация:
    3 мар 2006
    Сообщения:
    66
    Адрес:
    Тайланд
    2 supersonic777: http://www.web-hack.ru/e-zine/defaced/
     
  15. d4rkeagle

    d4rkeagle Алексей Шпунсель

    Публикаций:
    0
    Регистрация:
    3 мар 2006
    Сообщения:
    66
    Адрес:
    Тайланд
    николай gorl: юзается там между прочим не твоя реализация стелс =)) ты ее кинул в массы просто запостив статью в хакере. но написана она не тобой... (большинство кода ты брал из статей во фраке, типа руткита ntillusion и иже подобных + код Рихтера). копи+пастил одним словом.
    а вообще руткит там засунут чисто для демонстрации библиотеки win32toolkit, большую часть которой продокументировал sh0k из w00w00.
     
  16. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    Господа вот такой вот еще квещенс --

    В интересующем меня app интересующие меня API юзаются через LoadLibrary/GetProcAddress, при чем те API что я хочу перехватить вызываются не из самого кода моего таргет-APP, а одной из DLL которая в свою очередь импорттирует другую, то есть картина такая:
    TargetProcess -> DLL1 -> DLL2 -> (LoadLibrary/GetProcAddress)TargetApi

    Делаю я так: внедряю свою DLL в TargetProcess, она патчит IAT моего TargetProcess'а, на предмет вызовов (LoadLibrary/GetProcAddress), потом переберает все загруженые модули в TargetProcess и соответсвенно патчит IAT каждого найденного модуля, затем при срабатывании хука на LoadLibrary я снова перебераю все модули и снова ставлю перехваты в IAT на (LoadLibrary/GetProcAddress), ну а в самом HOOK_GetProcAddress я делаю сравнение того адреса что вернул TRUE_GetProcAddress с адресами интересующих меня API(их я получаю еще до установки всех хуков в IAT) и обнаружилась такая загадочная вещь как:
    На компе дома все работает ОК, все адреса внутри HOOK_GetProcAddress удачно сравниваются и заменяются моими хуками, а на компе на работе 3 функ. просто не находятся внутри HOOK_GetProcAddress , 2 есть, а 3х других нет.

    Код (Text):
    1. FARPROC __stdcall HOOK_GetProcAddress(HMODULE hModule,LPCSTR lpProcName)
    2. {
    3. FARPROC ret = TRUE_GetProcAddress(hModule, lpProcName);
    4.  
    5. if (MY_ADDR1  == TRUE_GetProcAddress(hMod, "MY_API1_NAME"))
    6. {
    7. MessageBox(0,"ADDR1","INTERCEPTED");
    8. return (FARPROC)HOOK_ADDR1;
    9. }
    10.  
    11. if (MY_ADDR2  == TRUE_GetProcAddress(hMod, "MY_API2_NAME"))
    12. {
    13. MessageBox(0,"ADDR2","INTERCEPTED");
    14. return (FARPROC)HOOK_ADDR2;
    15. }
    16. ..................................................И ТАК ДАЛЕЕ ЕЩЕ 3 API
    17. return ret;
    18. }
     
  17. николай gorl

    николай gorl New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2006
    Сообщения:
    4
    Адиль, не надо грязи. Собрал программу. Вышел стелс. А его у меня отняли. Сказали не я автор. Вот фигня (. Вот и делись с народом кодом.
    Хорошо, что у меня еще осталось. Много.
    На 10% всей сети хватит)

    А если серьезно - не лезь. Разбирай на кусочки свой код, и его пость, разъясняя что, как, почему и откуда, а в чужой огород не суйся. Мне как-то не очень приятно, когда мои программы так или иначе обижают. Это воспринимается как акт агрессии в моем направлении. А любая агрессия - это тупость. Не тупим. Код не копаем, к несоответствию венгерской нотации на десятитысячной строке руткита не придираемся.

    supersonic777: советую использовать тебе только сплайсинг. Берешь детоурс в аттаче (в этой версии все лишнее урезано, чтобы файл не разрастался).
    Потом юзаешь функцию DetourFunction в целевом процессе. Перехватываешь сразу ту функцию которую надо без промежуточных LoadLibrary/GetProcAddress. Если не уверен, что в момент выполнения твоего кода библиотека будет загружена (чтобы вставить там джампы), можешь сначала ее сам загрузить LoadLibrary(DLL3). Перехват через импорт очень ненадежен. Достаточно попортить хидеры сразу после загрузки файла чтобы он обломался. Да просто обнулить OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress и все.
     
  18. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    николай gorl а где аттач ?