مثال ++C على جلب السيريال نمبر للهاردسك [Winapi]

تم تحميل الصفحة في 1,2361622 ثانية
مثال ++C على جلب السيريال نمبر للهاردسك [Winapi]
إنضم
7 نوفمبر 2008
المشاركات
1,107
الإعجابات
1,430
النقاط
113
العمر
33
الإقامة
~ Botnet Master ~
السلام عليكم ورحمة الله ،،

تعقيبا على سؤال بعض الاخوة عن كيفية قيام المبرمجين بحماية برامجهم عن طريق ربطها بمعلومات الهاردوير

على سبيل المثال لا الحصر,, احدى الطرق للقيام بذلك هي بقراءة قيمة المتغير MachineGUID على المسار التالي في الرجستري:
HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography
حيث انه (نظريا) بعد اتمام عملية تسطيب الويندوز كل جهاز سيأخذ قيمة فريدة ،، لكن (عمليا) قد لا تكون كذلك ،، بحكم انه هناك العديد من يستخدمون نسخ ويندوز مقرصنة ومنسوخة بالتالي هي ليست طريقة اعتمادية اذا كان برنامجك واسع الاستخدام



او استخدام دالة GetCurrentHwProfile وهي ايضا تعتمد على المفتاح اللي شرحناه في الاعلى لكن بالاضافة الى اسم الجهاز ،،


GetCurrentHwProfile
النوع: Boolean ،، ترجع بـ TRUE اذا نجح الاستدعاء ،، او FALSE اذا فشلت.
البراميترات: تحتاج ان تمرر لها مؤشر الى ستركشر من نوع HW_PROFILE_INFO ،،
شكل الستركشر :

مايهمنا فيه هو المتغير szHwProfileGuid من نوع char ،,


ملاحظة خارجة عن اطار الموضوع ،، من المعلومات المثيرة للاهتمام التي تقدمها الدالة GetCurrentHwProfile هي : معرفة ما اذا كان الجهاز على وضعية docking station ،، و بحسب خبرتي يتم استخدام الدوك ستيشن في الشركات والمنشآت بنسبة 80% واكثر،،

بمعنى ،، ان كانت القيمة الراجهة في المتغير dwDockInfo تساوي DOCKINFO_DOCKED احتمال كبير يكون البوت/الضحية تابع لـ corporate :10:




عموما نكمل الموضوع للتطرق لطريقة اخرى وهي ربط البرنامج بسيريال الهاردسك ،، يتم الاستعلام عن سيريال الهاردسك عن طريق DeviceIoControlInterface
الدالة تقوم بالعديد من الاجراءات وفي مثالنا سوف نخص استخدام القيمة IOCTL_STORAGE_QUERY_PROPERTY في البراميتر الثاني.


DeviceIoControl
النوع: Boolean ،، ترجع بـ TRUE اذا نجح الاستدعاء ،، او FALSE اذا فشلت.
البراميترات:

استخدام الدالة سيكون اطول قليلا من الدالة السابقة وسوف نحتاج الى عدة خطوات باختصار هي:
اولا: نحتاج ان نجلب مقبض على الهارد المعني ،، باستخدام دالة CreateFile ،، بالطبع تحتاج الى صلاحيات الادمن لكن تحصل على هاندل على الهارد الاساسي او الـ root directory ،، لذا يجب تنفيذ الدالة بالصلاحيات اللازمة (تشغيل الملف كمسؤول).
ثانيا: سوف نقوم باستدعاء مبدئي للدالة لكي نحدد حجم الداتا التي سوف ترجع لنا ،،
ثالثا: نقوم بحجر بفر في الذاكره وبالحجم المطلوب ،، وعرفنا الحجم المطلوب من الخطوة 2.
رابعا واخيرا: نستدعي الدالة ونمرر لها مؤشر المحجوز في الذاكرة لكي نستلم عليه المعلومات الراجعة


كود المثال

C++:
#include <windows.h>
#include <stdio.h>
#include <string>
#include <algorithm>
using namespace std;

#define REMOVE_SPACES(x) x.erase(std::remove(x.begin(), x.end(), ' '), x.end())


