Сейчас на форуме: tyns777, localhost1, vsv1, asfa (+6 невидимых)

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


Ранг: 69.9 (постоянный), 83thx
Активность: 0.140.73
Статус: Участник

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

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

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

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



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

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

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




Ранг: 69.9 (постоянный), 83thx
Активность: 0.140.73
Статус: Участник

Создано: 24 февраля 2020 03:33
· Личное сообщение · #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.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

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

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

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

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

Создано: 24 февраля 2020 04:19 · Поправил: Storage
· Личное сообщение · #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



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

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

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

-----
старый пень




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

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

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

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

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

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

Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 24 февраля 2020 11:45 · Поправил: cppasm
· Личное сообщение · #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.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

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

-----
vx




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

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

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




Ранг: 69.9 (постоянный), 83thx
Активность: 0.140.73
Статус: Участник

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

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

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

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

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

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

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

morgot

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

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

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

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

-----
vx


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

Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 24 февраля 2020 16:00 · Поправил: Alchemistry
· Личное сообщение · #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

Ранг: 42.8 (посетитель), 16thx
Активность: 0.020.06
Статус: Участник

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

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

2f37_24.02.2020_EXELAB.rU.tgz - d3d9.asm

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


Ранг: 69.9 (постоянный), 83thx
Активность: 0.140.73
Статус: Участник

Создано: 24 февраля 2020 21:24
· Личное сообщение · #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 ), то все работает. Но - откуда это берется и можно ли это отключить? Ведь в студии тот же масм такое не генерит.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

option prologue ?

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



25c0_24.02.2020_EXELAB.rU.tgz - L.7z

-----
vx





Ранг: 69.9 (постоянный), 83thx
Активность: 0.140.73
Статус: Участник

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

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




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

Archer

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

-----
vx





Ранг: 69.9 (постоянный), 83thx
Активность: 0.140.73
Статус: Участник

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

morgot

Он имел ввиду что при дефолтном прототипе формируется фрейм, opt prol. что бы ты все стабы не переписывал(врядле ты макро используешь). Асм отличается от высокоуровневых яп, нужно вначале ознакомиться с опциями сборки, так как все настройки задаются напрямую.

-----
vx



 eXeL@B —› Вопросы новичков —› Проблемы с 64bit proxy-dll
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати