Инжект функции

Тема в разделе "WASM.BEGINNERS", создана пользователем WIN32, 4 фев 2007.

  1. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Код (Text):
    1. #include <windows.h>
    2. #include <Tlhelp32.h>
    3.  
    4.  
    5. PVOID   InjectFunc(HANDLE ProcessHandle,PVOID RemoteFunc,DWORD RemoteFuncSize)
    6. {
    7.     PVOID   RemoteFuncAddr;
    8.     DWORD   Written;
    9.     RemoteFuncAddr = VirtualAllocEx(ProcessHandle, NULL, RemoteFuncSize, MEM_COMMIT, PAGE_READWRITE);
    10.     WriteProcessMemory(ProcessHandle, RemoteFuncAddr,RemoteFunc, RemoteFuncSize, &Written);
    11.     return RemoteFuncAddr;
    12. }
    13.  
    14. DWORD WINAPI RemoteWinMain(PVOID pvParam)
    15. {
    16.     MessageBox(0,"Injected !!","From Notepad.exe",0);
    17.     return 0;
    18. }
    19. DWORD RemoteWinMainEnd()
    20. {
    21.     return 0;
    22. }
    23.  
    24.  
    25. BOOL EnableDebugPrivilege()
    26. {
    27.     HANDLE hToken;
    28.     if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
    29.     {
    30.         TOKEN_PRIVILEGES tp;
    31.         tp.PrivilegeCount = 1;
    32.         if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid))
    33.             return false;
    34.         tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    35.         if(!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL))
    36.             return false;
    37.         CloseHandle(hToken);
    38.     }
    39.     return (GetLastError() == ERROR_SUCCESS);
    40. }
    41.  
    42.  
    43. int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR LpCmdLine,int nShowCmd)
    44. {
    45.     EnableDebugPrivilege();
    46.     HANDLE            hSnapshot;
    47.     PROCESSENTRY32    Entry;
    48.     HANDLE            PROCESS;
    49.     PVOID               RemFunc;
    50.     DWORD               ThreadID;
    51.     hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    52.     Entry.dwSize = sizeof(Entry);
    53.     Process32First(hSnapshot, &Entry);
    54.     do {
    55.         if (memcmp("notepad.exe",Entry.szExeFile,strlen("notepad.exe")) == 0)
    56.         {
    57.             PROCESS = OpenProcess(0x1F0FFF,true,Entry.th32ProcessID);
    58.             RemFunc = InjectFunc(PROCESS,RemoteWinMain,DWORD(&RemoteWinMain)-DWORD(RemoteWinMainEnd));
    59.             CreateRemoteThread(PROCESS,NULL,0,(LPTHREAD_START_ROUTINE)RemFunc,NULL,0,&ThreadID);
    60.         }
    61.     } while (Process32Next(hSnapshot, &Entry ) );
    62.     return 0;
    63. }
    процесс Notepad.exe падает :dntknw: тыкните где у меня проблема уже замучался.
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. RemoteWinMain,DWORD(&RemoteWinMain)-DWORD(RemoteWinMainEnd));
    можт
    Код (Text):
    1. &RemoteWinMain,DWORD(&RemoteWinMainEnd)-DWORD(&RemoteWinMain)
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    WIN32
    + к FreeManCPM
    Например, не помешает указать в вызове VirtualAllocEx в последнем параметре PAGE_EXECUTE_READWRITE, ты же собираешься выполнять код.
    Как, по-твоему, организован вызов функций из системных dll’ек в notepad.execall на jmp user32.MessageBox или непосредственно в коде call user32.MessageBox, и так же ли организован вызов во внедряемом коде?
    Где, по-твоему, располагаются строчки "Injected !!" и "From Notepad.exe", и что будет находиться по адресам этих строк, полученным в качестве параметров notepad.exe.RemoteWinMain в адресном пространстве notepad.exe?

    Резюме - детский сад.
     
  4. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    FreeManCPM да точно , всё равно падает Notepad.exe при вызове CreateRemoteThread
     
  5. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    q_q Резюме - детский сад. спасибо.
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    WIN32
    ?
     
  7. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    q_q если честно я ничего не понял из того что ты сказал, свои недочёты с выделением памяти исправил, но так и не понял почему не работает код :dntknw: если не трудно на пальцах распишите.
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    инжектируемый код должен быть базонезависем.
     
  9. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    FreeManCPM где про это почитать можно, или хотябы приведи пример пожалуйста как сделать мою функцию RemoteWinMain базонезависимой.
     
  10. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    прочитай это
    http://www.wasm.ru/article.php?article=green2red01
    и это
    http://www.wasm.ru/article.php?article=green2red03
     
  11. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    asd
    спс
     
  12. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> инжектируемый код должен быть базонезависем.
    ога, и мало того, в инжектируемой ф-ции используются константы, которые находятся в секции данных, а ты ведь только код инжектируешь...

    WIN32
    врядли подобная ф-ция будет работать когда-нибуть, поэтому не парься и инжекти свой бинарник целиком по его базовому адрессу (или по любому, если обратывать фиксапы)
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    FreeManCPM
    Для массивов и функций & можно не указывать.
     
  14. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    в который раз убеждаюсь что асм проще :)
     
  15. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Код (Text):
    1. static DWORD WINAPI __stdcall RemoteMain( LPVOID lpParam )
    2. {
    3.     char    a[]="333aaaaaaaaZZ";
    4.     return 0;
    5. }
    6. static BOOL InjectThisExe(HANDLE Process,DWORD (WINAPI *EntryPoint)(LPVOID),DWORD dwFuncSize)
    7. {
    8.     LPVOID      lpRemoteFuncAddr = NULL;
    9.     BOOL        ret = false;
    10.     lpRemoteFuncAddr    = VirtualAllocEx(Process,NULL,dwFuncSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    11.  
    12.     DWORD       dwWritten = NULL;
    13.     ret                 = WriteProcessMemory(Process,lpRemoteFuncAddr,EntryPoint,dwFuncSize,&dwWritten);
    14.     return ret;
    15. }
    Вот, открываю процесс с правами 0x1F0FFF
    Код (Text):
    1. PROCESS = OpenProcess(0x1F0FFF,false,Entry.th32ProcessID);
    2. InjectThisExe(PROCESS,RemoteMain,DWORD(RemoteMainEnd)-DWORD(RemoteMain));
    так вот потом олькой подрубаюсь к процессу и ищю :
    char a[]="333aaaaaaaaZZ";
    но ничего похожего в памяти нет, что за байда ? хотя WriteProcessMemory возвращяет true;
    что не так делаю ?