Сейчас на форуме: _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?
Спасибо.




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

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

выш код совершенно не причем

Code:
  1. .text:10005B50 ?DESDecryptString@CCryptographer@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PBEH0ABV23@@Z proc near
  2. .text:10005B50
  3. .text:10005B50 var_138         = dword ptr -138h
  4. .text:10005B50 var_134         = dword ptr -134h
  5. .text:10005B50 var_130         = dword ptr -130h
  6. .text:10005B50 var_12C         = dword ptr -12Ch
  7. .text:10005B50 var_128         = dword ptr -128h
  8. .text:10005B50 var_124         = dword ptr -124h
  9. .text:10005B50 var_120         = byte ptr -120h
  10. .text:10005B50 var_114         = byte ptr -114h
  11. .text:10005B50 VBv13           = byte ptr -0E8h
  12. .text:10005B50 var_C           = dword ptr -0Ch
  13. .text:10005B50 var_4           = dword ptr -4
  14. .text:10005B50 resa1           = dword ptr  8
  15. .text:10005B50 var13a2         = dword ptr  0Ch
  16. .text:10005B50 lena3           = dword ptr  10h
  17. .text:10005B50 v17a4           = dword ptr  14h
  18. .text:10005B50 v19a5           = dword ptr  18h
  19. .text:10005B50
  20. .text:10005B50                 push    ebp
  21. .text:10005B51                 mov     ebp, esp
  22. .text:10005B53                 and     esp, 0FFFFFFF8h
  23. .text:10005B56                 push    0FFFFFFFFh
  24. .text:10005B58                 push    offset sub_1004BA78
  25. .text:10005B5D                 mov     eax, large fs:0
  26. .text:10005B63                 push    eax
  27. .text:10005B64                 sub     esp, 130h
  28. .text:10005B6A                 push    ebx
  29. .text:10005B6B                 push    esi
  30. .text:10005B6C                 push    edi
  31. .text:10005B6D                 mov     eax, ___security_cookie
  32. .text:10005B72                 xor     eax, esp
  33. .text:10005B74                 push    eax
  34. .text:10005B75                 lea     eax, [esp+14Ch+var_C]
  35. .text:10005B7C                 mov     large fs:0, eax
  36. .text:10005B82                 mov     ecx, [ebp+v17a4]

последняя строка, ecx затерся стеком
значит this обьекта не передается
функция статична для вывозова

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


если кто то захочет сделать сигнатуры от cryptopp552.zip
то ваша dll вообще по многим функциям распознается
а DESDecryptString полностью



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

Создано: 08 ноября 2011 02:30 · Поправил: r_e
· Личное сообщение · #3

yanus0
Давайте глянем чо внутрях
Code:
  1. .text:10005B50 ; int __stdcall CCryptographer__DESDecryptString(int aThis, int aDesCfbKey, int aDesCfbSize, int aDesCfbIv, int aString)
  2. .text:10005BAE 160                 call    CryptoPP_DesCfbDecryptor_ctor
  3. .text:10005C22 154                 call    StringSinkTemplate_ctor
  4. .text:10005C55 150                 call    PrepareHexToIntBuffer
  5. .text:10005C92 158                 call    StringSourceCryptoPP_StringSource
  6. .text:10005CA4 150                 call    CryptoPP_DesCfbDecryptor_dtor

и попробуем смоделировать это все на С++
Code:
  1. using namespace CryptoPP;
  2. CFB_Mode<DES>::Decryption lDecryptor(aKey, aKeySize, aIv);
  3. std::string lDst;
  4.  
  5. StringSource(aString,
  6.   new HexDecoder(
  7.     new StreamTransformationFilter(lDecryptor,
  8.       new StringSink(lDst)
  9.     ) // StreamTransformationFilter
  10.   ) // HexDecoder
  11. ); // StringSource

Если не будет компилироваться попробуйте
StringSource(aString, true,...


p.s. По поводу статики, конечно, вопрос неоднозначный. =)
Тогда первым параметром по коду должен получиться или результат или исходная строка. Разбираться влом. Да и не важно это. Тырьте key + iv и пишите свой генератор.

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





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

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

r_e это не this это RVO
this в нее передается вроде через ecx, но так же с успехом и затирается, тоесть не используется

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

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

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

reversecode
Да, да. Тупанул немного. Таки RVO. Тем лучше.

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




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

Создано: 08 ноября 2011 03:45 · Поправил: sendersu
· Личное сообщение · #6

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


сделал (експортнул весь клас-пустышку), все равно падает (Access Violation), видимо нестыковка по debug/release или другим параметрам....
но клас
CCryptographer* cr = new CCryptographer();
создался

возможно задаю неправильные аргументы, дайте пример прав. вызова, пожалуйста.


интерфейс класса

[code]
#pragma once

#include <string>

#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#pragma message("linking to LicenseTool.lib")
#pragma comment(lib, "LicenseTool.lib")
#define DLL_API __declspec(dllimport)
#endif


class DLL_API CCryptographer
{
public:
CCryptographer(CCryptographer const &);
CCryptographer(void);
virtual ~CCryptographer();

CCryptographer & operator=(CCryptographer const &);

virtual std::string DESDecryptString(unsigned char const *,int,unsigned char const *, std::string const &)const;
virtual std::string DESEncryptString(unsigned char const *,int,unsigned char const *, std::string const &)const;
virtual void GenerateBlock(unsigned char *,int) const;
virtual void GenerateRSAKey(unsigned int, std::string &, std::string &,char const *)const ;
virtual void GenerateRSAKey(unsigned int,char const *,char const *,char const *)const ;

virtual std::string RSADecryptString(std::string const &,char const *)const ;
virtual std::string RSADecryptString(char const *,char const *)const ;
virtual std::string RSAEncryptString(std::string const &,char const *,char const *)const ;
virtual std::string RSAEncryptString(char const *,char const *,char const *)const ;
virtual std::string RSASign(std::string const &, std::string const &)const ;
virtual std::string RSASign(char const *, std::string const &)const ;
virtual bool RSAVerify(char const *,char const *,char const *,int)const ;
};
[/code]




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

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

все равно падает (Access Violation), видимо нестыковка по debug/release или другим параметрам....
Ты какую студию используешь? Либа LicenseTool.dll компилилась VisualStudio 2005 name="Microsoft.VC80.CRT" version="8.0.50727.762", поэтому и для своего проекта нужно использовать эту студию или искать новую либу под соответствующую студию, иначе в передаче STL объектов из проги в либу и наоборот будут несоответсвия, что приведет к ассертам и исключениям...

-----
Everything is relative...




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

Создано: 08 ноября 2011 11:24
· Личное сообщение · #8

Да, у меня VS2008 SP1 (интересно влият ли еще SP на рез-т компиляциии )
вечером более детально продебажу место упадки




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

Создано: 08 ноября 2011 11:49
· Личное сообщение · #9

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

-----
Everything is relative...



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


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