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

 eXeL@B —› Крэки, обсуждения —› Генерация демо ключа
Посл.ответ Сообщение

Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 декабря 2014 14:11 · Поправил: BoID
· Личное сообщение · #1

Добрый день.

Есть некий программный комплекс честно купленный, стоит на сервере. Привязка к железу.
Есть тестовый контур. При покупке разработчик дал нам две лицензии на продуктивный и на тестовый контуры. Вышла новая версия. Удачно перешли на нее, но нам дали только одну лицензию. Благо есть демо версия. Но у нее проблема в ограничении во времени и кол одновременных соединений. Со временем удалось победить.
Ключ генерируется во время установки. Я перевел время вперед под час установки и время действия ключа продлилось. Хочется обойти ограничение в кол. сессий. Проведя анализ я выяснил что за работу с лицензиями отвечает одна длл. Вооружившись сначала dllexp я узнал какие функции она экспортирует. Там были такие функции CheckLicenseKey,GetDemoLicense и другие. Мне нужна GetDemoLicense. Вооружившись RecStudio и IDA я решил посмотреть код. Вот кусок который по моему мнению мне и нужен


Code:
  1.   
  2. int __stdcall GetDemoLicense(int a1)
  3. {
  4.   return GetDemoLicense2(1, a1);
  5. }
  6.  
  7.  
  8. int __stdcall GetDemoLicense2(__int16 a1, int a2)
  9. {
  10. ///............ тут определение переменных ----
  11. v53 = (unsigned int)&v3 ^ dword_60A1E010;
  12.   v4 = a2;
  13.   v5 = _time32(0);
  14.   v10 = 1;
  15.   v11 = 0;
  16.   v12 = 100;
  17.   v9 = 0;
  18.   v8 = 0;
  19.   v7 = 0;
  20.   v15 = -1;
  21.   v13 = 0;
  22.   v14 = 0;
  23.   v6 = sub_60A03A5D(&v7);
  24.   if ( v6 == -1 )
  25.     sub_60A03253();
  26.   sub_60A0ADD0(&v16, 0, 2224);
  27.   sub_60A029F0(&v18);
  28.   v17 = (v5 - v6) / 86400 + 30;
  29.   v43 = (v5 - v6) / 86400 + 30;
  30.   v24 = 5;
  31.   v23 = 5;
  32.   v29 = 5;
  33.   v30 = 5;
  34.   v39 = 5;
  35.   v42 = 5;
  36.   v51 = 5;
  37.   v27 = 1;
  38.   v31 = 1;
  39.   v33 = 1;
  40.   v34 = 1;
  41.   v35 = 1;
  42.   v36 = 1;
  43.   v28 = 1;
  44.   v25 = 0;
  45.   v19 = 0;
  46.   v20 = 0;
  47.   v22 = 0;
  48.   v37 = 1;
  49.   v26 = a1;
  50.   v32 = 1;
  51.   v40 = 0;
  52.   v41 = 0;
  53.   v38 = 100;
  54.   v44 = 1;
  55.   v45 = 0;
  56.   v46 = 1;
  57.   v47 = 1;
  58.   v48 = 1;
  59.   v49 = 1;
  60.   v50 = 1;
  61.   v21 = 1;
  62.   v52 = 0;
  63.  
  64. return Func1(&v16, v4);
  65.  
  66. }
  67. int __stdcall Func1(int a1, void *a2)
  68. {
  69. // код
  70. }
  71.  



Подскажите на правильном ли я пути.
Можно ли через hex редактор поменять 5 на другое максимальное число?
И как мне правильно вызвать функцию из длл?
Вот как я сейчас делаю, но получаю ошибку

Code:
  1. #include "stdafx.h"
  2. #include "windows.h"
  3.  
  4. using namespace std;
  5. #include "iostream"
  6. #include "string"
  7.  
  8. void main()
  9. {
  10.          HINSTANCE hModule=NULL;
  11.          HMODULE hLib;
  12.          hLib=LoadLibraryA("License.dll");
  13.          
  14.          if (hLib!=NULL)
  15.          {
  16.                  cout << "load Dll\n";
  17.                  
  18.                  int (*pGetDemoLicense)( string*);
  19.                  int (*pCheckLicenseKey)(string);
  20.                  
  21.                  (FARPROC &)pGetDemoLicense=GetProcAddress(hLib,"GetDemoLicense");
  22.                  (FARPROC &)pCheckLicenseKey=GetProcAddress(hLib,"CheckLicenseKey");
  23.  
  24.                  cout << "Dll loaded\n";
  25.  
  26.                  string key="";
  27.                  pGetDemoLicense(&key);
  28.  
  29.                  cout << "key: " + key;
  30.                  cout << "\n end";
  31.  
  32.                  FreeLibrary(hLib);
  33.          }
  34.          else cout << "error load Dll" ;
  35.          cin.get();
  36. }


Прошу сильно не "пинать", так как такое делаю впервые.

Есть небольшой "бюджет" для решения задачи.



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

Создано: 19 декабря 2014 14:22 · Поправил: vovanre
· Личное сообщение · #2

Так я не понял. Тебе разобраться нужно? Или просто сломать?

Если просто сломать то иди в запросы\поиск специалистов, а если разобраться то хоть выложи программу.

Какую ошибку выбивает?



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 декабря 2014 15:00
· Личное сообщение · #3

Можно советом, а можно просто сломать.
Разместить в запросах не могу, так как нарушу несколько пунктов(не могу светить название программы).
Название программы и ссылку для скачивания могу выслать в личку.

Ошибка
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 19 декабря 2014 15:05
· Личное сообщение · #4

BoID пишет:
Ошибка

осталось научиться читать по англиЦки
в гугл вбивай свои абракадабры и читай,
как по мне все очевидно и /thread



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 декабря 2014 15:06
· Личное сообщение · #5

Читать то могу, а вот понять нет - не програмиррую я на С++, а так некоторые поделки на C#, VB6




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

Создано: 19 декабря 2014 15:08
· Личное сообщение · #6

BoID декларация вызова stdcall, в ошибке же все написанно

-----
[nice coder and reverser]




Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 декабря 2014 15:16
· Личное сообщение · #7

Hellspawn
Тот момент когда чувствую себя блондинкой.

А можно поподробней ?




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

Создано: 19 декабря 2014 15:43
· Личное сообщение · #8

BoID

http://msdn.microsoft.com/ru-ru/library/zxk0tw93.aspx
http://trubetskoy1.narod.ru/arttranslate/FuncCallPart2_2.html

гугл

-----
[nice coder and reverser]





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 19 декабря 2014 16:03 · Поправил: Vamit
· Личное сообщение · #9

int (*pGetDemoLicense)( string*);
объява неверная, должно быть
int (_stdcall *pGetDemoLicense)( string*); правильность аргумента не смотрел

-----
Everything is relative...





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

Создано: 19 декабря 2014 16:13
· Личное сообщение · #10

Vamit ну зачем ты сразу так, нужно чтобы он сам допер, что это такое и зачем...

-----
[nice coder and reverser]




Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 января 2015 09:55
· Личное сообщение · #11

Хочу вернутся к обсуждению вопроса.


Спасибо за подсказку и ссылки.

Сейчас у меня проблема с определением типа параметров функции. Пробовал string,char,LPSTR
Не хватает знаний в с++.
Уже полез в исталятор (msi). Используя ORCA витянул скрипт в котором функция проверки и генерации демо ключа ( Binary)
Потом скормил IDA
Вот что получил
Code:
  1. signed int __stdcall CheckInputLicenseKey(MSIHANDLE hInstall)
  2. {
  3.   signed int v2; // ebx@4
  4.   HMODULE v3; // esi@4
  5.   const CHAR *v4; // [sp-10h] [bp-AACh]@10
  6.   const CHAR *v5; // [sp-Ch] [bp-AA8h]@9
  7.   int v6; // [sp+4h] [bp-A98h]@1
  8.   DWORD pcchValueBuf; // [sp+8h] [bp-A94h]@1
  9.   int v8; // [sp+Ch] [bp-A90h]@7
  10.   CHAR szValueBuf; // [sp+8BCh] [bp-1E0h]@3
  11.   const CHAR szValue; // [sp+8C8h] [bp-1D4h]@5
  12.   const CHAR FileName; // [sp+990h] [bp-10Ch]@4
  13.   unsigned int v12; // [sp+A98h] [bp-4h]@1
  14.  
  15.   v12 = (unsigned int)&v6 ^ dword_1001203C;
  16.   pcchValueBuf = 10;
  17.   v6 = 200;
  18.   if ( MsiSetPropertyA(hInstall, "UIInvalidKey", &byte_1000F293)
  19.     || MsiGetPropertyA(hInstall, "UILicensingOption", &szValueBuf, &pcchValueBuf) )
  20.     return 1603;
  21.   v2 = 0;
  22.   v3 = sub_100010A0(hInstall, &FileName);
  23.   if ( _mbscmp((const unsigned __int8 *)&szValueBuf, (const unsigned __int8 *)"Licensed") )
  24.   {
  25.     if ( !MsiGetPropertyA(hInstall, "LICENSE_KEY", (LPSTR)&szValue, (LPDWORD)&v6) )
  26.     {
  27.       if ( !v3 )
  28.       {
  29. LABEL_18:
  30.         szValue = 0;
  31. LABEL_19:
  32.         v5 = &szValue;
  33.         goto LABEL_20;
  34.       }
  35.       if ( sub_100013C0(v3, (int)&szValue, (int)&v8) && sub_10001420((int)&v8, hInstall, v3) && sub_10001520(&v8) )
  36.         goto LABEL_23;
  37.     }
  38.     if ( v3 && sub_100013F0(v3, (int)&szValue) )
  39.       goto LABEL_19;
  40.     goto LABEL_18;
  41.   }
  42.   if ( MsiGetPropertyA(hInstall, "UILicenseKey", (LPSTR)&szValue, (LPDWORD)&v6)
  43.     || v3 && (!sub_100013C0(v3, (int)&szValue, (int)&v8) || !sub_10001420((int)&v8, hInstall, v3)) )
  44.   {
  45.     v5 = (const CHAR *)L"1";
  46.     v4 = "UIInvalidKey";
  47.     goto LABEL_21;
  48.   }
  49.   v5 = &szValue;
  50. LABEL_20:
  51.   v4 = "LICENSE_KEY";
  52. LABEL_21:
  53.   if ( MsiSetPropertyA(hInstall, v4, v5) )
  54.     v2 = 1603;
  55. LABEL_23:
  56.   if ( v3 )
  57.   {
  58.     FreeLibrary(v3);
  59.     DeleteFileA(&FileName);
  60.   }
  61.   return v2;
  62. }
  63.  
  64.  
  65. int (__stdcall *__cdecl sub_100013C0(HMODULE hModule, int a2, int a3))()
  66. {
  67.   int (__stdcall *result)(); // eax@1
  68.  
  69.   result = GetProcAddress(hModule, (LPCSTR)2);
  70.   if ( result )
  71.     result = (int (__stdcall *)())(((int (__stdcall *)(_DWORD, _DWORD))result)(a2, a3) != 0);
  72.   return result;
  73. }
  74.  
  75. FARPROC __cdecl sub_100013F0(HMODULE hModule, int a2)
  76. {
  77.   FARPROC result; // eax@1
  78.  
  79.   result = GetProcAddress(hModule, "GetDemoLicense");
  80.   if ( result )
  81.   {
  82.     ((void (__stdcall *)(_DWORD))result)(a2);
  83.     result = (FARPROC)1;
  84.   }
  85.   return result;
  86. }
  87.  



Буду очень благодарен за помощь.

Спасибо



Ранг: 431.7 (мудрец), 389thx
Активность: 0.730.32
Статус: Участник

Создано: 21 января 2015 19:35 · Поправил: dosprog
· Личное сообщение · #12

BoID пишет:
Сейчас у меня проблема с определением типа параметров функции. Пробовал string,char,LPSTR


Все параметры с xxxHANDLE или Hxxx - это хэндлы. Беззнаковое целое DWORD. Могут быть и указателями.
Все (int) - знаковыё целые. Указателями быть не могут, просто числа.



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 января 2015 10:08 · Поправил: BoID
· Личное сообщение · #13

Спасибо огромное.
Утром прошел, прочел пост, посмотрел код и меня осенило
Вот рабочий код геренации ключа

Code:
  1. #include "stdafx.h"
  2. #include "windows.h"
  3.  
  4. using namespace std;
  5. #include "iostream"
  6. #include "string"
  7.  
  8.  
  9. FARPROC __cdecl GetKey(HMODULE hModule, int a2)
  10. {
  11.   FARPROC result;
  12.   result = GetProcAddress(hModule, "GetDemoLicense");
  13.   if ( result )
  14.   {
  15.     ((void (__stdcall *)(DWORD))result)(a2);
  16.     result = (FARPROC)1;
  17.   }
  18.   return result;
  19. }
  20.  
  21.  
  22. void main()
  23. {
  24.     HINSTANCE hModule=NULL;
  25.          HMODULE hLib;
  26.          hLib=LoadLibraryA("License.dll");
  27.          
  28.          if (hLib!=NULL)
  29.          {
  30.                  const CHAR szValue=*"1";
  31.                  cout << "Dll loaded\n";
  32.                  GetKey(hLib,(int)&szValue);
  33.                  cout << "KEY ";
  34.                  cout << &szValue;
  35.          }
  36.          else
  37.          {
  38.                  cout << "Dll not loaded";
  39.          }
  40.          cin.get();
  41. }



 eXeL@B —› Крэки, обсуждения —› Генерация демо ключа
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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