Обнаруживать, запущена ли программа в Sandboxie или VM C # [duplicate]

Чтобы определить, почему код PHP не работает в коде JavaScript , нам нужно понять, что такое клиентский и серверный язык и как они работают.

Серверные языки (PHP и т. д.) : они извлекают записи из баз данных, поддерживают состояние через HTTP-соединение без состояния и выполняют много вещи, требующие безопасности. Они находятся на сервере, эти программы никогда не имеют своего исходного кода для пользователя

Image from wikipedia_http://en.wikipedia.org/wiki/File:Scheme_dynamic_page_en.svg [/g16] image attr

blockquote Это означает, HTML интерпретируется и выполняется JavaScript.

Хотя с другой стороны Клиентский язык на стороне клиента (например, JavaScript) находится в браузере и запускается в браузере, Сценарии на стороне клиента обычно относятся к классу компьютерных программ в Интернете, которые выполняются на стороне клиента, в веб-браузере пользователя, а не на стороне сервера .

JavaScript отображается пользователю и может быть легко изменен, поэтому для обеспечения безопасности мы не должны полагаться на JavaScript.

Итак, когда вы делаете запрос HTTP на сервере, чем сервер, сначала внимательно читает файл PHP, чтобы узнать, есть ли какие-либо задачи, которые необходимо выполнить, и отправлять ответ на клиентскую сторону и снова, как @deceze сказал * Как только PHP закончил вывод ответа, сценарий заканчивается, и на сервере ничего не произойдет, пока не появится новый запрос HTTP . *

Graphical representation [/g17]

Источник изображения

blockquote>

Итак, что мне делать, если мне нужно вызвать PHP? Это зависит от того, как вам это нужно: либо перезагружая страницу, либо используя вызов AJAX.

  1. Вы можете выполнить перезагрузку страницы и отправить запрос HTTP
  2. вы можете сделать вызов AJAX с помощью JavaScript, и это не требует перезагрузки страницы

Хорошо Чтение:

  1. Википедия:
  2. Википедия: скрипты на стороне клиента
  3. Мадара Учиха: разница между клиентской стороной и программированием на стороне сервера

31
задан Jason 31 January 2009 в 07:01
поделиться

9 ответов

Согласно сообщению «Виртуальный компьютер Guy » Обнаружение виртуальных машин Microsoft », вы можете использовать WMI для проверки производителя материнской платы. В PowerShell:

 (gwmi Win32_BaseBoard).Manufacturer -eq "Microsoft Corporation"
17
ответ дан Jay Bazuzi 28 August 2018 в 02:33
поделиться
  • 1
    Er, что относительно VM не-MS? – David Heffernan 21 June 2012 в 21:08
  • 2
    Кроме того, как заметил комментатор @ErikFunkenbusch, мой ответ на этот вопрос, эта проверка неправильно идентифицирует MS Surface Pro как виртуальную машину. – RobSiklos 9 December 2014 в 15:54
  • 3
    Справедливости ради следует отметить, что для виртуальных машин MS было выпущено многообразие продуктов Surface после , этот ответ был опубликован. – Alexander Morou 15 January 2017 в 18:49

Вот пример одного из способов сделать это. Он работает только с виртуальным ПК Microsoft и VMWare, но это начало: http://www.codeproject.com/KB/system/VmDetect.aspx

12
ответ дан Arthur Chaparyan 28 August 2018 в 02:33
поделиться
  • 1
    Это очень интересно ... посмотреть, как машины реагируют на использование недопустимых команд сборки. Потрясающие! – Jason 31 January 2009 в 07:08
  • 2
    Я искал и обнаружил, что работает на виртуальной машине & quot; (без кавычек) в Google, и это был первый результат. – Arthur Chaparyan 31 January 2009 в 07:08
  • 3
    На самом деле лучшим способом является «аппаратная отпечатка пальца»: blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx – Arthur Chaparyan 31 January 2009 в 07:09

Для тестов нижнего уровня я рекомендую посмотреть ScoopyNG [1]. Это сборник известных низкоуровневых, хорошо работающих методов обнаружения vm, хотя они немного устарели.

Если вы действительно хотите полагаться на другие вещи, такие как установленные инструменты (дополнения VM *), это гораздо легче «подделать».

В этом [2] блоге также есть довольно хороший обзор, из материала с низким уровнем asm, проверка определенных DLL, файлов и ключей реестра для проверки.

