Внедрение DLL в процесс x64 не работает

Я сделал dll (32-битная платформа), и теперь я хочу внедрить ее в любой процесс x64.

Было найдено несколько примеров в сети исходных кодов в Delphi, которые обещают это сделать, но когда тестировался, ни одна dll не была внедрена ни в один процесс x64, уже при тестировании с процессом x86 эти коды работают очень хорошо!.

Я нашел уникальный пример, который обещает внедрить файл dll в процесс x64, но в моих тестах ничего не сработало, например, при попытке внедрить dll в notepad.exe.

Итак, у кого-то здесь есть пример инжектора dll, работающего для процессоров x64, или он может помочь мне сделать это с помощью следующего примера (если это возможно)?

Любые предложения приветствуются!

Моя последняя попытка была:

Инжектор

  function InjectDLL(const dwPID: DWORD; {$IFDEF UNICODE} DLLPath: PWideChar
    {$ELSE} DLLPath: PAnsiChar {$ENDIF} ): Integer;

    const
      Kernel32 = 'kernel32.dll';
    var
      dwThreadID: Cardinal;
      hProc, hThread, hKernel: THandle;
      BytesToWrite, BytesWritten: SIZE_T;
      pRemoteBuffer, pLoadLibrary: Pointer;
    begin
      hProc := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or
        PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, False, dwPID);
      if hProc = 0 then
        exit(0);
      try
        BytesToWrite := SizeOf(WideChar) * (Length(DLLPath) + 1);
        pRemoteBuffer := VirtualAllocEx(hProc, nil, BytesToWrite, MEM_COMMIT,
          PAGE_READWRITE);
        if pRemoteBuffer = nil then
          exit(0);
        try
          if not WriteProcessMemory(hProc, pRemoteBuffer, DLLPath, BytesToWrite,
            BytesWritten) then
            exit(0);
    {$REGION 'Check for UNICODE'}
    {$IFDEF UNICODE}
          hKernel := GetModuleHandleW(Kernel32);
          pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryW');
    {$ELSE}
          hKernel := GetModuleHandleA(Kernel32);
          pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryA');
    {$ENDIF}
    {$ENDREGION}
          hThread := CreateRemoteThread(hProc, nil, 0, pLoadLibrary, pRemoteBuffer,
            0, dwThreadID);
          try
            WaitForSingleObject(hThread, INFINITE);
          finally
            CloseHandle(hThread);
          end;
        finally
          VirtualFreeEx(hProc, pRemoteBuffer, 0, MEM_RELEASE);
        end;
      finally
        CloseHandle(hProc);
      end;
      exit(1);
    end;

begin

if InjectDLL(4864, 'C:\SampleDLL') <> 0 then begin
    ShowMessage('woO!');

end;

end.

Dll

 uses
  System.SysUtils,
  System.Classes,
  Variants,
  Winapi.Windows;

Function StartThread(pFunction : TFNThreadStartRoutine; iPriority : Integer = Thread_Priority_Normal; iStartFlag : Integer = 0) : THandle;
var
ThreadID : DWORD;
begin
Result := CreateThread(nil, 0, pFunction, nil, iStartFlag, ThreadID);
if Result <> Null then
SetThreadPriority(Result, iPriority);
end;

Function CloseThread( ThreadHandle : THandle) : Boolean;
begin
Result := TerminateThread(ThreadHandle, 1);
CloseHandle(ThreadHandle);
end;

procedure ThisIsTheThread;
begin
 MessageBoxW(0,'I am in your target : Dll file','woO!',0)
end;

procedure Run;
Var
hThread : THandle;
begin
hThread := StartThread(@ThisIsTheThread);
hThread := StartThread(@ThisIsTheThread,THREAD_PRIORITY_ERROR_RETURN);
CloseThread(hThread);
end;


procedure mydllproc(Reason: Integer);
begin
  case Reason of
    DLL_PROCESS_ATTACH:
      begin
         Run;
      end;
  end;
end;

begin
  DllProc := mydllproc;
  mydllproc(DLL_PROCESS_ATTACH);

end.

PS: отлично работает с 32-битным процессом, как сказано выше.