int GetHDD(string &Buf)
{

    // Get a handle to physical drive

    HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

    if (INVALID_HANDLE_VALUE == hDevice) // if we failed to obtain the handle
    {
        printf("CreateFile() Failed --> Error Code [%d]\n", GetLastError()); //print the returned error code
        return GetLastError();
    }

    // Set the input data structure
    STORAGE_PROPERTY_QUERY storagePropertyQuery;
    ZeroMemory(&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY));

    storagePropertyQuery.PropertyId = StorageDeviceProperty;
    storagePropertyQuery.QueryType = PropertyStandardQuery;

    // Get the necessary output buffer size
    STORAGE_DESCRIPTOR_HEADER storageDescriptorHeader;
    ZeroMemory(&storageDescriptorHeader, sizeof(STORAGE_DESCRIPTOR_HEADER));

    DWORD dwBytesReturned = 0;
    if (!DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
        &storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY),
        &storageDescriptorHeader, sizeof(STORAGE_DESCRIPTOR_HEADER),
        &dwBytesReturned, NULL))
    {
        printf("DeviceIoControl(IOCTL_STORAGE_QUERY_PROPERTY) Failed --> Error Code [%d]\n", GetLastError());
        CloseHandle(hDevice);
        return GetLastError();
    }

    // Allocate memory for the output buffer
    const DWORD dwOutBufferSize = storageDescriptorHeader.Size;

    BYTE* pOutBuffer = new BYTE[dwOutBufferSize]; //the buffer is allocated on the Heap now, remember to free it once we done to avoid memory leaks
    ZeroMemory(pOutBuffer, dwOutBufferSize);

    // calling DeviceIoControl() again and passing the new allocated buffer
    if (!DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
        &storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY),
        pOutBuffer, dwOutBufferSize,
        &dwBytesReturned, NULL))
    {
        //this error shouldn't happen, but just in case..
        printf("2nd DeviceIoControl(IOCTL_STORAGE_QUERY_PROPERTY) Failed --> Error Code [%d]\n", GetLastError());
        delete[] pOutBuffer;
        CloseHandle(hDevice);
        return GetLastError();
    }

    // Now, the output buffer points to a STORAGE_DEVICE_DESCRIPTOR structure
    STORAGE_DEVICE_DESCRIPTOR* pDeviceDescriptor = (STORAGE_DEVICE_DESCRIPTOR*)pOutBuffer;

    const DWORD dwSerialNumberOffset = pDeviceDescriptor->SerialNumberOffset;


    if (dwSerialNumberOffset != 0)
    {
        // Finally, get that serial number
        Buf.append((char*)pOutBuffer + dwSerialNumberOffset);
    }

    // Do cleanup and return
    delete[] pOutBuffer;
    CloseHandle(hDevice);
    return 0;
}

int GetHwid(string &Buf)
{
    HW_PROFILE_INFO hwProfileInfo;
    if (GetCurrentHwProfile(&hwProfileInfo) != NULL)
        Buf.append(hwProfileInfo.szHwProfileGuid);

    return 0;
}

int main()
{
    string hdd;
    
    printf("* Getting the Hardware Profile ID using GetCurrentHwProfile()\n\n");
    hdd.clear();

    GetHwid(hdd);
    printf("- Hardware Profile ID: %s\n\n\n\n", hdd.c_str());

    printf("* Getting the HDD Serial Number usint DeviceIoControl() Interface\n\n");
    hdd.clear();

    GetHDD(hdd);
    REMOVE_SPACES(hdd);

    printf("- HDD Serial: [%s]\n\n\n\n", hdd.c_str());
    system("pause");

    return 0;
}


ودي واحترامي ،،
 

Dr berhak

.:: المـُـراقـِــب العــــــامّ ::.
طاقم الإدارة
إنضم
18 أكتوبر 2013
المشاركات
8,250
الإعجابات
9,976
النقاط
173
والله اظافة رائعه حقيقة

وفعلا الكثير يبحث عنها

جزاك الله كل خير

كإظافة للموضوع و سأطرحها كسؤال

والسؤال موجه لك أنت @Native Call_ هل بإمكاننا جلب سيريال الهارد ديسك عن طريق الدريفرات:311::311::99999:
 
إنضم
7 نوفمبر 2008
المشاركات
1,107
الإعجابات
1,430
النقاط
113
العمر
33
الإقامة
~ Botnet Master ~
اسعدني مرور الجميع


والسؤال موجه لك أنت @Native Call_ هل بإمكاننا جلب سيريال الهارد ديسك عن طريق الدريفرات:311::311::99999:
اعتقد نعم تستطيع جلب السيريال مباشرة من الدرايفر لان هناك العديد من الطرق ،،

ايضا استخدام الانترفيس wmic من شاشة الدوس من احدى الطرق ولا تحتاج صلاحيات ،، الامر التالي يطبع السيريال للهارد:

كود:
WMIC path win32_physicalmedia get serialnumber
 

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 0 ضيف)

خيارات الاستايل

نوع الخط
مودك
اخفاء السايدر بار OFF
توسيط المنتدى OFF
فصل الأقسام OFF
الأقسام الفرعية OFF
عرض المشاركات
حجم الخط
معلومات العضو OFF
إخفاء التوقيع OFF

إرجاع خيارات الإستايل