Сейчас на форуме: _MBK_, Adler (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Вызов Сишной функции на Delphi
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 05 ноября 2011 22:52
· Личное сообщение · #1

Здравствуйте.
Нужно вызвать одну функцию на си из проекта на делфи. В CFF Explorer информация о ней такая:
Code:
  1. public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall DecryptString(unsigned char const *,int,unsigned char const *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const

Ida говорит такое:
DecryptString(&v20, v13, 8, v17, &v19);
С какими параметрами мне следует вызывать ее на Delphi?
Спасибо.



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

Создано: 05 ноября 2011 23:24
· Личное сообщение · #2

Боюсь, замахаешься ты ее на делфи вызывать.
Если не ошибаюсь, это метод класса. Тоесть тебе нужно восстановить бинарно-совместимый класс и из него звать эту функцию. Плюс необходимо обеспечить бинарную совместимость объекта std::string.
Hint: напиши прокси-длл на msvc с экспортом функции в stdcall, которая будет вызывать эту функцию. А из делфей зову уже этот переходник.

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





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 06 ноября 2011 00:11
· Личное сообщение · #3

дешевле будет реверснуть и переписать ее на делфи
чем реализовывать на делфи std::string со всеми методами



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

Создано: 06 ноября 2011 02:07
· Личное сообщение · #4

напрямую видимо не получится, поскольку std::string - шаблонный клас, коих в Дельфи нету (аль есть?)
метод r_e вроде самое оно малой кровью (если не охота RE оригинала)



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 06 ноября 2011 02:56
· Личное сообщение · #5

r_e
Ок. Я в си полный ноль, хоть примерный вариант на псевдокоде, как должен выглядеть вызов этой функции из прокси-длл?...




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 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%

поэтому нужно реверсить всё, разбирая что там и отчего зависит
и переписать весь алго на делфи




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 06 ноября 2011 08:37
· Личное сообщение · #7

Был бы предоставлен бинарник, можно было бы сказать больше. Может там вообще по VA можно нужное дернуть.

-----
Yann Tiersen best and do not fuck





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 06 ноября 2011 15:51
· Личное сообщение · #8

а не легче это на си написать то, что нужно на делфи?



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

Создано: 06 ноября 2011 16:35
· Личное сообщение · #9

yanus0
киньте в студию свой файл
народ хочет помочь а не на чем



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 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)



Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 06 ноября 2011 22:01
· Личное сообщение · #11

Так если это ДЕС, нафига вообще эти пляски? Для дельфей возьми DCPCrypt да дерни ключ для дес-а из твоей функи.

-----
SaNX




Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 06 ноября 2011 22:36
· Личное сообщение · #12

SaNX
Это вариант, но у меня не получилось на С#. Делал так, строку переводил в байтовое представление и расшифровывал, далее массив байт в строку.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 06 ноября 2011 23:28
· Личное сообщение · #13

функция вроде статическая
можно звать ее не создавая обьект



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 07 ноября 2011 19:45
· Личное сообщение · #14

reversecode
А как вызвать на С эту функцию?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 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
ну или если без прототипа, то то как я рассписывал выше какой параметр как куда пойдет



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

Создано: 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 и уже с ним работать




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 ноября 2011 22:36 · Поправил: reversecode
· Личное сообщение · #17

обьект там не используется
покажи код проксика,ну или код с которым ты вызываешь
и попробуй поймать дебагером где ассерт вызывается




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

Создано: 07 ноября 2011 22:48
· Личное сообщение · #18

reversecode
дальше можно вызывать
предварительно подготовив std::string

Вот здесь собака и зарыта, в Дельфи объект std::string не создать, да и в VC могут быть с этим проблемы - нужна 100% идентичность не только студий, но также и параметров компиляции std модуля, причем абсолютно не важно как вызываются методы std::string статически или динамически.

Мне приходилось подключать "чужие" dll с std классами к своему проекту - геморрою очень много...

-----
Everything is relative...





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 ноября 2011 22:55
· Личное сообщение · #19

ну std::string вроде так что бы особо не менялся в позиции своих данных
дворд на каждую позицию
разве что пробовать угадать компилятор которым собрана именно та dll
и компилировать проксик или тест тем компилем тогда и std тот же подцепится



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 07 ноября 2011 22:56
· Личное сообщение · #20

Если все так трудно, тогда бог с ним. Выход вижу в создании снифера для получения нужных значений. Пока не закрываю, может кто-то даст какую-то наводку... Спасибо все откликнувшимся.




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

Создано: 07 ноября 2011 23:03
· Личное сообщение · #21

ну std::string вроде так что бы особо не менялся в позиции своих данных
сам класс string даже в одной студии при разных опциях компиляции имеет 4 разных размера, не говоря о том, что есть DEBUG и RELEASE режимы
Вот пример подгонки std классов в одинаковых студиях, причем в нем испльзованы ещё не все возможные опции компиляции
Code:
  1. #ifdef _DEBUG
  2.          #define _HAS_ITERATOR_DEBUGGING       1
  3.          #define _SECURE_SCL                  0
  4. #else
  5.          #define _HAS_ITERATOR_DEBUGGING       0
  6.          #define _SECURE_SCL                  1
  7. #endif
  8.  
  9. #include <stdexcept>
  10. #include <list>
  11. #include <vector>
  12. #include <map>
  13. #include <set>
  14. #include <utility>
  15. #include <string>
  16. #include <algorithm>


-----
Everything is relative...


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


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 ноября 2011 23:07
· Личное сообщение · #22

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

столько мучений только ради этого?)
а в дебагере поймать нельзя?

Vamit пишет:
сам класс string даже в одной студии при разных опциях компиляции имеет 4 разных размера,

это все не имеет значения если выравнивание там одинаково
и между данными не мешаются данные о дабеге и прочем

что бы было понятно о чем мы говорим

если есть класс
Code:
  1. class mystr
  2. {
  3.    int a;
  4.   int b;
  5. #if DEBUG
  6.   char a;
  7. #endif
  8. };

то даже с включеным DEBUG он таким классом и останется
другое дело если
Code:
  1. class mystr
  2. {
  3.    int a;
  4. #if DEBUG
  5.   char a;
  6. #endif
  7.   int b;
  8. };





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

Создано: 07 ноября 2011 23:13
· Личное сообщение · #23

reversecode
ты полную структуру класса std::string представляешь? во всех студиях что видится юзеру - это один дворд - указатель на якобы строку, а фактически на класс хранилище самой строки, который и имеет переменный размер для разных опций компиляции... Если создать его с одними опциями и передать в вызываемую функцию, которая оперирует с классом созданным с другими опциями, то гарантировано исключение.

-----
Everything is relative...





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 ноября 2011 23:34
· Личное сообщение · #24

шаблонный класс что его представлять
но то каким образом при определенных компиляциях он меняет свою структуру что не возможно его использовать, я не вижу в его шаблонах

ассерт кстати упал не в std::string а в программе
там рядом с ним даже проверка есть в тексте, но место ассерта названо небыло



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 07 ноября 2011 23:59
· Личное сообщение · #25

reversecode пишет:
столько мучений только ради этого?)
а в дебагере поймать нельзя?

Поймать, то я поймал, но задача не разовая, потому и спрашивал. Если с наскоку у вас не получилось, то не нужно заморачиватся - буду делать через попу.



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

Создано: 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 файл сделать (если ли такая утиль?) с входной длл, тогда можно пробовать статично линковать (ну и самому накидать хидер класса)




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 08 ноября 2011 00:15 · Поправил: reversecode
· Личное сообщение · #27

вся эта функция полностью построена на библиотеке cryptopp552.zip
они ничего своего вроде даже не писали
просто скомпоновали все примитивы с той библиотеки и получили DESDecryptString

sendersu
не заморачивайся класс не нужен, функция статична
лучше покажи ассерт на котором упало,




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

Создано: 08 ноября 2011 00:32 · Поправил: Vamit
· Личное сообщение · #28

по хорошему надо б .lib файл сделать (если ли такая утиль?) с входной длл, тогда можно пробовать статично линковать (ну и самому накидать хидер класса)
Таких утилей нету, но это довольно просто делается в студии:
1. Создается dll проект с требуемым именем.
2. Создается def файлик с экспортируемыми функциями.
3. Создается cpp файлик с пустышками этих функций.
4. Можно создать h файлик объяв этих функций для включения в свой проект, хотя и необязательно.
5. Компилируем и получаем "пустой" lib файлик, который прекрасно хавается нашим проектом.

-----
Everything is relative...




Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 08 ноября 2011 00:54
· Личное сообщение · #29

?
http://www.binary-soft.com/dll2lib/dll2lib.htm



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 08 ноября 2011 01:35
· Личное сообщение · #30

reversecode пишет:
не заморачивайся класс не нужен, функция статична

Я по ходу вас ввел в заблуждение, пропатчив код:
Code:
  1. 1000EB71          |.  8B4C24 1C     MOV ECX,DWORD PTR SS:[ESP+1C]
  2. 1000EB75          |.  8D5424 2C     LEA EDX,DWORD PTR SS:[ESP+2C]
  3. 1000EB79          |.  52            PUSH EDX
  4. 1000EB7A          |.  8B5424 28     MOV EDX,DWORD PTR SS:[ESP+28]
  5. 1000EB7E          |.  52            PUSH EDX
  6. 1000EB7F          |.  8B5424 1C     MOV EDX,DWORD PTR SS:[ESP+1C]
  7. 1000EB83          |.  6A 08         PUSH 8
  8. 1000EB85          |.  BF 01000000   MOV EDI,1
  9. 1000EB8A          |.  897C24 7C     MOV DWORD PTR SS:[ESP+7C],EDI
  10. 1000EB8E          |.  8B81 4C010000 MOV EAX,DWORD PTR DS:[ECX+14C]
  11. 1000EB94          |.  8B40 30       MOV EAX,DWORD PTR DS:[EAX+30]
  12. 1000EB97          |.  81C1 4C010000 ADD ECX,14C
  13. 1000EB9D          |.  52            PUSH EDX
  14. 1000EB9E          |.  8D5424 58     LEA EDX,DWORD PTR SS:[ESP+58]
  15. 1000EBA2          |.  52            PUSH EDX
  16. 1000EBA3          |.  FFD0          CALL EAX

по адресу LicenseT.CLicenseManagerBase::ReadFile+123
на такой:
Code:
  1. 1000EB71          |.  8B4C24 1C     MOV ECX,DWORD PTR SS:[ESP+1C]
  2. 1000EB75          |.  8D5424 2C     LEA EDX,DWORD PTR SS:[ESP+2C]
  3. 1000EB79          |.  52            PUSH EDX                                                          ; /Arg5
  4. 1000EB7A          |.  8B5424 28     MOV EDX,DWORD PTR SS:[ESP+28]                                     ; |
  5. 1000EB7E          |.  52            PUSH EDX                                                          ; |Arg4
  6. 1000EB7F          |.  8B5424 1C     MOV EDX,DWORD PTR SS:[ESP+1C]                                     ; |
  7. 1000EB83          |.  6A 08         PUSH 8                                                            ; |Arg3 = 00000008
  8. 1000EB85          |.  BF 01000000   MOV EDI,1                                                         ; |
  9. 1000EB8A          |.  897C24 7C     MOV DWORD PTR SS:[ESP+7C],EDI                                     ; |
  10. 1000EB8E          |.  81C1 4C010000 ADD ECX,14C                                                       ; |
  11. 1000EB94          |.  52            PUSH EDX                                                          ; |Arg2
  12. 1000EB95          |.  8D5424 58     LEA EDX,DWORD PTR SS:[ESP+58]                                     ; |
  13. 1000EB99          |.  52            PUSH EDX                                                          ; |Arg1
  14. 1000EB9A          |.  E8 B16FFFFF   CALL LicenseT.CCryptographer::DESDecryptString                    ; \CCryptographer::DESDecryptString
  15. 1000EB9F          |.  90            NOP
  16. 1000EBA0          |.  90            NOP
  17. 1000EBA1          |.  90            NOP
  18. 1000EBA2          |.  90            NOP
  19. 1000EBA3          |.  90            NOP
  20. 1000EBA4          |.  90            NOP

Прошу прощения.
http://www.multiupload.com/QAXNN7O2OS - библиотека без каких либо изменений.


. 1 . 2 . >>
 eXeL@B —› Вопросы новичков —› Вызов Сишной функции на Delphi
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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