Источник


person Davi Reis    schedule 02.02.2016    source источник
comment
Вы не можете смешивать 32-битный и 64-битный код в одном процессе ни с внедрением DLL, ни с обычной загрузкой DLL. Это просто не может работать из-за значительной разницы в архитектуре. Таким образом, вам нужна 64-битная DLL для внедрения в 64-битные процессы. Теперь ваши примеры, вероятно, обещают вам, что вам на самом деле не нужно 64-битное приложение, чтобы начать внедрение DLL в 64-битный процесс. Но, конечно же, они не обещают, что 32-битная DLL будет работать с 64-битным процессом, поскольку это просто невозможно.   -  person SilverWarior    schedule 02.02.2016
comment
Я полагаю, вы неправильно поняли, что обещают эти примеры в Интернете исходных кодов. Если говорится, что часть кода работает как в 32-разрядной, так и в 64-разрядной версии, это означает, что вы можете скомпилировать его как есть для обеих архитектур.   -  person Tom Brunberg    schedule 02.02.2016


Ответы (1)


64-битный процесс может загружать только 64-битные модули. 32-битный процесс может загружать только 32-битные модули.

Поэтому должно быть ясно, что вы не можете внедрить свою 32-битную DLL в 64-битный процесс. Чтобы внедрить в 64-битный процесс, вам нужно будет перекомпилировать вашу DLL как 64-битный модуль.

Как только вы это сделаете, вам придется изменить свою DLL. Вам не разрешено многое делать в DllMain, как подробно описано в документах MSDN. Конечно, показ диалога является полным нарушением правил. Позвони CreateThread со своего DllMain и работай там.

person David Heffernan    schedule 02.02.2016
comment
Итак, почему этот код выше, даже скомпилированный для x64 (Injector и dll вместе), по-прежнему не работает, например, для notepad.exe (x64)? PS: Протестировано в Windows 7 Ultimate x64. - person Davi Reis; 02.02.2016
comment
Это другой вопрос. - person David Heffernan; 02.02.2016
comment
Я говорил о notepad.exe выше, см. - person Davi Reis; 02.02.2016
comment
Вы спрашивали о внедрении 32-битной DLL в 64-битный хост. Вы сказали: Я создал dll (32-битная платформа) и теперь хочу внедрить ее в любой x64-процесс. Это вопрос, на который я ответил. Довольно несправедливо, что сейчас вы хотите получить ответ на другой вопрос. - person David Heffernan; 02.02.2016
comment
Тогда у меня что создать новый вопрос только для того, чтобы узнать об этом? помогите мне здесь в этом же вопросе, пожалуйста :-) - person Davi Reis; 02.02.2016
comment
Я ответил на вопрос, который вы задали. Или вы думаете иначе? - person David Heffernan; 02.02.2016
comment
Скорее всего проблема в показе диалога из DllMain. Это не разрешено. - person David Heffernan; 02.02.2016
comment
Я проверил ваше предложение о CreateThread API, но все еще не работает для notepad.exe, calc.exe... x64 соответственно. см.. PS: Dll была скомпилирована как 64-битная - person Davi Reis; 02.02.2016
comment
Ну, я думаю, что-то не так с вашим кодом. Ваше отношение и подход к этому действительно расстраивает. Вы задаете один вопрос, а затем ожидаете, что мы ответим совершенно на что-то другое. Вы копируете код из Интернета без какого-либо реального понимания, а затем просите помощи с ним. В любом случае, почему вы вообще пытаетесь сделать инъекцию? - person David Heffernan; 02.02.2016
comment
Потому что я видел это недавнее видео в Интернете на прошлой неделе, и я хочу сделать проект, способный внедрять dll в calc. exe, notepad.exe также :-). - person Davi Reis; 02.02.2016
comment
Знаешь что, забудь. Я теряю время здесь. Я делал такие инъекции много раз, но они слишком истощают, чтобы помочь вам. meta.stackoverflow.com/questions/258206/what -это-вампир-помощник - person David Heffernan; 02.02.2016
comment
Хорошо, но знал, что весь код, используемый мной, именно такой? :-) - person Davi Reis; 02.02.2016
comment
Я ответил на вопрос, который вы задали, и меня возмущает то, как вы игнорируете нормы этого сообщества. - person David Heffernan; 02.02.2016
comment
этот код, который вы оставили здесь работало, как ты там сказал? Я тестирую здесь сейчас, и не работает. - person Davi Reis; 03.02.2016
comment
Да, работает! Сейчас проверил, извините. Но для 64 бит процесс сделан в Delphi. если я хочу внедрить в какое-то родное приложение Windows x64, это действительно не работает :-( - person Davi Reis; 03.02.2016
comment
Я не могу комментировать это без подробностей. И вы не можете сделать это в комментариях. - person David Heffernan; 03.02.2016
comment
Когда вы тестировали этот код там, он работал для x64 notepad.exe на Windows 7 x64 например? ты помнишь? - person Davi Reis; 03.02.2016
comment
Я не могу вспомнить. Похоже, вы по-прежнему вызываете функцию в user32 из DllMain. - person David Heffernan; 03.02.2016
comment
Нет, я использую CreateThread, как показано в комментарии выше. - person Davi Reis; 03.02.2016
comment
Этот код может быть неправильным. Я действительно не хочу тратить больше времени на комментарии к этому вопросу теперь, когда ваш код продвинулся так далеко. Пришло время задать новый вопрос с самым последним кодом, который у вас есть. - person David Heffernan; 03.02.2016
comment
Я заблокирован для создания нового вопроса, я обновлю свой код выше только в части Dll, где он был изменен. - person Davi Reis; 03.02.2016
comment
Я откатился, потому что ваш код нарушил мой ответ, удалив исходный контент. Если вы хотите добавить больше, это было бы хорошо. Однако ваш код совершенно неверен. Не могли бы вы прочитать документы для CreateThread. Посмотрите внимательно на то, что требуется для функции потока. Вам нужно, чтобы это было function ThreadProc(lpParameter: Pointer): DWORD; stdcall; У вашей функции неправильная подпись. Вы также немедленно завершаете поток, скорее всего, до того, как он сможет что-либо сделать. Почему ты звонишь TerminateThread. - person David Heffernan; 03.02.2016
comment
Теперь другой комментарий, который нужно сделать, это спросить, почему вы тестируете эту DLL, внедряя ее. Вы должны тестировать свой код на простом хосте, который вы можете отлаживать. Сначала убедитесь, что ваша DLL работает хорошо. Затем введите его. Протестировав все вместе, вы не сможете сказать, неправильный ли ваш код DLL или ваш инжектор. Тогда вы застрянете. Это отладка 101. Научитесь изолировать проблемы. Вам не нужен код, вам нужно изучить навыки отладки. Тогда вы окажетесь в гораздо лучшем положении. - person David Heffernan; 03.02.2016
comment
обновил снова выше. Это результат с 64-битной программой Delphi в качестве теста и Windows 7 Ultimate x64. См.. Уже с notepad.exe 64Bits, например, присутствующие в этой версии ОС, не работают. - person Davi Reis; 03.02.2016
comment
Я снова вернулся, потому что вы снова удалили исходный контент. Я не собираюсь больше отвечать на эти комментарии, пока вы не начнете меня слушать и работать со мной. - person David Heffernan; 03.02.2016
comment
Прежде всего, сделайте некоторую отладку. Протестируйте DLL без внедрения. Затем введите ничего не делающую DLL. И постепенно доводить дело до конца. Проверяйте наличие ошибок при вызове функций API. Читайте документацию правильно. Вы, кажется, не делаете ничего из этого до сих пор. Извините, если это звучит резко, но я не хочу кормить вас кодом с ложки. Я хотел бы помочь вам учиться. - person David Heffernan; 03.02.2016
comment
Блокнот и калькулятор в Windows 10 являются программами UWA, и — хотя я не уверен в этом случае — никакая другая функция связи win32, которую я пробовал, не работает с ними. Протестируйте свое приложение с помощью другой программы (даже той, которую вы написали сами). Блокнот и калькулятор на Win10 также могут быть на виртуальной машине. - person Helen Fairgrieve; 21.04.2016