[1] http://trapkit.de/research/vmm/scoopyng/index.html

[2] http: //securitykitten.github. IO / VM-проверка-и-обнаруживая /

1
ответ дан Badmaster 28 August 2018 в 02:33
поделиться

Самый простой способ выяснить, работает ли мое приложение C # на VMware vmware или нет, - это проверить MAC-адрес карты (-ов) NIC. Если это VMware VM, это всегда будет: 00: 50: 56: XX: YY: ZZ

Вы можете перечислить через сетевые карты , как разрешено здесь.

0
ответ дан Community 28 August 2018 в 02:33
поделиться
  • 1
    -1: конечно, VMware может изменять свой формат MAC-адреса, когда захочет, не сообщая вам заранее – John Saunders 18 February 2012 в 14:44
  • 2
    Согласно стандартам.ieee.org VMWare использует: 00:05:69, 00: 0C: 29, 00: 1C: 14, а также 00:50:56 для части организации MAC-адреса , И, как сказали @John_Saunders, они могут добавлять новый список в список, когда захотят. – Jesse Chisholm 26 May 2013 в 15:09

этот код на C ++ обнаруживает такие продукты Vmware, как express, esx, fusion или workstation

// VMWareDetector.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include <conio.h>
void CheckVM(void); 
int main()
{
    CheckVM(); 
    _getch(); 
    return 0;
}

