[Delphi] Proxy DLL

CyberGod

Посетитель
Мудрец
Сообщения
24
Реакции
354
Приветствую TryAgain. Знаком я с этой статьей и статья эта сохранена у меня ... а оригинала архива нет :(
А какая конечная цель !? Просто заготовку шаблона прокси либы нужно !?
 

TryAga1n

Посетитель
Наставник
Сообщения
15
Реакции
349
Просто заготовку шаблона прокси либы нужно !?
Да, интересно посмотреть на реализацию GDS32.dll, которая должна быть в архиве. Теоретически я все прекрасно прекрасно понимаю, просто интересуют некоторые моменты. Встречал на гитхабе разные варианты, но они были не особо оптимизированы. Раньше никогда не приходилось применять данный метод, но недавно уперся в одну софтину, где прокси была бы хорошим вариантом. В дальнейшем есс-но хочу написать под себя генератор с удобным функционалом
 

CyberGod

Посетитель
Мудрец
Сообщения
24
Реакции
354
В дальнейшем есс-но хочу написать под себя генератор с удобным функционалом
Да было бы неплохо ... простых вариантов много, например ProxyDllGen

Но ка кправило, каждый раз какие то параметры и условия корректируются, отсюда любой взятый за основу шаблон обрастает своими "костылями" под решение той или иной задачи :)
Я скажем 2-3 раза применял свою проксю и все работало, а потом на одном тарджете перестало! :( Все дело оказалось в эмуляции протектором некторых используемых в моей проксе фунок, благо есть кому подсказать :) , спс SReg.;)
 
Последнее редактирование:

mak

Соломенные сандалии
Администратор
Сообщения
319
Реакции
108
Hi TryAga1n,

можно на хабре ещё спросить, есть ли контакты автора или может кто-то сохранил исходник, я обычно ищу автора, в гугле его правда нет, но может кто его знает, тот кто пригласил его, НЛО кажется.
 

TryAga1n

Посетитель
Наставник
Сообщения
15
Реакции
349
простых вариантов много, например ProxyDllGen
Спасибо, находил данный проект, удивился, что он на лазарусе)
тот кто пригласил его, НЛО кажется
Приглашение от НЛО - это учетка с открытой регистрации, без инвайта, если мне не изменяет память.
 

DMA/STY

Посетитель
Новичок
Сообщения
14
Реакции
4
На хабре в 14 году выкладывали Proxy DLL, статья осталась, а архив на ргхосте помер.
TryAga1n, спасибо вам за интересный тред/топик. Благодаря ему открыл для себя новую технику. Так-то раньше я слышал про DLL hijacking, Proxy DLL и думал, во-первых, что это одно и то же, а во-вторых, считал, что это все связано с заражением чужих компьютеров и, вроде как, мне пока неинтересно. А тут почитал статью по вашей ссылке, потом другую подобную и пришел к выводу, что это как раз то, чего мне не хватало для полного счастья. ))

Хотел спросить у форумчан, нет ли у кого какого-нибудь простенького примера реализации Proxy DLL на C/C++, чтобы можно было быстренько скомпилировать и посмотреть/потестировать на практике как это работает? А то в статьях, которые мне попадались, файлы примеров либо удалены, либо слишком перегружены сложностью реализации, либо, вообще, отсутствуют. Так-то я, конечно, разберусь, поскольку теорию, вроде, уловил, но это же все время, а с готовыми примерами, все бы было намного быстрей и эффективней. Заранее спасибо.
 

mizuki

Зарегистрированный
Сообщения
8
Реакции
7
Что-то не понял зачем такие сложности с ассемблером и т.д.
Для функций, который планируешь перехватывать, описываешь типы (пример ниже)
C++:
    typedef DWORD (WINAPI *CardWriteFile_t)(
        IN      LPCSTR             lpszFileID,
        IN      VOID               *pBuffer,
        IN      DWORD              dwBufferSize
        );
Затем пишешь свои реализации
C++:
DLLMONITOR_API DWORD WINAPI CardWriteFile(
    IN      LPCSTR             lpszFileID,
    IN      VOID               *pBuffer,
    IN      DWORD              dwBufferSize
    )
{
    Log(FUNCTION_NAME "\n");
    DWORD lResult = OriginalDLL.CardWriteFile(lpszFileID, pBuffer, dwBufferSize);
    return lResult;
}
где OriginalDLL - это прокси-класс
C++:
struct CustomError {};
struct CustomProxy
{
    HMODULE Handle_;
    CustomProxy() {
        Handle_ = LoadLibrary("original_.dll");
        if (!Handle_) {
            Log(_T(" ! Error: can't load original_.dll\n"));
            throw CustomError();
        }

#define GET_PROC(x) \
        { \
            x = (x##_t) GetProcAddress(Handle_, _T(#x)); \
            if (x == 0) { \
                Log(_T(" ! Error: can't resolve " #x " function.\n")); \
                throw CustomError(); \
            } \
            Log(_T(" ~ " #x " function resolved.\n")); \
        }

    
        GET_PROC(CardWriteFile);
#undef GET_PROC
    }

public:
    static CustomProxy& Instance()
    {
        static CustomProxy lInstance;
        return lInstance;
    }

    virtual ~CustomProxy()
    {
        FreeLibrary(Handle_);
    }

    CardWriteFile_t CardWriteFile;

};

#define OriginalDLL    CustomProxy::Instance()
Для функций которые не хочешь перехватывать генеришь форварды, вида
C++:
#pragma comment(linker, "/export:SnmpSvcAddrIsIpx=original_.SnmpSvcAddrIsIpx")
 

DMA/STY

Посетитель
Новичок
Сообщения
14
Реакции
4
Боже, каким ничтожеством я, видимо, выгляжу в глазах специалистов с большинства форумов подобных нашему. )) Если Rio считает, что у меня не хватает мозгов, даже на элементарный поиск по Гитхабу. )) Боюсь даже представить, что мне напишут в ответ на какой-нибудь следующий мой вопрос. Одно из двух: либо https://www.google.com, либо сделают вид, что, вообще, не заметили моего вопроса. )))
 

DMA/STY

Посетитель
Новичок
Сообщения
14
Реакции
4
Что-то не понял зачем такие сложности с ассемблером и т.д.
Вот я вас тоже понять не могу, зачем выкладывать такой примитив? Дети в детском садике и то сложнее примеры разбирают. Могли бы в конце концов, побольше всяких множественных наследований классов применить у себя в коде, перегрузку и т.д. и т.п... Да и конструкции такого плана(см. ниже) могли бы очень сильно облагородить ваш код:
C++:
char *(*(**foo [8] [])())[]; 
int *(* foo())[15];
char *(*(* arr[N]) ()) () ;
 

mizuki

Зарегистрированный
Сообщения
8
Реакции
7
Если есть вопросы по сути - задавай. Я тебе нарезал кусков из рабочего проекта.
Без класса пришлось бы то что в конструкторе и десктрукторе выносить в отдельные функции с обвязкой через глобальные переменные. А так все компактно + lazy loading + автоматическое освобождение ресурсов при выходе.
Но ты можешь блеснуть интеллектом и выдать свой вариант. Обсудим.
 
  • Понравилось
Реакции: mak

DMA/STY

Посетитель
Новичок
Сообщения
14
Реакции
4
Но ты можешь блеснуть интеллектом и выдать свой вариант.
Боюсь, что блеск наших двух интеллектов многоие форумчане могут просто не выдержать и ослепнуть, поэтому, я думаю, не стоит их подвергать такому риску. )) Пока, я думаю, одного вашего интеллекта будет вполне достаточно, а там посмотрим, если в дальнейшем вы остановитесь в своем развитии, то придеться потихоньку компенсировать недостатки вашего интеллекта моим, а куда деваться - не пропадать же сайту. )))
Если есть вопросы по сути - задавай.
А вот за это предложение - огромное вам спасибо. Вижу, что вы действительно стараетесь мне помочь. Поначалу-то я решил, что вы просто решили тут всем показать какой вы крутой в области C/C++ программирования, но теперь вижу, что это, скорее всего, не так.

mizuki, у меня к вам предложение, если вы, конечно, не против. Может дальнейшие обсуждения данной темы нам перенести в личку? Все равно,как ни крути, а в личке все обсуждения более раскованы и свободны. Другой вопрос, что сужается контингент помошников, но что-то я сомневаюсь, что кроме вас еще кто-нибудь подключится к обсуждению этого вопроса. Все кто хотел, уже высказались выше, у других, видимо, или времени в обрез или нет интереса к данной теме. В общем, подожду от вас ответа, а потом, если вы будете не против - буду писать вам в личку.
 
Последнее редактирование:

mak

Соломенные сандалии
Администратор
Сообщения
319
Реакции
108
@DMA/STY, Переход на личности, пункт правил - https://cracklab.team/index.php?help/rules/#rule-2

Вот я вас тоже понять не могу, зачем выкладывать такой примитив? Дети в детском садике и то сложнее примеры разбирают.
Каждый пишет свой код как хочет, нейтральность, это всё наше. Сразу пиши в личку (y)

Хотел спросить у форумчан, нет ли у кого какого-нибудь простенького примера реализации Proxy DLL на C/C++, чтобы можно было быстренько скомпилировать и посмотреть/потестировать на практике как это работает? А то в статьях, которые мне попадались, файлы примеров либо удалены, либо слишком перегружены сложностью реализации, либо, вообще, отсутствуют. Так-то я, конечно, разберусь, поскольку теорию, вроде, уловил, но это же все время, а с готовыми примерами, все бы было намного быстрей и эффективней. Заранее спасибо.
https://www.codeproject.com/Articles/1179147/ProxiFy-Automatic-Proxy-DLL-Generation
Сложнее, но интереснее
https://www.codeproject.com/Articles/448756/Introducing-Investigo-Using-a-Proxy-DLL-and-embedd

Windows via C/C++ - https://www.oreilly.com/library/view/windows-via-cc/9780735639904/ch22.html
Injecting a DLL with a Trojan DLL - https://www.oreilly.com/library/view/windows-via-cc/9780735639904/ch22s05.html

https://en.wikipedia.org/wiki/Wrapper_function
https://en.wikipedia.org/wiki/Wrapper_library

Техники все схожи, но имеют разную цель и изначальную кодовую базу.

Delphi High Performance (может быть этот пример будет полезен)
Source Code https://github.com/PacktPublishing/Delphi-High-Performance/archive/master.zip

Книга -
Для просмотра содержимого вам необходимо Войти в систему.
Там есть глава - Using a proxy DLL in Delphi - Chapter 8, а в сорсах все исходники в папке Chapter 8.
The chapter ended with a practical demonstration that linked a very simple C++ library
through a proxy DLL written in C++ to a Delphi application. I looked into two different
ways of implementing a proxy DLL and into two ways of using this DLL in a Delphi
application.
 
Верх Низ