Проблема Inject(Первод исходника ms-rem на С++)(Api Hooking-2)

Тема в разделе "LANGS.C", создана пользователем mark4545, 16 сен 2007.

  1. mark4545

    mark4545 New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    14
    Почитал статейку решил переписать сорец на С++ инжет не проходи в чем проблема никак не могу понять
    Код (Text):
    1. #define nil NULL
    2. LPVOID InjectMemory(HANDLE Process,LPVOID Memory,DWORD Size);
    3. DWORD WINAPI RemoteThread(LPVOID RemoteInfo);
    4. void RemoteThreadEnd();
    5. typedef int(*MsgBox)(HWND,LPCSTR,LPCSTR,UINT);
    6. typedef void(*ExTh)(int);
    7. typedef HMODULE(*LoadLib)(LPCTSTR);
    8. typedef FARPROC(*GetProc)(HMODULE,LPCSTR);
    9. struct TRemoteInfo
    10. {
    11. /*
    12.   type
    13.   TRemoteInfo = record
    14.     LoadLibrary: function(lpLibFileName: PChar): HMODULE; stdcall;
    15.     GetProcAddress: function(hModule: HMODULE;
    16.                              lpProcName: LPCSTR): FARPROC; stdcall;
    17.     Kernel32    : array[0..16] of Char;
    18.     User32      : array[0..16] of Char;
    19.     MessageBoxA : array[0..16] of Char;
    20.     nExitThread : array[0..16] of Char;
    21.     Text        : array[0..16] of Char;
    22.     Title       : array[0..16] of Char;
    23.   end;
    24.   */
    25.   char Kernel32[16];
    26.   char User32[16];
    27.   char MessageBoxA[16];
    28.   char nExitThread[16];
    29.   char Text[16];
    30.   char Title[16];
    31.   LoadLib l;
    32.   GetProc g;
    33. };
    34. int main()
    35. {
    36.    
    37.   //var
    38.   TRemoteInfo RemoteInfo;
    39.   LPVOID pInfo, CodeAdr;
    40.   DWORD TID;
    41.   HANDLE Process;
    42.   STARTUPINFO StartInfo;
    43.   PROCESS_INFORMATION ProcInfo;
    44.   //begin
    45.   //Запускаем процесс
    46.   ZeroMemory(&StartInfo, sizeof(STARTUPINFO));
    47.   StartInfo.cb= sizeof(STARTUPINFO);
    48.   CreateProcess(nil, "notepad.exe", nil, nil, false, 0,
    49.                 nil, nil, &StartInfo, &ProcInfo);
    50.   Process = ProcInfo.hProcess;
    51.   //Заполняем структуру передаваемую внедряемому коду
    52.   lstrcpy(RemoteInfo.User32, "user32.dll");
    53.   lstrcpy(RemoteInfo.Kernel32, "kernel32.dll");
    54.   lstrcpy(RemoteInfo.MessageBoxA, "MessageBoxA");
    55.   lstrcpy(RemoteInfo.nExitThread, "ExitThread");
    56.   lstrcpy(RemoteInfo.Text, "Hello World!");
    57.   lstrcpy(RemoteInfo.Title, "Injected MessageBox");
    58.   //получаем адреса используемых API
    59.   //@RemoteInfo.LoadLibrary    := GetProcAddress(GetModuleHandle('kernel32.dll'),
    60.   //                                            'LoadLibraryA');
    61.   //@RemoteInfo.GetProcAddress := GetProcAddress(GetModuleHandle('kernel32.dll'),
    62.   //                                            'GetProcAddress');
    63.   //копируем в процесс структуру с данными
    64.   LoadLib l=(LoadLib)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
    65.   GetProc g=(GetProc)GetProcAddress(GetModuleHandle("kernel32.dll"),"GetProcAddress");
    66.   pInfo= InjectMemory(Process, &RemoteInfo, sizeof(TRemoteInfo));
    67.   //копируем в процесс внедряемый код
    68.   CodeAdr= InjectMemory(Process,&RemoteThread,(DWORD)(&RemoteThreadEnd) - (DWORD)(&RemoteThread));
    69.   //запускаем внедренный код
    70.   CreateRemoteThread(Process, nil, 0, (PTHREAD_START_ROUTINE)CodeAdr, pInfo, 0, &TID);  
    71.   getch();
    72. }
    73. void RemoteThreadEnd()
    74. {
    75.    
    76. }
    77. LPVOID InjectMemory(HANDLE Process,LPVOID Memory,DWORD Size)
    78. {
    79.     //var
    80.     DWORD BytesWritten;
    81.     //begin
    82.     LPVOID Result=VirtualAllocEx(Process,NULL,Size,MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    83.     WriteProcessMemory(Process,Result,Memory,Size,&BytesWritten);
    84.     return Result;
    85.     //end;
    86. }
    87. DWORD WINAPI RemoteThread(LPVOID RemoteInfo)
    88. {
    89.     //var
    90.     TRemoteInfo Info;
    91.     MsgBox mBox=(MsgBox)Info.g(Info.l(Info.User32),"MessageBoxA");
    92.     ExTh exTh=(ExTh)Info.g(Info.l(Info.Kernel32),"ExitThread");
    93.     mBox(0,Info.Text,Info.Title,0);
    94.     exTh(0);
    95.     return 1;
    96. }
    При запуске процес блокнота напрочь вылетает
     
  2. q_q

    q_q New Member

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

    mark4545 New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    14
    Так какая разница прототип функции то описан.
     
  4. mark4545

    mark4545 New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    14
    так нашел недочет еще один
    Изменил вот это
    Код (Text):
    1. MsgBox mBox=(MsgBox)Info.g(Info.l(Info.User32),"MessageBoxA");
    2. ExTh exTh=(ExTh)Info.g(Info.l(Info.Kernel32),"ExitThread");
    на вот это
    Код (Text):
    1. MsgBox mBox=(MsgBox)Info.g(Info.l(Info.User32),Info.MessageBoxA);
    2. ExTh exTh=(ExTh)Info.g(Info.l(Info.Kernel32),Info.nExitThread);
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    mark4545
    Так какая разница прототип функции то описан.
    При чем тут прототип? Хочешь почуствовать разницу - посмотри в отладчике, что помещается в качестве трнтьего аргумента подпрограммы InjectMemory когда подпрограмма RemoteThreadEnd расположена после подпрограммы RemoteThread и наоборот.
     
  6. mark4545

    mark4545 New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    14
    поставил RemoteThreadEnd после RemoteThread все равно те же пироги.
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    mark4545
    поставил RemoteThreadEnd после RemoteThread
    И это правильно.

    все равно те же пироги
    Продолжим.

    Где заполнение struct TRemoteInfo.l и struct TRemoteInfo.g. Т.е. где соответствие оригинальному
    Код (Text):
    1. ...
    2. @RemoteInfo.LoadLibrary := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA');
    3. @RemoteInfo.GetProcAddress := GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetProcAddress');
    4. ...
    И наконец самое главное - инжектируемый поток.
    В нем ты завел переменную TRemoteInfo Info (в оригинале ее нет) она ни чем не инициализирована, а ты используешь ее поля - Info.g, Info.l, Info.User32, Info.MessageBoxA, Info.Kernel32 и Info.nExitThread. В оригинале используется параметр (не зря же заполняли структуру и инжектировали ее до кода) созданного потока.
     
  8. mark4545

    mark4545 New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    14
    да да это я ипсравил
    изменил это
    Код (Text):
    1. LoadLib l=(LoadLib)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
    2. GetProc g=(GetProc)GetProcAddress(GetModuleHandle("kernel32.dll"),"GetProcAddress");
    на это
    Код (Text):
    1. RemoteInfo.l=(LoadLib)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
    2. RemoteInfo.g=(GetProc)GetProcAddress(GetModuleHandle("kernel32.dll"),"GetProcAddress");
     
  9. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    тогда думаю ошибка где то :
    Код (Text):
    1. DWORD WINAPI RemoteThread(LPVOID RemoteInfo)
    2. {
    3.     //var
    4.     TRemoteInfo Info;
    5.     MsgBox mBox=(MsgBox)Info.g(Info.l(Info.User32),"MessageBoxA");
    6.     ExTh exTh=(ExTh)Info.g(Info.l(Info.Kernel32),"ExitThread");
    7.     mBox(0,Info.Text,Info.Title,0);
    8.     exTh(0);
    9.     return 1;
    10. }
    TRemoteInfo - где заполняеться? А то вижу что только используеться и все.
     
  10. mark4545

    mark4545 New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    14
    в main
    lstrcpy();
    Говорю же это попытка прееписать исходник ms-rem для самообучения.
    Его сорец пашет нормально.
     
  11. mark4545

    mark4545 New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2007
    Сообщения:
    14
    ой фак это я туплю исправил заполнение структуры) всеравно
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    mark4545
    Покажи, что получилось после исправлений.