حماية البرنامج في بيئة الجهاز الافتراضي Virtual Machine
#1
السلام عليكم ورحمة الله وبركاته ،
قمت بحمابة برنامجي باستعمال رقم القرص الصلب.
أحد الزبائن قام بتنصيب البرنامج في بيئة جهاز افتراضي Virtual machine ، البرنامج يعمل بشكل جيد بعد حصولها على كود تفعيل البرنامج من طرفي.
لكن عندما يقوم بتنصيب نفس جهاز الافتراضي في جهاز آخر مغاير ، البرنامج يعمل دون مشاكل ، أي أنه لا يطلب منه كود تفعيل البرنامج.
هل هناك من مر بنفس الحالة ؟ وما هي الاحتياطات الواجب اتخاذها؟
جزاكم الله خيرا.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#2
و عليكم السلام و رحمة الله تعالى و بركاته
كحل اولي تكتب اومر اضافية في برنامجك تتيح لك معرفة ان كان البرنامج يشتغل في بيئة افتراضية او بيئة حقيقية...
و ان تم اكتشاف البيئة الافتراضية تمنع برنامجك من اتمام التشغيل مثلا...

اوامر الكشف:
- تكون عبر قنص بعض النصوص الخاصة...
- استعمال اوامر اسمبلي تكشف الــ Virtualization...
- توجد ثلاثة بيئات مشهورة VMWare, Virtual PC و Virtual Box
[-] كل من 1 user says قال شكرا ل rhopalocera على المشاركة المفيدة
  • أبو معاذ
الرد
#3
وعليكم السلام
حماية البرامج عن طريق رقم القرص الصلب طريقة غير فعالة و مجرد هدر للوقت ... هناك عدة طرق اكثر فعالية (ليست حماية 100%) لاكن على الاقل تبعد المتطفلين منها : قم بعمل خوارزمية السريال بنفسك و لاتعتمد على المكونات الجاهزة و الخوارزميات المعروفة وضف لها الكثير من التمويه بعدها سوف يكون من الجيد لو تقوم بتشفيرها باحد برامج التشفير ك : Enigma Protector , VMProtect, ASPack, Themida....ايضا يمكنك اضافة بعض اللمسات ك AntiDebugging , AntiVMs ... هدا من شانه ان يبعد المتطفلين قليلا.
:: من يملك المعلومة يملك الميدان :: 
[-] كل من 1 user says قال شكرا ل AX302 على المشاركة المفيدة
  • أبو معاذ
الرد
#4
السلام عليكم.
بارك الله فيكم على التفاعل مع الموضوع.
سؤال فقط، 
هل هناك دالة للتأكد من ما إذا كان البرنامج يعمل في بيئة الجهاز الافتراضي او لا؟

السلام عليكم .
وجدت هذه الدالة  uDGVMUtils ،على الموقع :


PHP كود :
unit uDGVMUtils;

interface

(*******************************************************************************
 
 http://www.delphigeist.com/2011/01/udgvmutils-version-11-thanks-to-chee.html?m=1
 
 uDGVMUtils -- is an attempt to create one of the best virtual machine
    detector methods
feel free to contribute in any way you wish.

 
 Version 1.12010-01-15

  Copyright© you are free to 
use it for comercial, private or both purposes

  Contributors
:
 
   Dorin Duminica
    Chee Meng

*******************************************************************************)

type
  TVMWareVersion 
= (
 
   vvExpress 1,
 
   vvESX,
 
   vvGSX,
 
   vvWorkstation,
 
   vvUnknown,
 
   vvNative);

