كيف تربط برنامجك بملف خارجي؟
#1
السلام عليكم
كيف يمكن ان نربط برنامجي بملف .dll خارجي
بحيث ينفذ روتين معين او عمليات حسابية
ثم نقطف الناتج بحيث استخدمة في حساب عملية ما؟
الرد
#2
من مبرمج الملف ؟
إذا كان أنت فالموضوع سهل

حسب إعتقادي الموضوع ضمن عملية هندسة عكسية
لذا يجب عليك تتبع الملف الذي يتعامل مع هذا الملف وفهم آلية التعامل مع الـ Function الخاصة بملف الـ dll
قد يتعامل مع متغير Puplic ضمن البرنامج أو قد يتعامل مع ملف أو أي شئ آخر لذا يمكنك تعديل ملف dll حسبما تحتاج
الرد
#3
مشكور على الرد اخي الزري2
ما احتاجة هو امكانية الوصول الى روتين معين وتنفيذه كما لو كان هذا الروتين مستدعى من البرنامج الاصل
انا لا احتاج اعمل باتش او كراك
اكيد انك قد رأيت كيجن يحتوي على ملف او اكثر يتعامل معه بكل سهولة
ولكن اسأل كيف يمكن ذلك بالدلفي؟
الرد
#4
cargem كتب :امكانية الوصول الى روتين معين وتنفيذه كما لو كان هذا الروتين مستدعى من البرنامج الاصل

إنتظرت ردك لكي أتأكد أنك تريد فكرة عمل كيجن يرتبط بملفات dll التي يتعامل معها البرنامج

ما أردت قوله هو أنه يوجد درس للأستاذ Mouradpr في منتدى at4re رقم الموضوع هو 3751
بعنوان : "E@sy V!deo to DVD KeyGening"
برمجة الكيجن في الإسمبلي ولكن كل شئ ممكن بالدلفي طبعاً
فقط الدرس يشرح آلية إستعمال الملف
الرد
#5
اشكرك اخي الزري2
هل يوضح المسئلة بطريقة برمجية
ام عن طريق الهندسة العكسية
الرد
#6
خرجت بهذا الكود
والان نحن في مشكلة التحويل الى دلفي
اعتقد :
1-تحميل الملف
2- تؤشر على العنوان (البوابه)
3- تنفيذ عملية ما
4- خطف الناتج
5- اكمال الكود برمجيا مستفيد من نتائج الروتين


PHP كود :
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include "resource.h"

#define PROC_CAST  void (__stdcall * )(char*, char*)

HINSTANCE hInst;

BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    
HINSTANCE hLib;
    
char BufferName[256];
    
char Serial[256];

    
void (__stdcall *myProc)(char*, char*) = 0; // هنا تضع البروتوتايب تبع الدالة كيفنا كانت

    
switch (uMsg)
    {
    case 
WM_CLOSE:
        
EndDialog(hwndDlg, 0);
        return 
TRUE;

    case 
WM_COMMAND:
        switch (
LOWORD(wParam))
        {
        case 
ID_OK:
        {
            
GetDlgItemText(hwndDlg,ID_NAME,BufferName,32);
            
hLib = LoadLibrary("ether.dll");
            
myProc = (PROC_CAST) GetProcAddress(hLib,"reg_code");
            if (
myProc =t= NULL)
                return 
FALSE;
            
myProc(BufferName, Serial);
            
SetDlgItemText(hwndDlg,ID_SERIAL,Serial);
            
FreeLibrary(hLib);
        }
        return 
TRUE;
        }
    }
    return 
FALSE;
}


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    
hInst = hInstance;
    return 
DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, DialogProc); 
الرد
#7
السلام عليكم
شاهد الدرس السابع من دورة دلفي للعرب
الرد
#8
السلام عليكم
- لما كل هذا التعقيد , كل ما في الأمر (الطريقة الكلاسيكية) :
1- التأكد من وجود المكتبة
2- تحميل الملف
3- التحصل على عنوان الـMethods
4- تنفيذ الـ Method
5- إرجاع الناتج / تحرير المكتبة
راجع :
[دورة دلفي للعرب] الدرس التاسع: Windows API
كيف ابعث متغير لدالة في ملف dll ثم احصل على النتيجة
بالتوفيق,,
I'M Fly Like A G6

الرد
#9
تشكر اخي TF6M
إقتباس :- التحصل على عنوان الـMethods
اعتقد انه صعب ان تحصل على اسم الـMethods
لان GetProcAddress تحتاج اسم الـMethods والمقبض
------------------
هل يمكن القفر الى عنوان داخل الـMethods
و تنفيذ عملية ما ؟
الرد
#10
يمكن التحصل على عنوان الـ Methods , عن طريق الإسم / الـ Index / الـ Address
- يمكن إستخراج مثلا أسماء الـ Methods بعدة طرق , أساليب الهندسة العكسية أو برمجيا ...
معرفة function المصدرة من مكتبة DLL
I'M Fly Like A G6

الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم