Русский / Russian English / Английский

Сейчас на форуме: Smoks, Alf, Login_ (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Вопросы новичков —› Проблемы с 64bit proxy-dll
Посл.ответ Сообщение


Ранг: 59.2 (постоянный)
Статус: Участник

Создано: 24 февраля 2020 02:30 New!
Цитата · Личное сообщение · #1

Хочу переписать простую прокси-дллку с 32 бит, и почему-то она криво работает на 64 бит. Не получается сделать ни на Си, ни на Масм, приложение тупо падает. Это version.dll , 32 битная версия такая: --> Link <-- (лишнее вырезано).

64 битная (масм) --> Link <-- - запускается, т.е. отрабатывает DbgString, но падает где-то в недрах comctl32 , а мб где-то еще
64 битная (Си) --> Link <-- - не работает вообще, прога падает. Вероятно, оно очень кривое, но я не пойму, как без асм-вставок сделать эту переадресацию.

Добавлено спустя 4 минуты
Или может есть тулзы какие-то готовые. Все, что нашел - заточено под 32 бита.

Ранг: 315.2 (мудрец)
Статус: Модератор
CrackLab

Создано: 24 февраля 2020 03:23 New!
Цитата · Личное сообщение · #2

morgot
Собственно есть 2 варианта (которые без геморроя), либо подрубить масм в студии, либо юзать конпиль от интел(так же легко подрубить к студии)


Ранг: 59.2 (постоянный)
Статус: Участник

Создано: 24 февраля 2020 03:33 New!
Цитата · Личное сообщение · #3

SReg пишет:
либо подрубить масм в студии

Я нашел другой вариант, где юзается масм в х64 , но или студия глючит, или я..пишет ошибку. Как его там включить? Студия 2015. Добавляю новый асм файл в проект, там код вида
Code:
  1. .data
  2. extern PA : qword
  3. .code
  4. RunASM proc
  5. jmp qword ptr [PA]
  6. RunASM endp
  7. end


В Си пишу
Code:
  1. extern int RunASM(void);
  2. PA = p[0];
  3.                  RunASM();


Project->Build depend..->Build customization выбираю MASM , но получаю ошибку , что линкер не видит этот RunASM

Ранг: 315.2 (мудрец)
Статус: Модератор
CrackLab

Создано: 24 февраля 2020 03:40 New!
Цитата · Личное сообщение · #4

ну давай я за тебя поищу
--> Link <--
--> Link <--

| Сообщение посчитали полезным: morgot


Ранг: 1.3 (гость)
Статус: Участник

Создано: 24 февраля 2020 04:19 · Поправил: Storage New!
Цитата · Личное сообщение · #5

Code:
  1. BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID lpx)
  2. {
  3.     static HINSTANCE hL={0};
  4.     if (reason == DLL_PROCESS_ATTACH)
  5.     {
  6.         hL = LoadLibraryW(L"version.dll");
  7.         if (!hL) return TRUE;
  8.         MessageBoxA(NULL, "test", "test", MB_OK);
  9.     }
  10.     if (reason == DLL_PROCESS_DETACH)
  11.         FreeLibrary(hL);
  12.     return TRUE;
  13. }


DllMain поставьте
как точку входа Компоновщик - > Дополнительно - >Точка входа
Укажите импорт явно в том же компоновщике и
используйте DEF файл

телега https://t.me/VIRTEAM

JID: virteamplus@sj.ms

Ранг: 589.6 (!)
Статус: Модератор

Создано: 24 февраля 2020 08:59 New!
Цитата · Личное сообщение · #6

Storage
Отличный способ отхватить дедлок - использовать LoadLibrary в DllMain.

Ранг: 40.7 (посетитель)
Статус: Участник

Создано: 24 февраля 2020 11:03 New!
Цитата · Личное сообщение · #7

morgot, делал по этой инструкции http://lallouslab.net/2016/01/11/introduction-to-writing-x64-assembly-in-visual-studio/
проблем не было (студии 2015 и 2019).

r_e пишет:
Отличный способ отхватить дедлок - использовать LoadLibrary в DllMain

Можно пояснить почему?

| Сообщение посчитали полезным: morgot


Ранг: 249.7 (наставник)
Статус: Участник

Создано: 24 февраля 2020 11:45 · Поправил: cppasm New!
Цитата · Личное сообщение · #8

Потому что MSDN.
--> DllMain MSDN <--

The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary) during process termination, because this can result in a DLL being used after the system has executed its termination code.


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 24 февраля 2020 13:33 New!
Цитата · Личное сообщение · #9

Нужно послать APC, тогда она будет доставлена при возврате из загрузчика, но до загрузки контекста в процессор. При асинхронной загрузке(в произвольный момент времени) вариант один - вызвать загрузчик в новом потоке.

Ранг: 143.2 (ветеран)
Статус: Участник

Создано: 24 февраля 2020 13:43 New!
Цитата · Личное сообщение · #10

morgot
уж если ставил редиректы так бы и вписал путь к реальной длл и все эти твои лоад либрари не нужны.


Ранг: 59.2 (постоянный)
Статус: Участник

Создано: 24 февраля 2020 14:18 New!
Цитата · Личное сообщение · #11

Спасибо всем. Я вроде указывал в студии masm building, но не собирало и все. Переделал еще раз с нуля, по инструкции - и заработало. Мистика.
Или может, я указывал этот масм в настройках win32 проекта, а компилировал 64 битный? Может такое быть или этот Masm добавляется сразу в весь solution?
Почему вообще не сделали его поддержку по дефолту?

r_e пишет:
Отличный способ отхватить дедлок - использовать LoadLibrary в DllMain.

Когда-то на васме обсуждали эту тему, как все таки правильно? Создавать поток в DllMain тоже не советуют. Ну вот когда есть дллка, которая должна что-то там пропатчить и т.д.

difexacaw пишет:
Нужно послать APC

Т.е. вместо потока или явного вызова LoadLibrary нужно вызвать QueueUserApc ,передав адрес процедуры, где идет основная работа? Или что имелось ввиду?

Alchemistry пишет:
вписал путь к реальной длл

Как и куда вписывать?


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 24 февраля 2020 14:35 New!
Цитата · Личное сообщение · #12

morgot

> Создавать поток в DllMain тоже не советуют.

Создавать потоки в dll.EP можно. Когда поток запустится он войдёт в ожидание в загрузчике, пока текущий поток(который выполняет dll.EP) не покинет загрузчик, затем поток выйдет из ожидания и продолжит выполнять загрузчик. Если выполнить при этом в dll.EP синхронизацию с новым потоком, то возникнет деадлок.

> Т.е. вместо потока или явного вызова LoadLibrary нужно вызвать QueueUserApc

Да, разница в синхронизации такой загрузки. Придётся обождать через туже APC запуск потока, а поэтому для такой синхронной загрузки во втором потоке нет смысла. Это нужно обычно для инжектов, когда в произвольный момент времени нужно подгрузиться.

| Сообщение посчитали полезным: morgot


Ранг: 143.2 (ветеран)
Статус: Участник

Создано: 24 февраля 2020 16:00 · Поправил: Alchemistry New!
Цитата · Личное сообщение · #13

morgot

сюда

#pragma comment(linker, "/export:VerQueryValueW=version.VerQueryValueW")

на пример

https://github.com/Panupong9844/metasploit-framework/blob/eb11a5993a88d49a11039c454b109ab64b9a8a81/data/templates/src/pe/dll_gdiplus/template.h

хоть с локалхоста задай

| Сообщение посчитали полезным: morgot


Ранг: 40.1 (посетитель)
Статус: Участник

Создано: 24 февраля 2020 16:03 · Поправил: bartolomeo New!
Цитата · Личное сообщение · #14

код FASM - прокси 64х для d3d9.dll

{ Атач доступен только для участников форума } - d3d9.asm

| Сообщение посчитали полезным: morgot



Ранг: 59.2 (постоянный)
Статус: Участник

Создано: 24 февраля 2020 21:24 New!
Цитата · Личное сообщение · #15

Возвращаясь к длл, написанной чисто на Масм64. Когда я сравнил ее с рабочим 64 битным вариантом, то нашел ошибку. Масм почему-то генерит с такого кода

Code:
  1. _GetFileVersionInfoA proc
  2.          mov rax,dwGetFileVersionInfoA
  3.          jmp rax
  4. _GetFileVersionInfoA endp


вот такой
Code:
  1. GetFileVersionInfoA proc near    
  2. enter   80h, 0
  3. sub     rsp, 40h
  4. mov     rax, cs:qword_1800033F0
  5. jmp     rax
  6. GetFileVersionInfoA endp


Если вручную занопить пролог (enter , sub rsp ), то все работает. Но - откуда это берется и можно ли это отключить? Ведь в студии тот же масм такое не генерит.


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 24 февраля 2020 21:34 New!
Цитата · Личное сообщение · #16

option prologue ?

Добавлено спустя 9 минут
Пример наглядный тебе с синхроном apc:



{ Атач доступен только для участников форума } - L.7z


Ранг: 59.2 (постоянный)
Статус: Участник

Создано: 24 февраля 2020 21:45 New!
Цитата · Личное сообщение · #17

difexacaw
спасибо, это оно.


Ранг: 2012.9 (!!!!)
Статус: Модератор
retired

Создано: 24 февраля 2020 22:11 New!
Цитата · Личное сообщение · #18

А ты как хотел? Задал как процедуру-получи фрейм стека.


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 24 февраля 2020 22:16 New!
Цитата · Личное сообщение · #19

Archer

Наверно можно было конвенцию задать, proc C например.


Ранг: 59.2 (постоянный)
Статус: Участник

Создано: 24 февраля 2020 22:31 New!
Цитата · Личное сообщение · #20

Archer если задавать как метку , то тогда не знаю как экспортировать.
В общем, я решил это все дело, вначале файла задаем стандартный пролог , а перед прокси-функами отключаем. В принципе, оно мне уже так было, я сделал на Си, но интересно было и Масм разобраться.


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 24 февраля 2020 23:51 · Поправил: difexacaw New!
Цитата · Личное сообщение · #21

morgot

Он имел ввиду что при дефолтном прототипе формируется фрейм, opt prol. что бы ты все стабы не переписывал(врядле ты макро используешь). Асм отличается от высокоуровневых яп, нужно вначале ознакомиться с опциями сборки, так как все настройки задаются напрямую.
 eXeL@B —› Вопросы новичков —› Проблемы с 64bit proxy-dll

Видеокурс ВЗЛОМ