Инжекты

Тема в разделе "WASM.BEGINNERS", создана пользователем Entropy, 15 дек 2023.

  1. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    релоки должны указывать на выделенную память ?
    --- Сообщение объединено, 28 янв 2024 ---
    и системой...
    --- Сообщение объединено, 28 янв 2024 ---
    rmn, CreateThread в DllMain ?
     
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    Да: в бинарнике все обращения к данным предполагают, что бинарник загружен по фиксированному адресу (ImageBase).
    Если бинарник надо загрузить по другому адресу, все такие места надо пропатчить. Список всех этих мест лежит в таблице релоков.
    Ты идёшь по каждому смещению из таблицы релоков, и, в зависимости от размера указателя в байтах, пересчитываешь новый адрес:
    NewAddress = OldAddress - OldImageBase + NewImageBase
     
  3. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    HoShiMin ,поблема в том что релоки это RVA адреса,а если длл разместить по произвольному адресу,то есть прочитать с диска в произвольную область памяти,здесь их придётся как-то пересчитывать,особенно когда образ загружен не по ImageBase
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Да, создать поток в DllMain() безопасно. Главное, помнить, что хотя CreateThread() выполнится успешно и вернет валидный хендл, твоя функция потока не начнет выполняться, пока твоя DllMain() не завершится, поэтому ждать от потока что-то сразу после вызова CreateThread() - это гарантированный дедлок.
    Но лучше, конечно, класс-хелпер для создания потока заюзать, требующий для сборки C++24 и собирающийся кастомным тулчейном на джва гига всего за 7 секунд на i9-over9000 :)
     
  5. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    rmn, не подскажете, в чем ошибка?

    Создаю 2 Pipe с помощью CreatePipe.
    Создаю 1 CreateProcess.
    Код (Text):
    1. procedure StartExe(s: string);
    2. var    
    3.   WaitThreadId: Cardinal;
    4.   StartupInfo: TStartupInfo;
    5.   SecurityAttributes: TSecurityAttributes;
    6.   ProcessInformation: TProcessInformation;
    7. begin
    8.   Form1.Memo2.Lines.Add('Process started.');
    9.  
    10.   ZeroMemory(@SecurityAttributes, SizeOf(SecurityAttributes));
    11.  
    12.   SecurityAttributes.nLength := SizeOf(TSecurityAttributes);
    13.   SecurityAttributes.lpSecurityDescriptor := nil;
    14.   SecurityAttributes.bInheritHandle := True;
    15.  
    16.   CreatePipe(hPipeInputRead, hPipeInputWrite, @SecurityAttributes, 0);
    17.   CreatePipe(hPipeOutputRead, hPipeOutputWrite, @SecurityAttributes, 0);
    18.  
    19.   ZeroMemory(@StartupInfo, SizeOf(TStartupInfo));
    20.   ZeroMemory(@ProcessInformation, SizeOf(TProcessInformation));
    21.  
    22.   GetStartupInfo(StartupInfo);
    23.  
    24.   StartupInfo.cb := SizeOf(TStartupInfo);
    25.   StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    26.   StartupInfo.wShowWindow := SW_HIDE;
    27.   StartupInfo.hStdInput := hPipeInputRead;
    28.   StartupInfo.hStdOutput := hPipeOutputWrite;
    29.   StartupInfo.hStdError := hPipeOutputWrite;
    30.  
    31.   if CreateProcess(nil, PChar(s), nil, nil, True, CREATE_NO_WINDOW{CREATE_NEW_CONSOLE}, nil, nil, StartupInfo, ProcessInformation) then
    32.   begin
    33.     hProcess := ProcessInformation.hProcess;
    34.  
    35.     hThread := CreateThread(nil, 0, @ReadThreadProc, nil, 0, ThreadId);
    36.     CreateThread(nil, 0, @WaitThread, nil, 0, WaitThreadId);
    37.  
    38.     //WaitForSingleObject(hProcess, INFINITE);
    39.  
    40.   end;
    41. end;
    После CreateProcess создаю поток для чтения из Pipe:
    Код (Text):
    1. procedure ReadThreadProc;
    2. var    
    3.   buf: array [0..4096] of Char;
    4.   BytesCount, lpTotalBytesAvail: Cardinal;
    5. begin
    6.   Terminated := false;
    7.   while not Terminated do
    8.   begin
    9.     if WaitForSingleObject(hProcess, 10) = WAIT_TIMEOUT then
    10.     begin
    11.       if PeekNamedPipe(hPipeOutputRead, nil, 0, nil, @lpTotalBytesAvail, nil) then
    12.       begin
    13.         if lpTotalBytesAvail > 0 then
    14.         begin  
    15.           ZeroMemory(@buf, SizeOf(buf));
    16.  
    17.           if ReadFile(hPipeOutputRead, buf, Length(buf), BytesCount, nil) then
    18.           begin
    19.             if BytesCount <> 0 then
    20.             begin
    21.               OemToAnsiBuff(buf, buf, BytesCount);
    22.               Form1.Memo2.Text := Form1.Memo2.Text + Copy(buf, 1, BytesCount);
    23.             end;
    24.           end;
    25.      
    26.         end;
    27.       end;
    28.     end;
    29.   end;
    30. end;
    При записи в Pipe время от времени возникает Access Violation, External exception C0000008:
    Код (Text):
    1. procedure InputText(s: string);
    2. var
    3.   i: integer;  
    4.   BytesCount: Cardinal;
    5.   buf: array [0..4096] of Char;
    6. begin
    7.   if Length(s) < 4090 then
    8.   begin
    9.     ZeroMemory(@buf, SizeOf(buf));
    10.     lstrcpy(buf, PChar(s));
    11.     lstrcat(buf, #13#10);
    12.  
    13.     for i := 0 to Length(buf) - 1 do
    14.     begin
    15.       WriteFile(hPipeInputWrite, buf[i], 1, BytesCount, nil);
    16.     end;
    17.     //WriteFile(hPipeInputWrite, buf, Length(buf), BytesCount, nil);
    18.   end;
    19. end;
    Код для того, чтобы: запустить процесс, получить вывод.
    Потом сделать ввод, затем считать вывод, и так постоянно.

    Не могу понять из за чего может возникать исключение
     
  6. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    48
    Есть хорошие статьи в http://rsdn.org/

    как подготовить и грузить DLL в про-во процесса

    http://rsdn.org/article/baseserv/peloader.xml?print

    Загрузчик PE-файлов
    Исследование формата Portable Executable, сопровождающееся написанием PE-загрузчика

    http://rsdn.org/article/baseserv/InjectDll.xml?print
    Способ принудительной загрузки DLL в адресное пространство процесса
    --- Сообщение объединено, 28 янв 2024 ---
    И еще полезная статья........
    http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1294
    TUnRar без DLL