Re[3]: Проблема с CPEncrypt
От: x64 Россия  
Дата: 04.09.08 22:03
Оценка: +1
MJ>Нет, проблема не в том как подменить, проблема как в длл вызвать процедуру, для этого нужно иметь
MJ>*.lib файл той длл в которой эта функция, а в самой длл она extern.
MJ>Но я не смог заставить линкер найти функция, т.е. нету у меня этого самого lib файла, который генериться вместе с либой.

Да не нужен тебе никакой .lib-файл! С помощью GetProcAddress() получаешь указатель на функцию, и по нему и вызываешь. Для тех, кто в танке, поясняю:

typedef
BOOL
(__stdcall* CPEncryptPtr) (
  HCRYPTPROV hProv,
  HCRYPTKEY hKey,
  HCRYPTHASH hHash,
  BOOL Final,
  DWORD dwFlags,
  BYTE* pbData,
  DWORD* pdwDataLen,
  DWORD dwBufLen);

//
// Получаем адрес оригинальной функции
//

...

HMODULE hModule = GetModuleHandle ("gpkcsp.dll"); // DLL может быть и другая, например, dssenh.dll или slbcsp.dll
CPEncryptPtr pFunction = GetProcAddress (hModule, "CPEncrypt");

//
// Здесь код подмены адреса в IAT
//

...

//
// Вызываем оригинальную функцию
//

BOOL bResult = pFunction (
  hProv,
  hKey,
  hHash,
  Final,
  dwFlags,
  pbData,
  pdwDataLen,
  dwBufLen);
Проблема с CPEncrypt
От: MadJackal Россия  
Дата: 04.09.08 13:24
Оценка:
Начну по порядку. Использую VS2005
Есть прога в которой нужно подменить вызов CPEncrypt из rsaenh.dll на свою функцию.
С тем как это сделать никаких проблем нету, но есть другая трабла. Сразу скажу что я не гуру в программирование на С.
Для выполнения поставленной задачи написал dll, которая инжектиться в процесс и заменяет в таблице импорта адрес нужной мне
функции на мою. Загвоздка в том, что мне нужно в своей функции вызвать реальную CPEncrypt();
но при вызове её линкер не может найти эту функцию.
Перерыл весь инет, похожего примера не нашёл.
Пытался сделать для этой длл файл импорта и подсунуть в проект.
Может тут где накосячил? но делал так:
dumpbin.exe /exports rsaenh.dll >> rsaenh.def
поправил файлик приведя его к виду :

EXPORTS
...
CPEncrypt@9
...

после этого lib /machine:ix86 /def:rsaenh.def
получил rsaenh.lib который и добавил в проект.
только это не помогло, линкер упорно ругается (Error 4 error LNK2019: unresolved external symbol _CPEncrypt@32 referenced in function _MyEncrypt@32 mydll.obj)

подскажите что можно сделать, или дайте линк на похожий пример использования таких функций.
С уважение, Сергей.

04.09.08 18:11: Перенесено модератором из 'C/C++' — Кодт
Re: Проблема с CPEncrypt
От: x64 Россия  
Дата: 04.09.08 16:48
Оценка:
MJ>Загвоздка в том, что мне нужно в своей функции вызвать реальную CPEncrypt();
MJ>но при вызове её линкер не может найти эту функцию.

Не вижу проблемы. GetProcAddress() для сохранения оригинального адреса, затем подмена.
Re[2]: Проблема с CPEncrypt
От: MadJackal Россия  
Дата: 04.09.08 21:20
Оценка:
Здравствуйте, x64, Вы писали:

MJ>>Загвоздка в том, что мне нужно в своей функции вызвать реальную CPEncrypt();

MJ>>но при вызове её линкер не может найти эту функцию.

x64>Не вижу проблемы. GetProcAddress() для сохранения оригинального адреса, затем подмена.


Нет, проблема не в том как подменить, проблема как в длл вызвать процедуру, для этого нужно иметь
*.lib файл той длл в которой эта функция, а в самой длл она extern.
Но я не смог заставить линкер найти функция, т.е. нету у меня этого самого lib файла, который генериться вместе с либой.
Пытался сам сделать его, но видимо не очень верно.
Т.е. если кратко линкер не может найти реализацию функции объявленной как extern.
Как вообще можно использовать CryptoAPI от M$, как подключать dll без lib файла, вот собственно вопрос.
правда сумбурно как-то получилось.
Re[4]: Проблема с CPEncrypt
От: MadJackal Россия  
Дата: 05.09.08 04:37
Оценка:
Здравствуйте, x64, Вы писали:

MJ>>Нет, проблема не в том как подменить, проблема как в длл вызвать процедуру, для этого нужно иметь

MJ>>*.lib файл той длл в которой эта функция, а в самой длл она extern.
MJ>>Но я не смог заставить линкер найти функция, т.е. нету у меня этого самого lib файла, который генериться вместе с либой.

x64>Да не нужен тебе никакой .lib-файл! С помощью GetProcAddress() получаешь указатель на функцию, и по нему и вызываешь. Для тех, кто в танке, поясняю: ...


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