const
 
 VMWARE_VERSION_STRINGS: array [TVMWareVersionof string = (
 
   'Express',
 
   'ESX',
 
   'GSX',
 
   'Workstation',
 
   'Unknown',
 
   'Native');

type
  TVirtualMachineType 
= (
 
   vmNative,
 
   vmVMWare,
 
   vmWine,
 
   vmVirtualPC,
 
   vmVirtualBox);

const
 
 VIRTUALMACHINE_STRINGS: array[TVirtualMachineTypeof string = (
 
   'Native',
 
   'VMWare',
 
   'Wine',
 
   'Virtual PC',
 
   'Virtual Box');

function 
IsRunningVMWare(var AVMWareVersionTVMWareVersion): Booleanoverload;
function 
IsRunningVMWareBooleanoverload;
function 
IsRunningWine(var AWineVersionstring): Booleanoverload;
function 
IsRunningWineBooleanoverload;
function 
IsRunningVirtualPCBoolean;
function 
IsRunningVBoxBoolean;
function 
IsRunningVM(var AVMVersionstring): Booleanoverload;
function 
IsRunningVMBooleanoverload;

implementation

uses
  SysUtils
,
 
 Windows;

function 
IsRunningVMWare(var AVMWareVersionTVMWareVersion): Boolean;
const
 
 CVMWARE_FLAG = $564D5868;
var
 
 LFlagCardinal;
 
 LVersionCardinal;
begin
  LFlag 
:= 0;
 
 try
    asm
      push eax
      push ebx
      push ecx
      push edx

      mov eax
'VMXh'
 
     mov ecx0Ah
      mov dx
'VX'

 
     in eaxdx

      mov LFlag
ebx
      mov LVersion
ecx

      pop edx
      pop ecx
      pop ebx
      pop eax
    end
;
 
 except
//  uncomment next two lines if you wish to see exception
//    on E: Exception do
//      ShowMessage(E.message);
 
 end// trye
 
 if LFlag CVMWARE_FLAG then begin
    Result 
:= True;
 
   case LVersion of
      1
AVMWareVersion := vvExpress;
 
     2AVMWareVersion := vvESX;
 
     3AVMWareVersion := vvGSX;
 
     4AVMWareVersion := vvWorkstation;
 
     else
        AVMWareVersion 
:= vvUnknown;
 
   end
  end 
else begin
    Result 
:= False;
 
   AVMWareVersion := vvNative;
 
 end// if LFlag = CVMWARE_FLAG then begin
end;

function 
IsRunningVMWareBoolean;
var
 
 LVMWareVersionTVMWareVersion;
begin
  Result 
:= IsRunningVMWare(LVMWareVersion);
end;

function 
IsRunningWine(var AWineVersionstring): Boolean;
type
  TWineGetVersion 
= function: PAnsiChar;{$IFDEF Win32}stdcall;{$ENDIF}
 
 TWineNTToUnixFileName procedure (P1PointerP2Pointer);{$IFDEF Win32}stdcall;{$ENDIF}
var
 
 LHandleTHandle;
 
 LWineGetVersionTWineGetVersion;
 
 LWineNTToUnixFileNameTWineNTToUnixFileName;
begin
  Result 
:= False;
 
 AWineVersion := 'Unknown';
 
 LHandle := LoadLibrary('ntdll.dll');
 
 if LHandle 32 then begin
    LWineGetVersion 
:= GetProcAddress(LHandle'wine_get_version');
 
   LWineNTToUnixFileName := GetProcAddress(LHandle'wine_nt_to_unix_file_name');
 
   if Assigned(LWineGetVersion) or Assigned(LWineNTToUnixFileNamethen begin
      Result 
:= True;
 
     if Assigned(LWineGetVersionthen
        AWineVersion 
:= StrPas(LWineGetVersion);
 
   end// if Assigned(LWineGetVersion) or ...
 
   FreeLibrary(LHandle);
 
 end// if LHandle > 32 then begin
end;

function 
IsRunningWineBoolean;
var
 
 LWineVersionstring;
begin
  Result 
:= IsRunningWine(LWineVersion);
end;

function 
IsRunningVirtualPCBoolean;
asm
  push ebp
;
 
 mov ebpesp;

 
 mov ecxoffset @exception_handler;

 
 push ebx;
 
 push ecx;

 
 push dword ptr fs:[0];
 
 mov dword ptr fs:[0], esp;

 
 mov ebx0// Flag
 
 mov eax1// VPC function number

 
 // call VPC
 
 db $0F, $3F, $07, $0B

  mov eax
dword ptr ss:[esp];
 
 mov dword ptr fs:[0], eax;

 
 add esp8;

 
 test ebxebx;

 
 setz al;

 
 lea espdword ptr ss:[ebp-4];
 
 mov ebxdword ptr ss:[esp];
 
 mov ebpdword ptr ss:[esp+4];

 
 add esp8;

 
 jmp @ret1;

 
 @exception_handler:
 
 mov ecx, [esp+0Ch];
 
 mov dword ptr [ecx+0A4h], -1// EBX = -1 ->; not running, ebx = 0 -> running
 
 add dword ptr [ecx+0B8h], 4// ->; skip past the call to VPC
 
 xor eaxeax// exception is handled

 
 @ret1:
end;

function 
IsRunningVBoxBoolean;

 
 function Test1Boolean;
 
 var
    LHandle
Cardinal;
 
 begin
    Result 
:= False;
 
   try
      LHandle 
:= LoadLibrary('VBoxHook.dll');
 
     Result := (LHandle <> 0);
 
     if Result then
        FreeLibrary
(LHandle);
 
   except
    end
// trye
 
 end// function Test1: Boolean;

 
 function Test2Boolean;
 
 var
    LHandle
Cardinal;
 
 begin
    Result 
:= False;
 
   try
      LHandle 
:= CreateFile(
 
       '\\\\.\\\VBoxMiniRdrDN',
 
       GENERIC_READ,
 
       FILE_SHARE_READ,
 
       NIL,
 
       OPEN_EXISTING,
 
       FILE_ATTRIBUTE_NORMAL,
 
       0);
 
     Result := (LHandle <> INVALID_HANDLE_VALUE);
 
     if Result then
        CloseHandle
(LHandle);
 
   except
    end
// trye
 
 end// function Test2: Boolean;

begin
  Result 
:= Test1 or Test2;
end;

function 
IsRunningVM(var AVMVersionstring): Boolean;
begin
  AVMVersion 
:= VIRTUALMACHINE_STRINGS[vmNative];
 
 Result := True;
 
 if IsRunningWine then
    AVMVersion 
:= VIRTUALMACHINE_STRINGS[vmWine]
 
 else
    if IsRunningVMWare then
      AVMVersion 
:= VIRTUALMACHINE_STRINGS[vmVMWare]
 
   else
      if IsRunningVirtualPC then
        AVMVersion 
:= VIRTUALMACHINE_STRINGS[vmWine]
 
     else
        if IsRunningVBox then
          AVMVersion 
:= VIRTUALMACHINE_STRINGS[vmVirtualBox]
 
       else begin
          AVMVersion 
:= VIRTUALMACHINE_STRINGS[vmNative];
 
         Result := False;
 
       end;
end;

function 
IsRunningVMBoolean;
var
 
 LVMVersionstring;
begin
  Result 
:= IsRunningVM(LVMVersion);
end;

end


أنا لست مثبت جهاز افتراضي ،
حبذا لو يتكرم  بعض الإخوة بتجربة الكود ،

جزاكم الله خيرا.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#5
(03-01-2019, 05:43 AM)أبو معاذ كتب : هل هناك دالة للتأكد من ما إذا كان البرنامج يعمل في بيئة الجهاز الافتراضي او لا
هناك تقنية جديدة يعتمدها بعض صناع الفيروسات لتفادي الآلات الوهمية AntiVMs و هي الاعتماد على حرارة المعالج لمعرفة إن كانت آلة وهمية ام حقيقية يمكنك البحث في الأمر  Smile
:: من يملك المعلومة يملك الميدان :: 
[-] كل من 1 user says قال شكرا ل AX302 على المشاركة المفيدة
  • delphi17
الرد
#6
السلام عليكم.
الحمد لله تم تجربة الدالة أعلاه بنجاح.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#7
سعيد من اجلك...
فقط احرس اخي الحبيب على عدم الوقوع في الــ False positive بمعنى ان برنامجك يعتقد انه يشتغل في بيئة افتراضية مع انها بيئة حقيقية...
لذا من الأفضل اعتماد فحص باكثر من طريقة/دالة لكشف البيئة...

(03-01-2019, 04:03 PM)أبو معاذ كتب : السلام عليكم.
الحمد لله تم تجربة الدالة أعلاه بنجاح.
على اي بيئة جربت اخي الحبيب؟
هل جربت بعد تنصيب VMtools او قبل تنصيب الأدوات الاضافية، لان معظم الكشف مبني على ما يتم تنصيبه من ادوات اضافية (VMtools)

لتخطي آليات الكشف ينصح بشدة عدم تنصيب اي اضافات (ادوات تخص نوع الآلة الافتراضية نقوم بتنصيبها لتسهيل التعامل و الانتقال بين البيئة الافتراضية و الحقيقية)
[-] كل من 1 user says قال شكرا ل rhopalocera على المشاركة المفيدة
  • أبو معاذ
الرد


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


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف