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

 eXeL@B —› Программирование —› Реверс алгоритма
Посл.ответ Сообщение

Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 10 июня 2012 14:48 · Поправил: yanus0
· Личное сообщение · #1

Здравствуйте. Подскажите как реверснуть алгоритм. И какие есть подходы к реверсу подобного. Как бы вы решали его? Тоесть сначала розбили на составные или как то по другому. С помощью математических пакетов можно сделать реверс? Алгоритм под Б64.
Нужно найти начальный масив имея конечный масив.
Code:
  1. IHVsb25nW10gZCgpCiAgICAgICAgewogICAgICAgICAgICBpbnQgbnVtMzsKICAgICAgICAgICAgaW50IG51bTU7CiAgICAgICAgICAgIHVpbnRbXSBudW1BcnJheSA9IG5ldyB1aW50WzNdOyAgIC8v0L3QsNGH0LDQu9GM0L3Ri9C5INC80LDRgdC40LIKICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW10geyAKICAgICAgICAgICAgICAgIDIsIDEsIDAsIDAsIDMsIDAsIDQsIDAsIDAsIDMsIDEsIDAsIDAsIDAsIDIsIDAsIAogICAgICAgICAgICAgICAgMywgMCwgNCwgMSwgMCwgMiwgMCwgMywgMCwgNCwgMCwgMSwgMSwgMCwgNCwgMywgCiAgICAgICAgICAgICAgICAwLCAzLCAyLCAwLCAwLCAzLCA0LCAxLCAwLCAxLCAwLCAzLCAwLCAwLCAxLCAwLCAKICAgICAgICAgICAgICAgIDAsIDQsIDEsIDAsIDMsIDEsIDAsIDAsIDEsIDAsIDMsIDAsIDAsIDIsIDAsIDMsIAogICAgICAgICAgICAgICAgMSwgMCwgMywgMCwgNCwgMCwgMiwgMSwgMCwgMiwgMCwgMCwgMSwgMywgMCwgMCwgCiAgICAgICAgICAgICAgICAzLCAwLCAwLCAxLCAwLCAwLCAzLCAwLCAwLCAwLCAxLCA0LCAwLCAyLCAwLCAzCiAgICAgICAgICAgICB9OwogICAgICAgICAgICB1bG9uZ1tdIG51bUFycmF5MiA9IG5ldyB1bG9uZ1s1XTsKICAgICAgICAgICAgaW50W10gbnVtQXJyYXkzID0gbmV3IGludFtudW1BcnJheTIuTGVuZ3RoXTsKICAgICAgICAgICAgZm9yIChudW0zID0gMDsgbnVtMyA8IGJ1ZmZlci5MZW5ndGg7IG51bTMrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbnVtNSA9IChidWZmZXIuTGVuZ3RoIC0gbnVtMykgLSAxOwogICAgICAgICAgICAgICAgaW50IG51bTkgPSBudW01IC8gMHgyMDsKICAgICAgICAgICAgICAgIGJ5dGUgbnVtMTAgPSBidWZmZXJbbnVtNV07CiAgICAgICAgICAgICAgICBpbnQgbnVtMTEgPSBudW1BcnJheTNbbnVtMTBdOwogICAgICAgICAgICAgICAgbnVtQXJyYXkzW251bTEwXSsrOwogICAgICAgICAgICAgICAgYnl0ZSBudW0xMiA9IChieXRlKShudW1BcnJheVtudW05XSAmIDEpOwogICAgICAgICAgICAgICAgbnVtQXJyYXlbbnVtOV0gPSBudW1BcnJheVtudW05XSA+PiAxOwogICAgICAgICAgICAgICAgdmFyIHVsID0gbnVtMTIgPDwgbnVtMTE7IDsKCiAgICAgICAgICAgICAgICBudW1BcnJheTJbbnVtMTBdIHw9ICh1bG9uZyl1bDsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bG9uZyBudW02ID0gbnVtQXJyYXkyWzBdOwogICAgICAgICAgICByZXR1cm4gbnVtQXJyYXkyOyAvL9C60L7QvdC10YfQvdGL0Lkg0LzQsNGB0LjQsgogICAgICAgIH0KICAgICAgIA==





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 10 июня 2012 15:40 · Поправил: OnLyOnE
· Личное сообщение · #2

