السلام عليكم ورحمة الله وبركاتة
أخواني وجدت مع أحد البرامج المعملوه بالدلفي ملف DLL
موجود بالمرفقات
هل أستطيع أستغلالة عن طريق الفيجول بيسك
مع العلم أنه لم يقبل الأضافة في References
وفقكم الله وجعل آخر أعمالكم طاعتة
الملف بدون upx
لم اجربه لا املك فيجوال ولا اي برنامج استخدمت upx فقط لفك الضغط عنه.
بأي حال تستطيع استخدامه بدون ان تفك الضغط عنه من خلال استدعاء دالتي LoadLibrary و GetProcAddress من دوال API.
من خلال GetProcAddress تحصل على عنوان الدالة التي تريد تنفيذها منه.
اسماء الدوال موجودة في الصورة في المرفقات.
لتعرف ما نوع البارامترات التي تتعامل معها هذه الدوال راجع الموضوع:
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
بارك الله فيك أخي 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")
أثابكم الله ووفقكم وغفر لكم
الكود صحيح ان شاء الله
اتصور فقط, اسماء الدوال الموجودة في الـ DLL تكون case sensitive حساسة لحالة الاحرف الافضل ان تستخدم "otherpasswords" كما يظهر في الصورة, بأي حال يمكن الكشف ببساطة عن هذا ان لم تعمل.
بعد ان حصلت على مقبض الدالة otherpasswords من الذاكرة تستطيع استدعاءها من خلال استدعاء addr المتحول الذي يحمل عنوان هذه الدالة في الذاكرة (كما هو واضح من الكود)
البارامترات ما يقصد بها المتغيرات التي تدخل في استدعاء الدالة, انظر مثلا الى دالة GetProcAddress التي قمت باستدعاءها
لها بارامترين hModule وهو عبارة عن العنوان ويكون من نوع Long (4 بايتات) وبارامتر lpProcName وهو من نوع String الذي يحمل اسم الدالة المطلوبة.
في الرابط هذا ستجد من خلال 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
أثابك الله أخي 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
ماأدري هل عملي صحيح
جزاك الله الف خير على كل ماقدمت وصدقني كلماتي تعجز عن شكرك .
السلام عليكم.
كنت أريد التأكد قبل وضع الإجابة لذلك فضلت الإنتظار قليلاً لأضع الملف تحت 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
أخي 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
هل الكود غلط
لا ارى شئ مفيد من القيمة المعادة, حتى انها غير مستخدمة للوهلة الأولى في تركيبة الملف, ان كانت قيمة 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
روح ياشيخ الله يوفقك ويسعدك دنيا وآخره. ... وجزاك ربي أعلى درجات الجنان وطهر الله قلبك وملأه حباً له
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
صباح الخير وتقبل الله جميعاً صلاة الفجر
بخصوص الموضوع هذا, ان لم تجد ما تبحث عنه بواسطة الفيجوال بيسك, think outside the box
يمكن القيام بهذا بالاسمبلي :)
reverse بسيط على ملف الـ DLL
واجعله يقوم بما اريده القيام به
السلام عليكم
تم تعديل هذه المشاركة بواسطة 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
أثابك الله وتقبل صلاتك أخي Xacker
بالنسبة للأسمبلي ماعندي أي فكرة عن هذه اللغة رغم أهميتها
لكن هل تستطيع عمل ملف أو برنامج بالاسمبلي يتحكم بالDLL عن طريق الدوس مثلاً
يعني أرسل أمر للDLL بأن ينزل المعلومات المطلوبة منه في ملف txt وأقوم أنا بعد ذلك بالفيجول بيسك
بسحب المعلومات من الملف .
يعني يكون برنامج مصنوع بالأسمبلي مستقل أقوم بتنزيلة مع ملف DLL ليساعدني بأستخراج المعلومات منه
وفقك الله لما يحبه ويرضاه شكرا لك
يمكن هذا ولست بحاجة الى كتابة شئ جديد, استطيع تغيير عمل الملف الاصلي من خلال الاسمبلي, سأقوم عند عودتي للمنزل عند توفر الوقت بإزالة 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
اتصور انه ان لم يكن هناك مشكلة في تشكيل ملف 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 ضمن برنامجك.
ما رأيك؟
تم تعديل هذه المشاركة بواسطة 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
الله يوفقك يارب ويخليك ويسعدك دنيا واخرة يا قادر يا كريم وينفع بعلمك المسلمين
بارك الله فيك أخي Xacker ويسر أمورك
أرجوا منك أخي Xacker طلباً لاأمراً أن تعمل مثل هذا البرنامج وتجعل عنها بدل الرسالةأما ملف TXT أو تخزن في الرجستري بحيث أستطيع جلبها بعد ذلك
أهم شي أنه يكون أستطيع من خلال البرنامج تبعي عرض المعلومات فيه .
ألف شكر أخي Xacker مجهود تشكر عليه الله يجعلة في ميزان حسناتك اللهم أمين
السلام عليكم ورحمة الله وبركاته
طريقة استخدام المكتبة بسيطة, يجب ان يكون ملف 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
فقط -- السلام عليكم
ولا تنسى ما اقسمت عليه.
تم تعديل هذه المشاركة بواسطة 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