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

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

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

Создано: 14 июня 2011 06:34 · Поправил: uinor
· Личное сообщение · #1

Есть кодированная строка "dabbababbbfcbaabbbehaneafiopbhedciop" (без кавычек), декодирование выглядит следующим образом:
Code:
  1. procedure DecodeString(var a1: String; a2: Byte);
  2. var
  3.   v2: Byte;
  4.   i, v4, v5, v6: Integer;
  5. begin
  6.   v5 := Length(a1);
  7.   v4 := Trunc(v5 / 2);
  8.   for i := 1 to v4 do
  9.   begin
  10.     v2 := (16 * Ord(a1[i]) - 16) or (Ord(a1[v4 + i]) - 97);
  11.     a1[i] := Char(v2);
  12.   end;
  13.   if (a2 <> 0) then
  14.   begin
  15.     if (v4 <> 0) then
  16.     begin
  17.       v6 := Trunc(v5 / 2);
  18.       i := 1;
  19.       repeat
  20.         a1[i] := Char(Ord(a1[i]) xor a2);
  21.         Inc(i);
  22.         Dec(v6);
  23.       until (v6 = 0);
  24.     end;
  25.   end;
  26.   a1 := Copy(a1, 1, v4);
  27. end;
, где
a1 - закодированная строка;
a2 - xor-ключ (в примере 71h)

Получаем ответ: "Evaluation Version" (без кавычек)

Обращаем:
Code:
  1. procedure EncodeString(var a1: String; a2: Byte);
  2. var
  3.   v2: Byte;
  4.   i, v4, v5, v6: Integer;
  5. begin
  6.   v5 := Length(a1);
  7.   SetLength(a1, v5 * 2);
  8.   if (a2 <> 0) then
  9.   begin
  10.     if (v5 <> 0) then
  11.     begin
  12.       v6 := v5;
  13.       i := 1;
  14.       repeat
  15.         a1[i] := Char(Ord(a1[i]) xor a2);
  16.         Inc(i);
  17.         Dec(v6);
  18.       until (v6 = 0);
  19.     end;
  20.   end;
  21.   for i := 1 to v5 do
  22.   begin
  23.     v2 := Trunc(Ord(a1[i]) / 16) + 97;
  24.     a1[v5 + i] := // ВОТ ТУТ ВЗРЫВ МОЗГА!
  25.     a1[i] := Char(v2);
  26.   end;
  27. end;


Извините за качество кода - это голый рип, без оптимизации и с кривым неймингом.

Мозг уже отказывается варить, подскажите.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 14 июня 2011 10:39
· Личное сообщение · #2

Code:
  1. char *Encode(char *in, char *out, u_int8_t xor)
  2. {
  3.          int i, len = strlen(in);
  4.          
  5.          for (= 0; i < len; i++)
  6.          {
  7.                  out[i] = in[i] ^ xor;
  8.                  out[+ len] = (out[i] & 0xF) + 97;
  9.                  out[i] = out[i] / 16 + 97;
  10.          }
  11.          
  12.          out[len * 2] = '\0';
  13.          
  14.          return out;
  15. }


-----
Лучше быть одиноким, но свободным © $me


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

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

Создано: 14 июня 2011 15:58
· Личное сообщение · #3

@BoRoV, премного благодарен, понял. Решение есть, работает, тема закрыта.


 eXeL@B —› Крэки, обсуждения —› Обратить алгоритм
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати