PDA

View Full Version : مشکل در استفاده از ()GetProcAddress



4nti.g0d.71
چهارشنبه 28 تیر 1391, 16:51 عصر
با سلام.میخواستم خواهش کنم اگه میشه راهنمایی کنید. من برای استفاده از تابع GetProcAddress مشکل دارم.اول من dll مورد نظر رو بدون مشکل با LoadLibrary() لود کرده و handle اون رو بدست میارم،ولی برای انکه بتونم یه تابع داخل dll رو به استفاده از GetProcAddress بدست بیارم به مشکل بر میخورم، مثل اینکه اول باید یه سری چیزا رو با typedef اول تعریف کرد،نمیدونم،به هر حال خیلی ممنون میشم اگه راهنمایی کنید یا یه آموزش کامل اگه سراغ دارید معرفی کنید.با تشکر

fjm11100
پنج شنبه 29 تیر 1391, 18:26 عصر
http://www.ucancode.net/Visual_C_Codes/Loading-DLLs-LoadLibrary-GetProcAddress-FreeLibrary-VC-Example.htm

saeedIRHA
جمعه 30 تیر 1391, 02:20 صبح
سوالت یک ذره گنگ هست ، اما اگر میخواهی‌ آدرس تابع مورد نظرت رو پیدا کنی‌ میتونی‌ از این کد استفاده کنی‌ :


#include <iostream>
#include <windows.h>
using namespace std;

int main(int argc, char *argv[])
{
HINSTANCE hInstance = NULL;
PVOID addr=0;
if(argc !=3)
{
cerr << "Usage: " << argv[0] << " <DLL Name> <Function Name> " << endl;
exit(-1);
}
hInstance = LoadLibraryA(argv[1]);
if(hInstance != NULL)
{
addr = (PVOID)GetProcAddress(hInstance,argv[2]);
if(addr ==0)
{
cerr<< "[-]Address NOT Found :-(" << endl;
exit(-1);
}
cout<< "[+]Process Address is : 0x" << hex << addr <<endl;;
FreeLibrary(hInstance);
}else{
cerr<< "[-]Cannot load the Library. :-(" << endl;
exit(-1);
}
return 0;
}

4nti.g0d.71
جمعه 30 تیر 1391, 12:33 عصر
اول ممونم از کمکتون. اما من اول با LoadLibrary فایل dll رو به درستی لود کردم و تو این مرحله مشکلی نداشتم. مشکل من استفاه از GetProcAddress هست که هروقت استفاده میکنم NULL برمیگردونه. همینطور که میدونید آرگومان اول این تابع handle به dll هست و آرگومان دوم اسم تابعی که تو dll هست. اما من هروقت تابع و فراخوانی میکنم NULL برمیگردونه ، شاید مشکل از dll باشه،نمیدونم،اگه میشه بیشتر راهنمایی کنید.

#target
جمعه 30 تیر 1391, 12:57 عصر
ببینید اسم تابع داخل Export Table اون DLL وجود داره یا نه
بعلاوه میتونید بعد از فراخوانی تابع GetProcAddress بیاید تابع GetLastError رو فواخوانی کنی تا ببینی کد خطا چیه . !

4nti.g0d.71
جمعه 30 تیر 1391, 14:05 عصر
با تشکر از شما،ولی من تقریبا مبتدی هستم، نمیدونم export table منظورتون چیه! میشه توضیح بدید چطوری میشه از GetLastError استفاده کرد؟

tdkhakpur
جمعه 30 تیر 1391, 14:37 عصر
به احتمال زیاد تابعی که داخل dll ساختی بصورت تابه خروجی یا همون export نشده که بتونه تو همون جدول بالایی که بشه اشاره کردید قرار بگیره به همین دلیل تابع رو اصلاح کنید.
اساس اگه dll درست باشه یه دونه _ باید به اول تابع که میخایید فراخوانی کنید اضافه میشه اما اگه c_call تعریف شده باشه خط _ وجود نداره.یعنی به دو نوع زیر میتونه تعریف شده باشه

addr = (PVOID)GetProcAddress(hInstance,"_procname");
یا
addr = (PVOID)GetProcAddress(hInstance,"procname");

#target
جمعه 30 تیر 1391, 14:45 عصر
با استفاده از برنامه CFF Explorer (http://www.ntcore.com/exsuite.php) فایل DLL رو باز کنید برید به بخش Export Table ببینید چه توابع و نام هایی Export شده !
تابع GetLastError هم خودشو فراخوانی کنی که ی مقدار عددی برمیگردونه
int i = GetLastError();
میتونی با استفاده از این ثابت ها (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx)ببینی خطا چیه

4nti.g0d.71
جمعه 30 تیر 1391, 14:46 عصر
خیلی ممنونم دوست عزیز، ولی همونطور که گفتم من مبتدی هستم، اگه آموزشی سراغ دارید که نحوی ساختن یه dll ساده که بعد بهش با استفاده از GetProcAddress از اون تابع export کرد رو تو توضیح بده خیلی ممنون میشم :قلب:

4nti.g0d.71
جمعه 30 تیر 1391, 15:03 عصر
با استفاده از برنامه CFF Explorer (http://www.ntcore.com/exsuite.php) فایل DLL رو باز کنید برید به بخش Export Table ببینید چه توابع و نام هایی Export شده !
تابع GetLastError هم خودشو فراخوانی کنی که ی مقدار عددی برمیگردونه
int i = GetLastError();
میتونی با استفاده از این ثابت ها (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx)ببینی خطا چیه

شما درست میگفتید.همونطوری که خودم هم میگفتم فکر میکنم مشکل از dll باشه. getlasterror هم این ارور رو نشون داده :
ERROR_PROC_NOT_FOUND
127 (0x7F)
The specified procedure could not be found.
حالا نمیدونم باید چیکار کرد :ناراحت:

tdkhakpur
جمعه 30 تیر 1391, 15:10 عصر
این یه نمونه از سورس dll هست ,و با dll خودتان مقایسه کرده و تغییرش بدید
extern "C" __declspec(dllexport) long AppProc(void);
//---------------------------------------------------------------------------
long AppProc (void)
{
return 0;
}

و بصورت زیر فراخوانی کنید.
addr = (PVOID)GetProcAddress(hInstance,"_AppProc");