PDA

View Full Version : سوال: تشخیص وجود تابع در dll



Mask
شنبه 12 اسفند 1391, 13:40 عصر
با سلام :
من توسط کد زیر وجود یک تابع رو در یک dll بررسی میکنم.
آیا این روش درسته؟
آیا راه حل ساده تری وجود داره؟
ممنون.

function LoadAndRunDLLProcedure(sDLL, sFunc: string): boolean;
type
TFunc_Start = procedure(i: integer);
var
Func_Start: TFunc_Start;
hDll: THandle;
FuncPtr: TFarProc;
begin
Result := False;
hDll := LoadLibrary(PChar(sDLL));
if (hDll > 32) then
begin
FuncPtr := GetProcAddress(hDll, PChar(sFunc));
@Func_Start := FuncPtr;
if (FuncPtr <> nil) then
Result := True
else
Result:=False;
FuncPtr := Nil;
FreeLibrary(hDll);
end
else
begin
Result:=False;
FuncPtr := Nil;
FreeLibrary(hDll);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
R: boolean;
begin
R := LoadAndRunDLLProcedure('dll.dll', 'Test');
ShowMessage(BoolToStr(R, True));
end;

یوسف زالی
دوشنبه 14 اسفند 1391, 04:43 صبح
سلام.
به نظر من هم راه درسته.
اما اگر به صورت استاتیک دنبال قضیه هستی با نرم افزارهایی مثل Exescope می تونی لیستی از Export ها رو بدست بیاری.
اگر به مباحث PE آشنایی داری می تونی از سکشن EDATA یا RELOC لیستشون رو دراری. البته راه ساده ترش استفاده از دستورات لود کردن این سکشن ها در خود دلفی هست.

بهروز عباسی
دوشنبه 14 اسفند 1391, 19:34 عصر
درود

اگر به مباحث PE آشنایی داری می تونی از سکشن EDATA یا RELOC لیستشون رو دراری. البته راه ساده ترش استفاده از دستورات لود کردن این سکشن ها در خود دلفی هست.

قبلاً یه برنامه نوشتم که مشکلتو حل میکنه ،:لبخند:
سورس نرم افزار PEID نسخه Alpha به زبان دلفی. (http://barnamenevis.org/showthread.php?358824-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D9%86%DB%8C%D8%AF-%D8%B3%D9%88%D8%B1%D8%B3-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-PEID-%D9%86%D8%B3%D8%AE%D9%87-Alpha-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%AF%D9%84%D9%81%DB%8C.)



موفق باشید.

Valadi
دوشنبه 14 اسفند 1391, 21:09 عصر
با اين نرم افزار (http://www.nirsoft.net/utils/dllexp.zip) مي تونيد كار تون انجام بديد

Mask
سه شنبه 15 اسفند 1391, 13:01 عصر
ممنون از همه:
اما سوال این بود که در برنامه خودم این بررسی رو انجام بدم ، نه توسط یه برنامه جانبی:

با اين نرم افزار مي تونيد كار تون انجام بديد

قبلاً یه برنامه نوشتم که مشکلتو حل میکنه ،
سورس نرم افزار PEID نسخه Alpha به زبان دلفی.

samani
سه شنبه 15 اسفند 1391, 13:51 عصر
گرفتن ليست كامل متدهاي يك DLL


uses
ImageHlp;

procedure ListDLLExports(const FileName: string; List: TStrings);
type
TDWordArray = array [0..$FFFFF] of DWORD;
var
imageinfo: LoadedImage;
pExportDirectory: PImageExportDirectory;
dirsize: Cardinal;
pDummy: PImageSectionHeader;
i: Cardinal;
pNameRVAs: ^TDWordArray;
Name: string;
begin
List.Clear;
if MapAndLoad(PChar(FileName), nil, @imageinfo, True, True) then
begin
try
pExportDirectory := ImageDirectoryEntryToData(imageinfo.MappedAddress,
False, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize);
if (pExportDirectory <> nil) then
begin
pNameRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
DWORD(pExportDirectory^.AddressOfNames), pDummy);
for i := 0 to pExportDirectory^.NumberOfNames - 1 do
begin
Name := PChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
pNameRVAs^[i], pDummy));
List.Add(Name);
end;
end;
finally
UnMapAndLoad(@imageinfo);
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
List: TStrings;
i: Integer;
s: string;
begin
List := TStringList.Create;
try
ListDLLExports('C:\WINDOWS\SYSTEM32\browseui.dll', List);
ShowMessage(IntToStr(list.Count) + ' functions in dll');
s := 'List of functions:';
for i := 0 to List.Count - 1 do
s := s + #13#10 + List[i];
ShowMessage(S);
finally
List.Free
end;
end;

منبع: http://www.swissdelphicenter.ch/en/showcode.php?id=1133

Mask
سه شنبه 15 اسفند 1391, 18:33 عصر
ممنون.
خودتون کد رو تست کردید؟
البته اگه این کد کار بدهد، اسم فانکشنهارو بر میگردونه نه پارامتر های فانکشن هارو.
کد رو چک کنید. برای من جواب درست بر نگردوند.

بهروز عباسی
سه شنبه 15 اسفند 1391, 19:28 عصر
ممنون.
خودتون کد رو تست کردید؟
البته اگه این کد کار بدهد، اسم فانکشنهارو بر میگردونه نه پارامتر های فانکشن هارو.
کد رو چک کنید. برای من جواب درست بر نگردوند.

درود
اون برنامه ای که من گفتم هم همین کارو می کرد!

در مورد پارامترها باید بگم :
هیچ برنامه ای قادر به شناساییشون نیست.
و اگه Documentای در باره اون توابع وجود نداشته باشه دسترسی به پارامترهاش امکان نداره
موفق باشید.