Inject в процесс

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

  1. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Вопрос почему когда удалённый тред стартует, по адресу 004014F0 (адрес RemoteMain) ничего нету ? :dntknw:
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #include <tlhelp32.h>
    4. #include "f.h"
    5. static DWORD WINAPI __stdcall RemoteMain( LPVOID lpParam )
    6. {
    7.     return 0;
    8. }
    9. static DWORD WINAPI __stdcall RemoteMainEnd( LPVOID lpParam )
    10. {
    11.     return 0;
    12. }
    13.  
    14.  
    15. /*
    16.     Функция внедрение процесса в процесс :)
    17.     Внедрение образа текущего процесса в чужое адресное пространство.
    18.     EntryPoint - адрес точки входа внедренного кода.
    19. */
    20. static BOOL InjectThisExe(HANDLE Process,DWORD (WINAPI *EntryPoint)(LPVOID))
    21. {
    22.     DWORD   dwModuleSize    = NULL,
    23.             dwThisModule    = NULL;
    24.     LPVOID  dwNewModule     = NULL;
    25.  
    26.     DWORD   dwWritten       = NULL,
    27.             dwThreadId      = NULL,
    28.             dwFuncSize      = NULL;
    29.     char    szTemp[1024];
    30.     bool    ret             = false;
    31.     HANDLE  hRemThread;
    32.     dwFuncSize = DWORD(&RemoteMainEnd)-DWORD(&RemoteMain);
    33.     dwThisModule    = (DWORD)GetModuleHandle(NULL);
    34.     dwModuleSize    = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE *)(dwThisModule) + ( ( PIMAGE_DOS_HEADER )( dwThisModule ) ) -> e_lfanew + sizeof( DWORD ) +sizeof( IMAGE_FILE_HEADER ) ) ) ) -> SizeOfImage;
    35.     dwNewModule     = VirtualAllocEx(Process,NULL,dwFuncSize,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN ,PAGE_EXECUTE_READWRITE);
    36.    
    37.     ret = WriteProcessMemory(Process,dwNewModule,EntryPoint, DWORD(&RemoteMainEnd)-DWORD(&RemoteMain), &dwWritten);
    38.  
    39.     hRemThread = CreateRemoteThread(Process,NULL,0,EntryPoint,NULL,0,&dwThreadId);
    40.     return ret;
    41. }
    42.  
    43.  
    44. int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    45. {
    46.     EnableDebugPrivilege();
    47.     HANDLE              hSnapshot;
    48.     PROCESSENTRY32      Entry;
    49.     HANDLE              PROCESS;
    50.     char                szTemp[1024];
    51.     hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    52.     Entry.dwSize = sizeof(Entry);
    53.     Process32First(hSnapshot, &Entry);
    54.  
    55.     do  // Список процессов
    56.     {
    57.         if (memcmp("notepad.exe",Entry.szExeFile,11) == 0)
    58.         {
    59.             PROCESS = OpenProcess(0x1F0FFF,false,Entry.th32ProcessID);
    60.             InjectThisExe(PROCESS,RemoteMain);
    61.            
    62.         }
    63.     } while (Process32Next(hSnapshot, &Entry ) );
    64.  
    65.     return 0;
    66. }
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Во-первых:
    dwNewModule = VirtualAllocEx(Process,NULL,dwFuncSize,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN ,PAGE_EXECUTE_READWRITE);
    выделит память начиная неизвестно с какого адреса. Нужно вместо NULL указывать нужный тебе адрес.
    Во-вторых, если ты вместо NULL поставишь конкретный адрес, и он окажется занятым, то функция вернёт ошибку.
    Поэтому нужно использовать связку VirtualAllocEx с указанным lpAddress и следом за ней VirtualProtectEx на случай, если эта память уже кому-то выделена. Скорее всего это придётся делать в цикле для каждой страницы, а то ни одна из них не сработает, наверное.
     
  3. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    я в длл делал так

    Код (Text):
    1. VirtualAllocEx(HPROCESS,nil,$1000,MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    и усё норм выделялось
     
  4. HoBleen

    HoBleen New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    77
    asd
    Но если код базонезависимый, то это как раз-таки самый лучший вариант.
     
  5. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    asd
    дык если адресс NULL, то система сама найдёт свободный кусок памяти нужного размера)
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Так мне показалось, что он внедряет текущий образ в адресное пространство другого процесса, и не похоже, что код базонезависим.
    А с базонезависимым кодом конечно да, проще 0 передавать.
     
  7. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    asd ты читал вообще код ?
    Код (Text):
    1. static DWORD WINAPI __stdcall RemoteMain( LPVOID lpParam )
    2. {
    3.     return 0;
    4. }
    чем тебе не базонезависем ?
    NULL система сама выбирает адрес +
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Читал. И вот это
    InjectThisExe(PROCESS,RemoteMain);

    с последующим вот этим
    CreateRemoteThread(Process,NULL,0,EntryPoint,NULL,0,&dwThreadId);
    никак на базонезависимость не тянет.

    Вариатнов 2 либо тот что тебе на краклабе сказали, либо мой, с выделением памяти, где нужно.
     
  9. ViCooper

    ViCooper Victor

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    26
    Зачем WINAPI __stdcall масло масленное, достаточно ченть одного...
     
  10. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Код (Text):
    1. hRemThread = CreateRemoteThread(Process,NULL,0,(LPTHREAD_START_ROUTINE)dwNewModule,NULL,0,&dwThreadId);
    Тема закрыта :)