Сразу в раскодированном виде выложить было в лом?
Code:
  1.  ulong[] d()
  2.         {
  3.             int num3;
  4.             int num5;
  5.             uint[] numArray = new uint[3]; //начальный масив
  6.             byte[] buffer = new byte[] { 
  7.                 2, 1, 0, 0, 3, 0, 4, 0, 0, 3, 1, 0, 0, 0, 2, 0, 
  8.                 3, 0, 4, 1, 0, 2, 0, 3, 0, 4, 0, 1, 1, 0, 4, 3, 
  9.                 0, 3, 2, 0, 0, 3, 4, 1, 0, 1, 0, 3, 0, 0, 1, 0, 
  10.                 0, 4, 1, 0, 3, 1, 0, 0, 1, 0, 3, 0, 0, 2, 0, 3, 
  11.                 1, 0, 3, 0, 4, 0, 2, 1, 0, 2, 0, 0, 1, 3, 0, 0, 
  12.                 3, 0, 0, 1, 0, 0, 3, 0, 0, 0, 1, 4, 0, 2, 0, 3
  13.              };
  14.             ulong[] numArray2 = new ulong[5];
  15.             int[] numArray3 = new int[numArray2.Length];
  16.             for (num3 = 0; num3 < buffer.Length; num3++)
  17.             {
  18.                 num5 = (buffer.Length - num3) - 1;
  19.                 int num9 = num5 / 0x20;
  20.                 byte num10 = buffer[num5];
  21.                 int num11 = numArray3[num10];
  22.                 numArray3[num10]++;
  23.                 byte num12 = (byte)(numArray[num9] & 1);
  24.                 numArray[num9] = numArray[num9] >> 1;
  25.                 var ul = num12 << num11; ;
  26.  
  27.                 numArray2[num10] |= (ulong)ul;
  28.             }
  29.             ulong num6 = numArray2[0];
  30.             return numArray2; //&#208;&#186;&#208;&#190;&#208;&#189;&#208;µ&#209;‡&#208;&#189;&#209;‹&#208;&#185; &#208;&#188;&#208;°&#209;&#129;&#208;&#184;&#208;&#178;
  31.         }
  32.        


-----
aLL rIGHTS rEVERSED!




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 10 июня 2012 16:45
· Личное сообщение · #3

yanus0
А чо, самим нынче вообще ничего не положено делать? Типа вывод hex-rays в .net перекинул и доволен?
Включаем ручки, голову и оптимизируем код для начала. Обычная перепаковка битстрима.

-----
старый пень




Ранг: 51.8 (постоянный), 58thx
Активность: 0.03=0.03
Статус: Участник

Создано: 10 июня 2012 16:47
· Личное сообщение · #4

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



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 11 июня 2012 02:28
· Личное сообщение · #5

OnLyOnE
код специально был выложен в base64, чтобы палива не было.
r_e
Я не прошу весь алгоритм обратить, мне достачно будет подсказки. Ну не знаю я как его оптимизировать...



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 11 июня 2012 04:08
· Личное сообщение · #6

Убери лишние локальные переменные и мертвый код, попереименовывай чо где. Сразу станет ясно как оно работает.

-----
старый пень




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

Создано: 11 июня 2012 11:52 · Поправил: Veliant
· Личное сообщение · #7

Херня какая-то, а не код
Code:
  1. uint[] numArray = new uint[3];
  2. ...
  3. int num9 = num5 / 0x20;
  4. ...
  5. numArray[num9] = numArray[num9] >> 1;


Для начала правильно определи размеры всех массивов и переменных, а потом уже пытайся обращать



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 11 июня 2012 13:42
· Личное сообщение · #8

Veliant
num5 - номер бита в дворде
num9 - номер дворда в стриме
Стрим из 96 бит превращается в 160 бит.
Что не так?

-----
старый пень




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

Создано: 11 июня 2012 13:50 · Поправил: Veliant
· Личное сообщение · #9

Извиняюсь, туплю... меня почему то переклинило, что там mod а не div

buffer.Length = 96
num3 = 0..96
num5 = (96-0)-1 = 95
num9 = 95 mod 32 = 31
numArray[31] = numArray[31] >> 1;
ранее
numArray = new uint[3]




Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 15 июня 2012 10:59
· Личное сообщение · #10

Подскажите обратные операции для: |, >>, <<, &.




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

Создано: 15 июня 2012 11:40
· Личное сообщение · #11

Почитал бы соседний топик по поводу обращения AND https://ssl.exelab.ru/f/action=vthread&forum=5&topic=20012 Ответ-никак.
Если сдвиги не циклические, а именно shl/shr, тоже никак.



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

Создано: 28 сентября 2012 21:55
· Личное сообщение · #12

Veliant
Херня какая-то, а не код
Верно Вы заметили товарищ, что качество кода - полное говно.
Если бы его не подняли с двоичного, а разработали бы с нуля, то:
Первое же ревью рубануло бы такой хардкод наглухо и в продакшон такая шняга никогда не ушла.

Странно, что некоторые надеятся на то, что найдётся IT-специалист, который безвозмездно проведёт анализ , а он ведь, так же как и разработка стоит времени и денег)




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

Создано: 28 сентября 2012 22:13
· Личное сообщение · #13

Очень полезное замечание, особенно спустя 3 месяца.
Не устал ещё во всех подряд топиках по программированию пальцы гнуть?


 eXeL@B —› Программирование —› Реверс алгоритма
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати