опять инжект

Тема в разделе "WASM.BEGINNERS", создана пользователем jaja, 12 авг 2008.

  1. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Добрый день, пытаюсь сделать инжект в notepad.exe
    Код (Text):
    1. typedef int ( WINAPI*tMessageBox)(HWND hWnd,char* lpText,char* lpCaption,UINT uType);
    2. struct ADDRS
    3. {
    4.     char * mod;
    5.     char * func;
    6.     char * txt;
    7. };
    8. #define CHADDR(type,x) ((##type)((DWORD)(x) + (DWORD)(hMem) - (DWORD)(hInst)))
    9. DWORD WINAPI Foo(ADDRS* s);
    10.  
    11. int APIENTRY _tWinMain(HINSTANCE hInstance,
    12.                      HINSTANCE hPrevInstance,
    13.                      LPTSTR    lpCmdLine,
    14.                      int       nCmdShow)
    15. {
    16.     ADDRS addrs;
    17.     char mod[] = "User32.dll";
    18.     char func[] = "MessageBoxA";
    19.     char txt[] = "HALO THAR";
    20.     HINSTANCE hInst = GetModuleHandle(NULL);
    21.     DWORD hSize = ((IMAGE_NT_HEADERS32*)((DWORD)((IMAGE_DOS_HEADER *)hInst)->e_lfanew+(DWORD)hInst))->OptionalHeader.SizeOfImage;
    22.     /*,,,*/
    23.     HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS,false,pentry32.th32ProcessID);
    24.     if(hProc==INVALID_HANDLE_VALUE)
    25.         MessageBox(NULL,L"Couldn't open process",L"Error",MB_OK);
    26.     LPVOID hMem = VirtualAllocEx(hProc,NULL,hSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    27.     if(!hMem)
    28.         MessageBox(NULL,L"Failed to allocate memory",L"FAIL",MB_OK);
    29.     DWORD dwBytes;
    30.     WriteProcessMemory(hProc,hMem,hInst,hSize,&dwBytes);
    31.     if(dwBytes!=hSize)
    32.         MessageBox(NULL,L"Failed to write to prcoess",L"Error",MB_OK);
    33.     DWORD pID;
    34.     addrs.func = CHADDR(char*,func);
    35.     addrs.mod = CHADDR(char*,mod);
    36.     addrs.txt = CHADDR(char*,txt);
    37.     HANDLE hRemoteThread=CreateRemoteThread(hProc,
    38.         NULL,
    39.         0,
    40.         (LPTHREAD_START_ROUTINE)((DWORD)hMem + (DWORD)Foo - (DWORD)hInst),
    41.         (LPVOID)((DWORD)hMem-(DWORD)hInst+(DWORD)&addrs),
    42.         NULL,
    43.         &pID);
    44.     //VirtualFreeEx(hProc,hMem,hSize,MEM_RELEASE);
    45.     return 0;
    46. }
    47.  
    48. DWORD WINAPI Foo(ADDRS* x)
    49. {
    50.    
    51.     HMODULE hMod = LoadLibraryA(x->mod);
    52.     tMessageBox pMessageBox = (tMessageBox)GetProcAddress(hMod,x->func);
    53.     return pMessageBox(NULL,x->txt,x->txt,MB_OK);  
    54. }
    Пытаюсь инжектить Foo. notepad.exe падает с access violation. Что я делаю не так? В процесс нормально пишется. В рассчетах адреса вроде бы не ошибся. в инжектируемой функции где-то ошибка значит. Может она это, не базонезависисмая?
    Заранее спасибо.
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    jaja
    Это просто ужос, а не инжект. Вам стоит ооочень подробно прочитать статьи. Внедрять весь свой образ - это... не знаю такого нехорошего слова, которое могло бы охарактеризовать Ваши действия. И откуда у Вас вообще может быть базонезависимость, если компилятор для вызова API (LoadLibraryA, GetProcAddress) посчитал одни смещения, а Вы пихаете их по совсем другим: у Вас же вся таблица импорта смещена.
     
  3. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    А есть книга какая-нибудь по этой теме? В рихтере про инжект длл только.
    Или статья хотя-бы, где бы описывались основные шаги. А то в асме пока что не силен.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    jaja
    http://www.wasm.ru/series.php?sid=14
    http://www.wasm.ru/series.php?sid=8
    http://www.wasm.ru/article.php?article=1021007
    http://www.wasm.ru/article.php?article=fwb
    http://www.wasm.ru/article.php?article=window_inject

    Хватит выше крыши. А начать лучше с первых двух ссылок.
     
  5. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    спасибо, буду разбираться.
     
  6. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Нифига не понятно :dntknw:

    http://www.wasm.ru/article.php?article=fwb
    Пример с Инжектим чистый код.

    InjectCode:
    call $+5
    pop esi
    sub esi, $-InjectCode-1
    Почему мы прыгаем на 5 байт вперед?
    И откуда эта магическая единица в последней строке?
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    jaja
    Размер инструкции call (относительный прямой вызов) - 5 байт. Поэтому call $+5 передаст управление на pop esi. А как Вы думаете, что окажется в стэке после call $+5? А $-InjectCode-1 - это расстояние от метки InjectCode до адреса pop esi, т.е. как раз 5 байт (длина call'а). А вообще я же сказал: читайте, начиная с первых ссылок. Если бы прочитали про дельта-смещение из первой главы "От зеленого к красному", было бы понятно.