Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Дневники и блоги —› KITA's notes
Посл.ответ Сообщение

Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 17 апреля 2012 16:52 · Поправил: MasterSoft
· Личное сообщение · #1

Ну вот пля, если зашёл в блоги значит стало совсем скучно. Буду медленно и нудно тут постить всего понемногу.

номер раз:
универсальный ключеген для прог накрытых диамаром. по ссылке таргет, мувик как инструкция по применению. ну и собственно сам кейген.

P.S.: сам не знаю для чего это всё делал, ибо прот наврятли кто-то вообще юзает. скучно видимо совсем.
сам прот можно слить отсюда: йа прот, йа тут

P.P.S.: если кому нужны будут сырки - пинайте, выложил бы сразу, но стыдно такой стрёмный код на обозрение выставлять.

| Сообщение посчитали полезным: _ruzmaz_

Ранг: 6.0 (гость), 8thx
Активность: 0.010
Статус: Участник

Создано: 18 апреля 2012 03:54
· Личное сообщение · #2

сырки прота?




Ранг: 57.3 (постоянный), 67thx
Активность: 0.060
Статус: Участник

Создано: 18 апреля 2012 05:10 · Поправил: -Sanchez-
· Личное сообщение · #3

Сырки гена скорее. Насчет прота - есть ли софт, защищенный этим протом? Ни разу не видел, напишите здесь ссылку у кого есть.



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 01 августа 2012 16:40 · Поправил: MasterSoft
· Личное сообщение · #4

Есть такая фича у вмпрота - DLL Box называется. Сделано оно....скажем так, ну не самая лучшая реализация.
Собственно накалякал дампер этих самых длл'ок из памяти (проснулся рано просто):


Порядок работы примерно такой: Стоим на оеп, вводим пид, затем адрес памяти с виртуальной длл. Хуярим пухлым пальцем синюю кнопку "Dump".

>>> DOWNLOAD<<< 666 кб

upd
а так шифруем/дешифруем эти ваши дллки:
Code:
  1. xor ecx, ecx //обнуляем счётчик
  2. mov edx, 00005800h //размер длл
  3. @loop:
  4. mov ebx, 27F69E70h //xor-ключ
  5. rol ebx, cl
  6. add bl, cl
  7. xor bl, byte ptr ds:[ecx+0x460D8B] //вход
  8. mov byte ptr ds:[ecx+0x390000], bl //выхлоп
  9. inc ecx
  10. cmp ecx, edx
  11. jbe @loop


| Сообщение посчитали полезным: SReg, _ruzmaz_

Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 02 августа 2013 20:22
· Личное сообщение · #5

ну как-то так примерно

0fa0_02.08.2013_EXELAB.rU.tgz - vmp.pas




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 августа 2013 20:40
· Личное сообщение · #6

Следующий пост, полагаю, 3 августа 2014?

| Сообщение посчитали полезным: JMPer, daFix

Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 02 августа 2013 20:50
· Личное сообщение · #7

Archer пишет:
Следующий пост, полагаю, 3 августа 2014?

так и планировалось



Ранг: 17.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 19 января 2015 16:12
· Личное сообщение · #8

Ммм, а vmp.pas это что если кейген то для чего? То есть если разработчик защищает вмпротом свой софт у него нету исходников кейгена чтоли?



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 02 февраля 2015 23:03
· Личное сообщение · #9

neoBlinXaker
А скачать и глянуть видимо слабо? нахера мне выкладывать сорцы гена если они официально в открытом доступе?
Там коряво написанный сорец функи VMProtectGetCurrentHWID.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 03 февраля 2015 11:47
· Личное сообщение · #10

MasterSoft а в чем корявость?

-----
[nice coder and reverser]




Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 08 февраля 2015 02:21
· Личное сообщение · #11

Hellspawn
не добил чуть до финиша, хвиды отсюда и с вмпрота слегка (совсем слегка) отличаются, но это не критично.
ну и код не красив, хотя в последнее время всё больше понимаю, что на делфях он красив быть не может)



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 01 сентября 2016 21:57
· Личное сообщение · #12

Таки изменили генерацию хвида в VMP 3.X.X

Code:
  1. #include <windows.h>
  2. #include <intrin.h>
  3. #include <wincrypt.h>
  4. #include <iphlpapi.h>
  5. #pragma comment(lib, "iphlpapi.lib")
  6. #pragma comment(lib, "crypt32.lib")
  7.  
  8. DWORD _inline SWAP(DWORD Value)
  9. {
  10.          _asm
  11.          {
  12.                  bswap eax
  13.          }
  14. }
  15.  
  16. DWORD HASH(const BYTE * Data, DWORD DataLen)
  17. {
  18.          HCRYPTPROV hProv = 0;
  19.          HCRYPTHASH hHash = 0;
  20.          DWORD rgbHash[5];
  21.          DWORD cbHash = 20;
  22.          CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
  23.          CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash);
  24.          CryptHashData(hHash, Data, DataLen, 0);
  25.          CryptGetHashParam(hHash, HP_HASHVAL, (BYTE*)rgbHash, &cbHash, 0);
  26.          CryptDestroyHash(hHash);
  27.          CryptReleaseContext(hProv, 0);
  28.          return rgbHash[0];
  29. }
  30.  
  31. DWORD CPU()
  32. {
  33.          DWORD result;
  34.          int cpuInfo[4];
  35.          __cpuid(cpuInfo, 1);
  36.          cpuInfo[1] = MAKELONG(LOWORD(cpuInfo[1]), WORD(LOBYTE(HIWORD(cpuInfo[1]))));
  37.          cpuInfo[2] = 0;
  38.          result = HASH((BYTE*)cpuInfo, sizeof(cpuInfo));
  39.          result = SWAP(result);
  40.          return result - (result % 4);
  41. }
  42.  
  43. DWORD HOST()
  44. {
  45.          DWORD result;
  46.          char buffer[(MAX_COMPUTERNAME_LENGTH + 1) * 2];
  47.          DWORD size = MAX_COMPUTERNAME_LENGTH + 1;
  48.          GetComputerName((LPWSTR)buffer, &size);
  49.          result = HASH((BYTE*)buffer, size * 2);
  50.          result = SWAP(result);
  51.          return (result - (result % 4)) + 1;
  52. }
  53.  
  54. DWORD HDD()
  55. {
  56.          DWORD result;
  57.          char buffer[MAX_PATH * 2];
  58.          DWORD size = GetWindowsDirectory((LPWSTR)buffer, MAX_PATH);
  59.          for (DWORD i = 0; i < size; i++)
  60.          {
  61.                  if (buffer[* 2] == 0x5C)
  62.                  {
  63.                         buffer[* 2 + 2] = 0;
  64.                         break;
  65.                  }
  66.          }
  67.          GetVolumeInformation((LPWSTR)buffer, NULL, 0, &result, NULL, NULL, NULL, 0);
  68.          result = HASH((BYTE*)&result, sizeof(result));
  69.          result = SWAP(result);
  70.          return (result - (result % 4)) + 3;
  71. }
  72.  
  73. DWORD MAC(const BYTE * Output)
  74. {
  75.          DWORD result = 0;
  76.          DWORD size = 0;
  77.          GetAdaptersInfo(NULL, &size);
  78.          if (size == 0)
  79.                  return result;
  80.          PIP_ADAPTER_INFO FirstAdapterInfo = (PIP_ADAPTER_INFO)VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  81.          PIP_ADAPTER_INFO AdapterInfo = FirstAdapterInfo;
  82.          if (GetAdaptersInfo(AdapterInfo, &size) != NO_ERROR)
  83.                  return result;
  84.          do
  85.          {
  86.                  *(DWORD*)&Output[result * 4] = HASH(AdapterInfo->Address, AdapterInfo->AddressLength);
  87.                  *(DWORD*)&Output[result * 4] = SWAP(*(DWORD*)&Output[result * 4]);
  88.                  *(DWORD*)&Output[result * 4] = (*(DWORD*)&Output[result * 4] - (*(DWORD*)&Output[result * 4] % 4)) + 2;
  89.                  AdapterInfo = AdapterInfo->Next;
  90.                  result++;
  91.          } while ((AdapterInfo) && (result < 4));
  92.          VirtualFree(FirstAdapterInfo, 0, MEM_RELEASE);
  93.          return result;
  94. }
  95.  
  96. int VMProtectGetCurrentHWID(char *hwid, int size)
  97. {
  98.          DWORD len, sz;
  99.          DWORD data[7];
  100.          data[0] = CPU();
  101.          data[1] = HOST();
  102.          data[2] = HDD();
  103.          len = MAC((BYTE*)&data[3]);
  104.          if ((hwid == NULL) || (size == 0))
  105.          {
  106.                  CryptBinaryToString((BYTE*)&data, sizeof(DWORD) * 3 + sizeof(DWORD) * len, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &sz);
  107.                  return sz;
  108.          }
  109.          sz = size;
  110.          CryptBinaryToString((BYTE*)&data, sizeof(DWORD) * 3 + sizeof(DWORD) * len, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, (LPWSTR)hwid, &sz);
  111.          return sz;
  112. }
  113.  
  114. void _cdecl main()
  115. {
  116.          int nSize = VMProtectGetCurrentHWID(NULL, 0);
  117.          char* hwid = (char*)VirtualAlloc(NULL, nSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  118.          VMProtectGetCurrentHWID(hwid, nSize);
  119.          MessageBox(0, (LPCWSTR)hwid, (LPCWSTR)"", 0);
  120.          VirtualFree(hwid, 0, MEM_RELEASE);
  121.          ExitProcess(0);
  122. }


сорри, за мои плохие плюсы положил бинарь в аттач.

3a71_01.09.2016_EXELAB.rU.tgz - HWID.exe

| Сообщение посчитали полезным: HandMill

Ранг: 51.5 (постоянный), 16thx
Активность: 0.040.01
Статус: Участник

Создано: 05 сентября 2016 20:30
· Личное сообщение · #13

на оф. форуме тоже кое-что есть - http://www.vmpsoft.com/forum/viewtopic.php?f=4&t=1919.



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 05 сентября 2016 20:50
· Личное сообщение · #14

mushr00m
Предусмотрел, за это отвечают строки 40, 51, 70, 88 в вышеприведенном коде

| Сообщение посчитали полезным: mushr00m

Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 14 сентября 2016 20:33 · Поправил: MasterSoft
· Личное сообщение · #15

Проверку CRC тоже поменяли в VMP 3.X.X, но патчить стало проще, главное найти таблицу. Структура такая:
Code:
  1. struct TableOfCRC
  2. {                  
  3.     DWORD Address; //RVA-адрес начала блока
  4.     DWORD Size; //размер блока
  5.     DWORD CRC; //црк, собственной персоной
  6. };

В таблице, в открытом виде лежит только црк, остальное типа зашифровано. Крипт/Декрипт выглядит так:
Code:
  1. DWORD Key = 0xE85CFE23; //уникальный ключ
  2. DWORD Address = 0x1737496C; //адрес из таблички
  3. DWORD Size = 0x17A30050; //размер из таблички
  4. Address = ~(Address & ~Key) & ~(Key & ~Address);
  5. Size = ~(Size & ~Key) & ~(Key & ~Size);

То есть ничего сложного, ключ можно найти поставив бряку на чтение црк-дворда и немного потрейсить, но не вижу в этом необходимости. Дело в том, что если размер в табличке будет равен 0, то проверка данного блока и кучи остальных, которые следуют за ним будут пропущены. Исходя из мега-алго, если мы подадим на вход 0, то на выходе получим ~Key, который мы и запишем в таблицу вместо размера. Стоит упомянуть, что таблиц несколько. Если кому будет интересно, то расскажу более подробно.

Добавлено спустя 2 часа 7 минут
Всё что касается подмены хвида и блэклиста...такое ощущение, что кто-то специально забыл защитить функцию вычисления хэша (хвида и серийника), потому-что стаб чистый, выйти туда и запатчить не составляет труда.

| Сообщение посчитали полезным: HandMill, Autokent
 eXeL@B —› Дневники и блоги —› KITA's notes
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати