PDA

View Full Version : GetProcAddress



amir_civil
شنبه 12 بهمن 1387, 22:20 عصر
با سلام
دوستان کسی میتونه در مورد نحوه کارکرد این تابع اطلاعاتی بده و اینکه چه جوری ادرس رو پیدا میکنه
ممنون


FARPROC WINAPI GetProcAddress(
__in HMODULE hModule,
__in LPCSTR lpProcName
);

Naruto
یک شنبه 13 بهمن 1387, 00:55 صبح
به کمک این تابع میتونید تابع هایی را که تو یه dll قرار دارن فراخوانی کنید.
پارامتر اول Handle مربوط به ماژول هست که با کمک تابع LoadLibrary بدست میارید.
دومی هم اسم تابعی هست که تو dll قرار داره و میخواهید ازش استفاده کنید.

amir_civil
یک شنبه 13 بهمن 1387, 15:34 عصر
سلام
دوست من من منظورم این بود که به چه صورت کار میکنه و اگر بهخاهیم یه چنین تابعی بنویسیم باید چه کار کنیم

Sh4DoVV
یک شنبه 20 بهمن 1387, 06:22 صبح
با سلام
در زبان VB به این صورت استفاده میشه


Dim lb as Long
Dim fnc as long
lb=LoadLibrary("user32")
fnc=GetProcAddress(lb,"MessageBoxA")

که در این مثال آدرس تابه MessageBoxA رو در متغیر fnc میریزه
اگر زبان برنامه نویسی خاصی دیگه در نظرته بگو تا اونم بگیم
یا علی :لبخندساده:

amir_civil
یک شنبه 20 بهمن 1387, 11:20 صبح
سلام

اگر زبان برنامه نویسی خاصی دیگه در نظرته بگو تا اونم بگیم
ممنون من خودم بلدم شما منظور من رو اشتباه متوجه شدید

که در این مثال آدرس تابه MessageBoxA رو در متغیر fnc میریزه
خوب این ادرس رو چه جوری پیدا میکنه منظور من این بود نه نحوه استفاده از تابع
ممنون

vcldeveloper
یک شنبه 20 بهمن 1387, 16:52 عصر
هر فایل DLL یک جدول از توابع Export شده نگهداری میکنه. این تابع میتونه با مراجعه به اون جدول، و پیدا کردن مدخل مربوط به اون تابع، آدرس تابع را از جدول پیدا کنه.

amir_civil
یک شنبه 20 بهمن 1387, 18:17 عصر
سلام
دسترسی به این جدول چگونه است؟

vcldeveloper
دوشنبه 21 بهمن 1387, 01:01 صبح
دسترسی به این جدول چگونه است؟
درباره ساختار فایل های PE تحقیق کنید.

amir_civil
دوشنبه 21 بهمن 1387, 12:48 عصر
ممنون
این سورس هم تونستم پیدا کنم


.386
.model flat, stdcall
option casemap:none

include \masm32\include\comctl32.inc
includelib \masm32\lib\comctl32.lib


.code
DLLStart dd 0
KernelStart dd 0
ExportStart dd 0
PEStart dd 0
LoadLib dd 0
shell32 db "User32.dll",0
text db "Test, Test, 1,2,3",0

start:
invoke InitCommonControls

mov edx, [esp] ;; Offset of function in Kernel32.dll
xor dx, dx ;; Align to 1000h
@Label:
sub edx, 1000h ;; search next page
cmp word ptr [edx], 'ZM' ;; MZ header?
jne @Label ;; If not, then keep searching

mov KernelStart, edx

mov ebx, 0A216A185h
call FindAPI
mov LoadLib, eax

push OFFSET shell32
call LoadLib

mov ebx, 9A9C4525h
mov edx, eax
call FindAPI

push edx

push 0
push OFFSET text
push OFFSET text
push 0
call eax

mov ebx, 0B36E72B3h
mov edx, KernelStart
call FindAPI