void CheckVM(void)
{
    unsigned int    a, b;

    __try {
        __asm {

            // save register values on the stack
            push eax
            push ebx
            push ecx
            push edx

            // perform fingerprint
            mov eax, 'VMXh' // VMware magic value (0x564D5868)
            mov ecx, 0Ah // special version cmd (0x0a)
            mov dx, 'VX' // special VMware I/O port (0x5658)

            in eax, dx // special I/O cmd

            mov a, ebx // data 
            mov b, ecx // data (eax gets also modified
                       // but will not be evaluated)

                       // restore register values from the stack
                       pop edx
                       pop ecx
                       pop ebx
                       pop eax
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER) {}
    printf("\n[+] Debug : [ a=%x ; b=%d ]\n\n", a, b);
    if (a == 'VMXh') { // is the value equal to the VMware magic value?
        printf("Result  : VMware detected\nVersion : ");
        if (b == 1)
            printf("Express\n\n");
        else if (b == 2)
            printf("ESX\n\n");
        else if (b == 3)
            printf("GSX\n\n");
        else if (b == 4)
            printf("Workstation\n\n");
        else
            printf("unknown version\n\n");
    }
    else
        printf("Result  : Not Detected\n\n");
}
1
ответ дан Koorosh Ghorbani 28 August 2018 в 02:33
поделиться

Джей Абузи показал решение в powershell. Вот то же самое, что и функция c #:

   /// <summary>
    /// Detect if this OS runs in a virtual machine
    /// 
    /// http://blogs.msdn.com/b/virtual_pc_guy/archive/2005/10/27/484479.aspx
    /// 
    /// Microsoft themselves say you can see that by looking at the motherboard via wmi
    /// </summary>
    /// <returns>false</returns> if it runs on a fysical machine
    public bool DetectVirtualMachine()
    {
        bool result = false;
      const  string  MICROSOFTCORPORATION ="microsoft corporation";
        try
        {
            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher("root\\CIMV2","SELECT * FROM Win32_BaseBoard");

            foreach (ManagementObject queryObj in searcher.Get())
            {
               result =  queryObj["Manufacturer"].ToString().ToLower() == MICROSOFTCORPORATION.ToLower();
            }
            return result;
        }
        catch (ManagementException ex)
        {
            return result;
        }
    }
3
ответ дан real_yggdrasil 28 August 2018 в 02:33
поделиться
  • 1
    К сожалению, эта и подобные методы не работают в моей системе W7, где работает VMWare ThinApp для тестирования. queryObj.Properties идентичны в обеих средах. – Jesse Chisholm 26 May 2013 в 17:06
  • 2
    @JesseChisholm - не только это, но это ложно сообщит, что аппаратное обеспечение Microsoft не VM - это VM, например Surface Pro. Я бы предположил, что у вас неправильная настройка, если ThinApp виртуализирует данные WMI. – Erik Funkenbusch 29 November 2014 в 18:29
  • 3
    @ErikFunkenbusch. Весь смысл виртуализации заключается в том, что код не должен знать или заботиться о том, является ли он живым или виртуальным. Поэтому каждый производитель VM очень усердно делает это невозможным. До сих пор единственный способ найти приложение my , чтобы узнать, заключается в том, чтобы выполнить выполнение VM в параметре командной строки, сообщая мне, что я запускаю виртуальный. Вздох. – Jesse Chisholm 16 December 2014 в 18:09

Это то, что я использую:

using (var searcher = new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem"))
{
  using (var items = searcher.Get())
  {
    foreach (var item in items)
    {
      string manufacturer = item["Manufacturer"].ToString().ToLower();
      if ((manufacturer == "microsoft corporation" && item["Model"].ToString().ToUpperInvariant().Contains("VIRTUAL"))
          || manufacturer.Contains("vmware")
          || item["Model"].ToString() == "VirtualBox")
      {
        return true;
      }
    }
  }
}
return false;

Edit 2014-12-02: Обновлен код, чтобы он больше не обнаруживал Microsoft Surface Pro в качестве виртуальной машины. Спасибо Erik Funkenbusch за это.

Редактировать 2017-06-29: Обновлен код, чтобы он также проверял значение свойства HypervisorPresent.

Редактировать 2018-02 -05: удалена проверка свойства HypervisorPresent, так как она неверна. Это свойство может возвращать true, если выполняется на сервере O / S на гипер-V-сервере.

37
ответ дан RobSiklos 28 August 2018 в 02:33
поделиться
  • 1
    Некоторые быстрые тесты выглядят так, что тестовое выражение может быть упрощено (для некоторого определения «упрощенного») до item["Model"].ToString().ToLower().Contains("virtual"). – Michael Burr 13 March 2013 в 02:20
  • 2
    Вы можете создавать "элементы" и " как IEnumerable<ManagementBaseObjects> следующим образом: var managementItems = items.OfType<ManagementBaseObject>(); для использования с методами расширения IEnumerable. – Ben Clark-Robinson 11 May 2014 в 04:34
  • 3
    Я бы подумал, что этот код обнаружит аппаратное обеспечение Microsoft как VM, например Surface Pro. – Erik Funkenbusch 29 November 2014 в 18:08
  • 4
    @ErikFunkenbusch да - вы правы :( – RobSiklos 2 December 2014 в 19:06
  • 5
    этот код не будет обнаруживать запуск виртуальной машины под Parallels Desktop, Xen и KVM – Dennis 4 August 2016 в 07:10

Эта функция C обнаружит гостевую ОС VM: (протестировано в Windows, скомпилировано с помощью Visual Studio)

#include <intrin.h>

    bool isGuestOSVM()
    {
        unsigned int cpuInfo[4];
        __cpuid((int*)cpuInfo,1);
        return ((cpuInfo[2] >> 31) & 1) == 1;
    }
3
ответ дан user2242746 28 August 2018 в 02:33
поделиться
  • 1
    Чтобы уточнить, этот фрагмент кода использует команду cpuid для определения того, установлен ли бит функции, указывающий, что код работает на гипервизоре. Разумеется, нет требования, чтобы настоящий гипервизор всегда устанавливал этот бит, особенно для гипервизоров программного обеспечения. – Jeroen Mostert 4 September 2017 в 11:13
public static bool isVirtualMachine()
{
    const string MICROSOFTCORPORATION = "microsoft corporation";
    const string VMWARE = "vmware"; 

    foreach (var item in new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
    {
        string manufacturer = item["Manufacturer"].ToString().ToLower();
        // Check the Manufacturer (eg: vmware, inc)
        if (manufacturer.Contains(MICROSOFTCORPORATION) || manufacturer.Contains(VMWARE))  
        {
            return true;
        }

        // Also, check the model (eg: VMware Virtual Platform)
        if (item["Model"] != null)
        {
            string model = item["Model"].ToString().ToLower();
            if (model.Contains(MICROSOFTCORPORATION) || model.Contains(VMWARE)) 
            {
                return true;
            }
        }
    }
    return false;
}
0
ответ дан user815809 28 August 2018 в 02:33
поделиться
  • 1
    К сожалению, эта и подобные методы не работают в моей системе W7, где работает VMWare ThinApp для тестирования. queryObj.Properties идентичны в обеих средах. – Jesse Chisholm 26 May 2013 в 17:07
Другие вопросы по тегам:

Похожие вопросы: