Внедрение 64-битной DLL с использованием пещеры кода - PullRequest
5 голосов
/ 07 марта 2012

Я пытаюсь внедрить 64-битную DLL в 64-битный процесс (проводник по этому вопросу).
Я пытался использовать методы Remote-thread \ Window Hooks, но некоторые антивирусы обнаруживают мой загрузчик как ложныйположительный.
После прочтения этой статьи: Dll Injection от Darawk , я решил использовать кодовые пещеры.
Он отлично работал для 32-битных, но потому что VS не поддерживает встроенную сборку для 64-битных, которые у меня быличтобы писать оп-коды и операнды в явном виде.
Я смотрел на эту статью: 64-битное внедрение с использованием пещеры кода , как говорится в статье, есть некоторые различия:

Здесь есть несколько отличий:

  1. MASM64 использует fastcall, поэтому аргумент функции должен передаваться в регистре, а не в стеке.
  2. Длина адресов - 32 против 64 бит - должна быть принята во внимание.
  3. MASM64 не имеет инструкции, которая помещает все регистры в стек (например, pushad в 32-битной системе), поэтому это должно было быть сделано путем явного нажатия всех регистров.

Я следовал этим рекомендациям и запустил пример статьи, но ничего из того, что я сделал, не сработало.
В тот момент, когда я возобновил основной поток, произошел сбой целевого процесса, и я этого не сделалзнать, как на самом деле разобраться в этом, потому что у ollydbg нет поддержки 64 бит.

Вот как выглядит код до того, как я его ввел:

   codeToInject:  
000000013FACD000  push        7741933Ah  
000000013FACD005  pushfq  
000000013FACD006  push        rax  
000000013FACD007  push        rcx  
000000013FACD008  push        rdx  
000000013FACD009  push        rbx  
000000013FACD00A  push        rbp  
000000013FACD00B  push        rsi  
000000013FACD00C  push        rdi  
000000013FACD00D  push        r8  
000000013FACD00F  push        r9  
000000013FACD011  push        r10  
000000013FACD013  push        r11  
000000013FACD015  push        r12  
000000013FACD017  push        r13  
000000013FACD019  push        r14  
000000013FACD01B  push        r15  
000000013FACD01D  mov         rcx,2CA0000h  
000000013FACD027  mov         rax,76E36F80h  
000000013FACD031  call        rax  
000000013FACD033  pop         r15  
000000013FACD035  pop         r14  
000000013FACD037  pop         r13  
000000013FACD039  pop         r12  
000000013FACD03B  pop         r11  
000000013FACD03D  pop         r10  
000000013FACD03F  pop         r9  
000000013FACD041  pop         r8  
000000013FACD043  pop         rdi  
000000013FACD044  pop         rsi  
000000013FACD045  pop         rbp  
000000013FACD046  pop         rbx  
000000013FACD047  pop         rdx  
000000013FACD048  pop         rcx  
000000013FACD049  pop         rax  
000000013FACD04A  popfq  
000000013FACD04B  ret   

Мне кажется, это нормально, но я предполагаю, что что-то упустил.
Мой полный код можно найти здесь: Исходный код

Любые идеи \ предложения \ альтернативы?

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Первое нажатие, в котором сохраняется возвращаемое значение, передает только 32-разрядное значение.dwOldIP в вашем коде также DWORD, это должно быть DWORD64.Необходимость привести к DWORD из ctx.Rip должно быть достаточно подсказки;)

Кроме того, убедитесь, что стек выровнен по 16 байтов при входе в вызов LoadLibrary.Некоторые API выдают исключения, если стек не выровнен должным образом.

1 голос
/ 08 марта 2012

Очевидно, что основная проблема заключалась в том, что я выделил данные пещеры кода без разрешения EXECUTE_PAGE_READWRITE, и, следовательно, часть данных была обработана как данные, а не как коды операций.

...