Registry

작성자: amesde9@gmail.com, 1 년 전에, 코딩언어: C, 조회: 834 회.
URL http://pastebin.co.kr/view/62880dd6 - 공유: Twitter | Facebook | Google Embed
다운로드 또는 원본 보기
  1. #include <WINDOWS.H>
  2.  
  3. // strstr()는 문자열에서 부분 문자열의 시작위치를 반환하는 함수이다.
  4. // 부분 문자열의 위치를 찾을 수 없는 경우(실패시) NULL을 반환한다.
  5. // 되도록 C 런타임 함수를 사용하지 않는것이 목적이므로, 동일하게 동작하는 커스텀 함수를 대신 적용한다.
  6. // 넷상에 공개된 직접 구현 소스를 빌려 사용한다.
  7. char *mod_strstr(const char *str1, const char *str2)
  8.  
  9. {
  10.         char *cp = (char *) str1;
  11.         char *s1, *s2;
  12.  
  13.         if (!*str2) return (char *) str1;
  14.  
  15.         while (*cp)
  16.         {
  17.                 s1 = cp;
  18.                 s2 = (char *) str2;
  19.  
  20.                 while (*s1 &amp;&amp; *s2 &amp;&amp; !(*s1 - *s2)) s1++, s2++;
  21.                 if (!*s2) return cp;
  22.                 cp++;
  23.         }
  24.  
  25.         return NULL;
  26. }
  27.  
  28. BOOL ADT_VMware_Registry_Check() {
  29.  
  30.         CHAR keyValue[255];             // 읽어온 키 값을 저장할 변수
  31.         DWORD dwType;
  32.         DWORD dwBytes;
  33.  
  34.         HKEY hKey;
  35.  
  36.         int retval;
  37.  
  38.         struct keys {
  39.  
  40.                 CHAR keyPath[255];
  41.                 CHAR SubKey[255];
  42.         } arKeys [] = {
  43.                 { "SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",
  44.                 "0" },
  45.                 { "SYSTEM\\ControlSet001\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000",
  46.                 "DriverDesc" },
  47.                 { "SYSTEM\\ControlSet001\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000",
  48.                 "ProviderName" },
  49.                 { "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0\\Scsi Bus 0\\Target Id 0\\Logical Unit Id 0",
  50.                 "Identifier" },
  51.                 { "HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 1\\Scsi Bus 0\\Target Id 0\\Logical Unit Id 0",
  52.                 "Identifier" }
  53.         };
  54.  
  55.  
  56.         for(int i = 0; i &lt; ( sizeof(arKeys) / sizeof(arKeys[0]) ); i++) {
  57.  
  58.                 retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, arKeys[i].keyPath, 0L, KEY_READ, &amp;hKey);
  59.                 if(retval != ERROR_SUCCESS) {
  60.                         continue;       // 레지스트리를 열지 못할 경우 무시하고 다음 키로 넘어간다.
  61.                 }
  62.  
  63.                 // RegQueryValueEx() 호출 전 지역변수의 쓰레기값을 초기화한다.
  64.                 memset(keyValue, 0, sizeof(keyValue));
  65.                 dwBytes = sizeof(keyValue);
  66.  
  67.                 retval = RegQueryValueEx(hKey, arKeys[i].SubKey, 0, &amp;dwType, (LPBYTE)keyValue, (PDWORD)&amp;dwBytes);
  68.                 if(retval != ERROR_SUCCESS) {
  69.                         MessageBox(NULL, "error!", "TEST", MB_OK);
  70.                         RegCloseKey(hKey);
  71.                         continue;
  72.                 }
  73.  
  74.                 // mod_strstr함수가 NULL을 반환하지 않는다면, 부분 문자열이 포함되어 있는 것이다.
  75.                 if(mod_strstr(keyValue, "VMware") != NULL) {
  76.  
  77.                         MessageBox(NULL, "VM detected!", "TEST", MB_OK);
  78.                         RegCloseKey(hKey);
  79.                         return TRUE;            // 하나라도 검출되면 TRUE를 반환하고 종료
  80.                 }
  81.                 RegCloseKey(hKey);
  82.         }
  83.  
  84.         MessageBox(NULL, "VM not detected", "TEST", MB_OK);
  85.         return FALSE;
  86. }
  87.  
  88. int main() {
  89.  
  90.         ADT_VMware_Registry_Check();
  91.         return 0;
  92. }
  93.  

답글: "Registry"

이 곳에 위 붙여넣기에 답글을 달수있습니다.