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

 eXeL@B —› Вопросы новичков —› Обратить функцию FoxPro
Посл.ответ Сообщение

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

Создано: 25 октября 2013 09:46 · Поправил: Loh_Ushastik
· Личное сообщение · #1

Есть функция на фокспро:

FUNCTION Reg
***
ENDFUNC


Переменная id - это идентификатор компьютера с абсалютным значением которого в итоге сравнивается результат вычисления функции с входящим параметром id1 - введенный серийник.

Софт реверсится на раз - хочешь верни в обоих случаях фальс, хочешь поправь на сравнение одной и той же переменной. Вот теперь хочу типа КГ сделать.
Первый цикл оформил , а вот два вложенные ниже ну никак логику не пойму, вернее результат отличается от того , что получается в программе.

для контроля :
Серийник на входе - id1 = 2222222222221111
Идентификатор на входе и при сравнении на выходе из функции id = 1809384867

Результат вычислений программой - id1 =0000000000033211

Пишу на Делфи.
Подскажите обратима она?

линейно вроде бы все понятно:
1. собирает строку из серийника, каждый символ типа число А=10 (длина >1) если 1 (длина <1) то лепит ноль так 01
2. В получившейся строке с хвоста берет числа (2 символа) и ксорит их с предыдущим
3. Потом в строке меняет i-тую пару на результат ксор (если нужно дописывает ведущий ноль)
4. И в конце выбирает каждый второй символ из результирующей строки

Ксор функция обратимая, это хорошо но эти циклы меня совсем запутали.



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

Создано: 25 октября 2013 11:40
· Личное сообщение · #2

Loh_Ushastik пишет:
Пишу на Делфи.

Так а где Делфи-вариант ?

Loh_Ushastik пишет:
Подскажите обратима она?

Да.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 25 октября 2013 12:20 · Поправил: -=AkaBOSS=-
· Личное сообщение · #3

сппшный вариант.
работает напрямую с байтами, без заморочек с преобразованиями
Code:
  1. #include <string.h>
  2.  
  3. #define KEYLEN 16
  4.  
  5. bool Reg (char *_hwid, char *key)
  6. {
  7.     char shid[KEYLEN], hwid[KEYLEN];
  8.  
  9.  
  10. // преобразование хвида (для сравнения)
  11. // "1809384867" =
  12. // {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x08,0x00,0x09,0x03,0x08,0x04,0x08,0x06,0x07}
  13.     int strpos = KEYLEN - strlen(_hwid);
  14.     for (int i = 0; i < KEYLEN; i++)
  15.         hwid[i] = (>= strpos)? (_hwid[i-strpos] - '0') : 0;
  16.  
  17. // преобразование ключа
  18. // "2222222222221111" = 
  19. // {0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01}
  20.     for (int i = 0; i < KEYLEN; i++)
  21.     {
  22.         char ch = (key[i] > '0')? key[i]-'0': 0;
  23.         ch -= (ch >= ('A'-'0'))? ('A'-'0'-0x0A): 0;
  24.         
  25.         shid[i] = (ch >= 0 && ch <= 0x0F)? ch: 0;
  26.     }
  27.  
  28. // собственно, трансформация
  29.     for (int i = KEYLEN-1; i >= 0; i--)
  30.     {
  31.         for (int j = KEYLEN-3; j >= 0; j--)
  32.         {
  33.             if (!= i)
  34.                 shid[j] ^= shid[i];
  35.         }
  36.     }
  37.  
  38.     return !memcmp (hwid, shid, KEYLEN);
  39. }
  40.  
  41.  
  42. int main()
  43. {
  44.          bool IsReg = Reg ("1809384867", "2222222222221111");
  45. }


/ADD
по моим подсчётам, для указанного хвида может подойти такой ключ:
99999998190A1D67

проверь его - если подойдёт, выложу алго. не на паскале, правда)

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

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

Создано: 25 октября 2013 12:22 · Поправил: Loh_Ushastik
· Личное сообщение · #4

ну с первым циклом я вот так поступил :
Code:
  1. FOR i:= 1 to length(id1) do  begin
  2.    ***
  3.     end;


все норм результат промежуточный верен .

а со вложеными двумя пока эксперементирую



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

Создано: 25 октября 2013 14:14 · Поправил: Loh_Ushastik
· Личное сообщение · #5

-=AkaBOSS=- пишет:
сппшный вариант.

Спасибо , с преобразованием я поня и что ксор понятно, а вот как заразу вывернуть в обратную сторону , с момента :
IF VAL(id1)<>ABS(id) где при правильном серийнике будет сравниваться IF VAL(1809384867)<>ABS(1809384867)
и в обратную сторону размотать алгоритм , чтобы получить валидный Кей ?
По логике я так понимаю при выходе из циклов:
Code:
  1. FOR i = LEN(shid)-1 TO 1 STEP -2
  2. ***
  3. ENDFOR
  4. ENDFOR

Должна быть строка : 00000000000001080009030804080607 для моего компьютера.
А вот следующий шаг к началу - застрял. Вот эти цыклы как обратить?



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

Создано: 25 октября 2013 17:46
· Личное сообщение · #6

Всем спасибо ! Сам победил, ксор рулит


 eXeL@B —› Вопросы новичков —› Обратить функцию FoxPro
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати