Re: Dll inject в 64-битный процесс
От: EreTIk EreTIk's Box
Дата: 05.10.16 11:23
Оценка: +2
Здравствуйте, xteam777, Вы писали:

X> <...>, а при перекомпиляции всех участников в 64bit Injector + 64bit Dll + 64bit Targer processs, при выгрузке Dll в Target process Access Violation $C0000005. Подскажите в чем может быть дело.


Ох, с чего бы начать... Во первых используется грязный хак с тем, что аргумент будет лежать в ebx:

//  Данная функция запускает в удаленном процессе поток
//  который стартует с инструкции JMP [EBX]
//  В EBX будет лежать адрес функции SelfUnload,
//  который будет выгружать библиотеку.

Гуглом нашел оригинал тут:

Здесь иcпользуется один недокументированный механизм, работающий в линейках от Windows 2000 до Windows 7 (на восьмерке не проверял, но по логике и там будет то же самое). Дело в том что значение, передаваемое в параметре lpParameter функции CreateRemoteThread всегда размещается в регистре EBX при старте нити в удаленном приложении. Задача данного кода разместить в удаленном процессе инструкцию JMP [EBX] с которой будет начинаться работа нити. Если в EBX будет находится адрес процедуры SelfUnload, произойдет передача управления на нее, ну а внутри данной процедуры уже реализован код выгрузки библиотеки и закрытия текущей нити.

Можно конечно стартовать механизм выгрузки сразу непосредственно с функции SelfUnload, но уж очень хотелось показать данный момент, поэтому не ругайте сильно


Если нужно, что бы код работал, а не показать как вы круто знаете хаки — убирайте использование EBX, даже в 32-х битном коде.

Использование передачи управления через инструкцию JMP [EBX] породило в этом коде запись адреса функции SelfUnload целевой процесс. Но на 64-х битных системах адреса 8-ми байтовые, а это никак не отражено в коде. Уберете извращение с EBX, уйдет необхоидмость писать адрес, пропадет и этот баг.

Для исправления нужно переписать код выгрузки на запуск нити в целевом процессе с адреса SelfUnload и указателем на адрес библиотеки в качестве параметра.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.