call eax
ret


;; EDX must hold the offset of the MZ header, EBX the checksum
FindAPI:
push edx
mov DLLStart, edx
mov ecx, [edx+3Ch] ;; PE header
add ecx, edx ;; Normalize offset
mov PEStart, ecx
mov ecx, [ecx+78h] ;; Pointer to Export Table
add ecx, edx ;; Normalize offset
mov ExportStart, ecx
mov edx, [ecx+18h] ;; Number of Exports
mov ecx, [ecx+20h] ;; Pointer To Pointer to Exports Names
add ecx, DLLStart ;; Normalize offset
@Loop:
xor edi, edi
mov esi, [ecx] ;; Pointer To Export #n
add esi, DLLStart ;; Normalize offset
xor eax, eax
push ecx
@Loop2:
lodsb ;; Load char of API name into esi
mov ecx, eax
add edi, eax ;; checksum of API name - Part 1
rol edi, cl ;; checksum of API name - Part 2
test eax, eax
jne @Loop2
pop ecx
cmp edi, ebx ;; Checksum found ?
je @Found ;; API found

add ecx, 4 ;; Next pointer to API Name
dec edx ;; Still APIs to go?
jne @Loop ;; If so, jump
pop edx
xor eax, eax
ret

@Found:
mov eax, DLLStart
mov ecx, ExportStart
mov ebx, [ecx+18h] ;; Number of Exports
mov ecx, [ecx+24h] ;; Pointer To Ordinals
add ecx, eax ;; Normalize offset
sub ebx, edx ;; EBX = Number of Ordinals - API we want

shl ebx, 1
add ecx, ebx

movzx ebx, word ptr [ecx] ;; Ordinal of our API

mov ecx, ExportStart
mov ecx, [ecx+1Ch] ;;
add ecx, eax ;; Normalize offset
shl ebx, 2 ;; Expand to DWORD size
add ecx, ebx ;; Point to offset where our API begins
add eax, [ecx] ;; Add that offset to Kernel32.dll start
pop edx
ret
end start

saeedIRHA
دوشنبه 21 بهمن 1387, 13:26 عصر
اين هم کد اين برنامه که نوشتم با ++C برای دوستان علاقمند


/*
* File: DLL-Proc-Addr.cpp
* Written by: SaEeD
* Obtaining Hex address of function in DLL
* Output:
* D:\NetBeansProjects\DLL-Loader>DLL-Proc-Addr.exe kernel32 LoadLibraryA
* [+]Obtaining Module Handle from DLL
* [+]Process Name: LoadLibraryA
* [+]Get Process Address: 0x7c801d7b
* [+]Termintating application.
*/

#include <stdlib.h>
#include <windows.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
HINSTANCE hInstance = NULL;
HMODULE hModule = NULL;
DWORD value;

if(argc != 3 )
{
cerr << "[-]Usage: " << argv[0] << " <DLL File> <Proccess Name>" << endl;
exit(1);
}
hModule = LoadLibrary(argv[1]);
if(hModule == NULL)
{
cout << "[!]Error in Loading Library: " << GetLastError() << endl;
exit(1);
}
cout << "[+]Obtaining Module Handle from DLL "<< endl;
value = (DWORD)GetProcAddress(hModule,argv[2]);

if(value == 0)
{
cout << "[!]Error in Process : " << GetLastError() << endl;
exit(1);
}
cout << "[+]Process Name: " << argv[2] << endl;
printf("[+]Get Process Address: 0x%x\n" , value );
cout << "[+]Termintating application." << endl;

return (EXIT_SUCCESS);
}

amir_civil
دوشنبه 21 بهمن 1387, 22:18 عصر
value = (DWORD)GetProcAddress(hModule,argv[2]);

شما توسط تابعGetProcAddress ادرس رو بدست اوردید ولی بدون اون چی؟
از دوستان کسی لطف میکنه و اون کد اسمبلی رو به سی++ تبدیل کنه؟