![]() |
eXeL@B —› Вопросы новичков —› Вызов Сишной функции на Delphi |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 05 ноября 2011 22:52 · Личное сообщение · #1 Здравствуйте. Нужно вызвать одну функцию на си из проекта на делфи. В CFF Explorer информация о ней такая: Code:
Ida говорит такое: DecryptString(&v20, v13, 8, v17, &v19); С какими параметрами мне следует вызывать ее на Delphi? Спасибо. ![]() |
|
Создано: 05 ноября 2011 23:24 · Личное сообщение · #2 Боюсь, замахаешься ты ее на делфи вызывать. Если не ошибаюсь, это метод класса. Тоесть тебе нужно восстановить бинарно-совместимый класс и из него звать эту функцию. Плюс необходимо обеспечить бинарную совместимость объекта std::string. Hint: напиши прокси-длл на msvc с экспортом функции в stdcall, которая будет вызывать эту функцию. А из делфей зову уже этот переходник. ----- старый пень ![]() |
|
Создано: 06 ноября 2011 00:11 · Личное сообщение · #3 |
|
Создано: 06 ноября 2011 02:07 · Личное сообщение · #4 |
|
Создано: 06 ноября 2011 02:56 · Личное сообщение · #5 |
|
Создано: 06 ноября 2011 04:04 · Поправил: reversecode · Личное сообщение · #6 функция на С++ выглядит так public: virtual class std::string __thiscall DecryptString(unsigned char const *,int,unsigned char const *,class std::string const &)const в ecx передается this а возращаемый аргумент std::string через стек первым параметром (RVO) в итоге преобразовывается в mov ecx, this; void DecryptString(std::string &, unsigned char *,int,unsigned char *,std::string &) и в итоге mov ecx, this DecryptString(&v20, v13, 8, v17, &v19); // void DecryptString(std::string &, unsigned char *,int,unsigned char *,std::string &) где имеем v20 - std::string v13 - unsigned char * 8 - int v17 - unsigned char * v19 - std::string не хватает в целом this который нужно искать декомпилируя всю программу и находя место создания обьекта и его уже и вызывать. но это все ерунда по сравнению с самой главной проблемой функция это _метод_ класса а не статическа, и значит зависит от параметров класса! приходящи через this(ecx) и по мере работы эти параметры как то меняются поэтому тупо вызвать функцию DecryptString и получить профит - н_е_п_о_л_у_ч_и_т_с_я. хотя можете попробовать, но варианты успеха у вас меньше 50% поэтому нужно реверсить всё, разбирая что там и отчего зависит и переписать весь алго на делфи ![]() |
|
Создано: 06 ноября 2011 08:37 · Личное сообщение · #7 |
|
Создано: 06 ноября 2011 15:51 · Личное сообщение · #8 |
|
Создано: 06 ноября 2011 16:35 · Личное сообщение · #9 |
|
Создано: 06 ноября 2011 21:54 · Личное сообщение · #10 Прошу прощение за заминку. Вот http://www.multiupload.com/3XHPAXIDD0 Библиотека называется LicenseTool.dll, там интересуют 2 функции: CCryptographer::DESEncryptString и CCryptographer::DESDecryptString они обратно совместимы. string = DESDecryptString (DESEncryptString(string)) Для вызова функций запускаем ActivateTool, пароль пустой, выбираем активация онлайн, и ввод серийного номера, серийный номер - 19AZ-1111-1111-1111 Единственное решение к которому пришел, это при вызове функции DESEncryptString, заменять кодируемую строку на свою... В map файле находятся некоторые распознанные функции из Crypto++. Требуется понять как самому вызвать DESEncryptString (из С, C# или Delphi) или занопить их, чтобы string = DESEncryptString(string) ![]() |
|
Создано: 06 ноября 2011 22:01 · Личное сообщение · #11 |
|
Создано: 06 ноября 2011 22:36 · Личное сообщение · #12 |
|
Создано: 06 ноября 2011 23:28 · Личное сообщение · #13 |
|
Создано: 07 ноября 2011 19:45 · Личное сообщение · #14 |
|
Создано: 07 ноября 2011 20:54 · Поправил: reversecode · Личное сообщение · #15 обьявить прототип функции на сях в сишном прокси модуле std::string DecryptString(unsigned char const *,int,unsigned char const *, std::string &) и присвоить ему адресс той функции из dll дальше можно вызывать предварительно подготовив std::string this указатель ему не нужен, он все равно затирается в функции, а значит не используется а уже апи самого прокси пихать обычные char *, int итд для работы с std::string что бы можно было работать с делфи add ну или если без прототипа, то то как я рассписывал выше какой параметр как куда пойдет ![]() |
|
Создано: 07 ноября 2011 22:30 · Личное сообщение · #16 reversecode не все так просто на тестовом примере -(Borland) Unhandled exception at 0x1002ce01 in lictool_decrypt_test.exe: 0xC0000005: Access violation reading location 0x00133000. VC - падает беззвучно Debugger: process has exited (exit code -1073741819) есть подозрение что падает часть внутри cryptopp (внутри длл остались assert с подсказками, например i:\project\3.2\dorcus26_3_2_21_17\licensetool\cryptopp552\cryptopp\cryptlib.h думаю надо создавать екземпляр класса CCryptographer и уже с ним работать ![]() |
|
Создано: 07 ноября 2011 22:36 · Поправил: reversecode · Личное сообщение · #17 |
|
Создано: 07 ноября 2011 22:48 · Личное сообщение · #18 reversecode дальше можно вызывать предварительно подготовив std::string Вот здесь собака и зарыта, в Дельфи объект std::string не создать, да и в VC могут быть с этим проблемы - нужна 100% идентичность не только студий, но также и параметров компиляции std модуля, причем абсолютно не важно как вызываются методы std::string статически или динамически. Мне приходилось подключать "чужие" dll с std классами к своему проекту - геморрою очень много... ----- Everything is relative... ![]() |
|
Создано: 07 ноября 2011 22:55 · Личное сообщение · #19 |
|
Создано: 07 ноября 2011 22:56 · Личное сообщение · #20 |
|
Создано: 07 ноября 2011 23:03 · Личное сообщение · #21 ну std::string вроде так что бы особо не менялся в позиции своих данных сам класс string даже в одной студии при разных опциях компиляции имеет 4 разных размера, не говоря о том, что есть DEBUG и RELEASE режимы Вот пример подгонки std классов в одинаковых студиях, причем в нем испльзованы ещё не все возможные опции компиляции Code:
----- Everything is relative... ![]() |
|
Создано: 07 ноября 2011 23:07 · Личное сообщение · #22 yanus0 пишет: Если все так трудно, тогда бог с ним. Выход вижу в создании снифера для получения нужных значений. столько мучений только ради этого?) а в дебагере поймать нельзя? Vamit пишет: сам класс string даже в одной студии при разных опциях компиляции имеет 4 разных размера, это все не имеет значения если выравнивание там одинаково и между данными не мешаются данные о дабеге и прочем что бы было понятно о чем мы говорим если есть класс Code:
то даже с включеным DEBUG он таким классом и останется другое дело если Code:
![]() |
|
Создано: 07 ноября 2011 23:13 · Личное сообщение · #23 reversecode ты полную структуру класса std::string представляешь? во всех студиях что видится юзеру - это один дворд - указатель на якобы строку, а фактически на класс хранилище самой строки, который и имеет переменный размер для разных опций компиляции... Если создать его с одними опциями и передать в вызываемую функцию, которая оперирует с классом созданным с другими опциями, то гарантировано исключение. ----- Everything is relative... ![]() |
|
Создано: 07 ноября 2011 23:34 · Личное сообщение · #24 |
|
Создано: 07 ноября 2011 23:59 · Личное сообщение · #25 |
|
Создано: 08 ноября 2011 00:14 · Личное сообщение · #26 тут нашел интересные идеи.... но надо чуток покодировать http://www.codeproject.com/KB/DLL/classesexportedusingLL.aspx в class CCryptographer - 16 методов включая екзотику public: class CCryptographer & __thiscall CCryptographer::operator=(class CCryptographer const &) а воообще беря во внимание замечания ув. Vamit - нету гарантий что ето пройдет по хорошему надо б .lib файл сделать (если ли такая утиль?) с входной длл, тогда можно пробовать статично линковать (ну и самому накидать хидер класса) ![]() |
|
Создано: 08 ноября 2011 00:15 · Поправил: reversecode · Личное сообщение · #27 |
|
Создано: 08 ноября 2011 00:32 · Поправил: Vamit · Личное сообщение · #28 по хорошему надо б .lib файл сделать (если ли такая утиль?) с входной длл, тогда можно пробовать статично линковать (ну и самому накидать хидер класса) Таких утилей нету, но это довольно просто делается в студии: 1. Создается dll проект с требуемым именем. 2. Создается def файлик с экспортируемыми функциями. 3. Создается cpp файлик с пустышками этих функций. 4. Можно создать h файлик объяв этих функций для включения в свой проект, хотя и необязательно. 5. Компилируем и получаем "пустой" lib файлик, который прекрасно хавается нашим проектом. ----- Everything is relative... ![]() |
|
Создано: 08 ноября 2011 00:54 · Личное сообщение · #29 |
|
Создано: 08 ноября 2011 01:35 · Личное сообщение · #30 reversecode пишет: не заморачивайся класс не нужен, функция статична Я по ходу вас ввел в заблуждение, пропатчив код: Code:
по адресу LicenseT.CLicenseManagerBase::ReadFile+123 на такой: Code:
Прошу прощения. http://www.multiupload.com/QAXNN7O2OS - библиотека без каких либо изменений. ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Вызов Сишной функции на Delphi |