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);
Начну по порядку. Использую 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++' — Кодт
Здравствуйте, x64, Вы писали:
MJ>>Нет, проблема не в том как подменить, проблема как в длл вызвать процедуру, для этого нужно иметь
MJ>>*.lib файл той длл в которой эта функция, а в самой длл она extern.
MJ>>Но я не смог заставить линкер найти функция, т.е. нету у меня этого самого lib файла, который генериться вместе с либой.
x64>Да не нужен тебе никакой .lib-файл! С помощью GetProcAddress() получаешь указатель на функцию, и по нему и вызываешь. Для тех, кто в танке, поясняю: ...
Точно, что-то я даже не догадался таки сделать, хотя в коде использую такой же метод для получения указателя на оригинальную функцию

Спасибо.