Сейчас на форуме: tyns777, cppasm, dutyfree (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Идентификация алгоритма
Посл.ответ Сообщение

Ранг: 42.9 (посетитель), 13thx
Активность: 0.040
Статус: Участник

Создано: 12 декабря 2016 10:19 · Поправил: cryptX
· Личное сообщение · #1

Уважаемые друзья,
не подскажете какой хеш/црц (стандартный или нет ?) алгоритм предоставляет из себя эта функция ?, FindCrypt показывает на MD5, но выходной результат при MD5 другой.

Вот функция:

Code:
  1. int __userpurge sub_11630D4@<eax>(int a1@<eax>, _DWORD *a2@<ecx>, int edx0@<edx>, int a3)
  2. {
  3.   _DWORD *v4; // ebx@1
  4.   int result; // eax@1
  5.   int v6; // [sp+Ch] [bp-18h]@1
  6.   int v7; // [sp+10h] [bp-14h]@1
  7.   int v8; // [sp+14h] [bp-10h]@1
  8.   int v9; // [sp+18h] [bp-Ch]@1
  9.   int v10; // [sp+1Ch] [bp-8h]@1
  10.   int v11; // [sp+20h] [bp-4h]@1
  11.  
  12.   v4 = a2;
  13.   v10 = edx0;
  14.   v11 = a1;
  15.   v9 = *(_DWORD *)a1;
  16.   v8 = *(_DWORD *)(a1 + 4);
  17.   v7 = *(_DWORD *)(a1 + 8);
  18.   v6 = *(_DWORD *)(a1 + 12);
  19.   sub_1162FF8(&v9, v8, v7, 7, *a2 - 680876936, v6);
  20.   sub_1162FF8(&v6, v9, v8, 12, v4[1] - 389564586, v7);
  21.   sub_1162FF8(&v7, v6, v9, 17, v4[2] + 606105819, v8);
  22.   sub_1162FF8(&v8, v7, v6, 22, v4[3] - 1044525330, v9);
  23.   sub_1162FF8(&v9, v8, v7, 7, v4[4] - 176418897, v6);
  24.   sub_1162FF8(&v6, v9, v8, 12, v4[5] + 1200080426, v7);
  25.   sub_1162FF8(&v7, v6, v9, 17, v4[6] - 1473231341, v8);
  26.   sub_1162FF8(&v8, v7, v6, 22, v4[7] - 45705983, v9);
  27.   sub_1162FF8(&v9, v8, v7, 7, v4[8] + 1770035416, v6);
  28.   sub_1162FF8(&v6, v9, v8, 12, v4[9] - 1958414417, v7);
  29.   sub_1162FF8(&v7, v6, v9, 17, v4[10] - 42063, v8);
  30.   sub_1162FF8(&v8, v7, v6, 22, v4[11] - 1990404162, v9);
  31.   sub_1162FF8(&v9, v8, v7, 7, v4[12] + 1804603682, v6);
  32.   sub_1162FF8(&v6, v9, v8, 12, v4[13] - 40341101, v7);
  33.   sub_1162FF8(&v7, v6, v9, 17, v4[14] - 1502002290, v8);
  34.   sub_1162FF8(&v8, v7, v6, 22, v4[15] + 1236535329, v9);
  35.   sub_1163030(&v9, v8, v7, 5, v4[1] - 165796510, v6);
  36.   sub_1163030(&v6, v9, v8, 9, v4[6] - 1069501632, v7);
  37.   sub_1163030(&v7, v6, v9, 14, v4[11] + 643717713, v8);
  38.   sub_1163030(&v8, v7, v6, 20, *v4 - 373897302, v9);
  39.   sub_1163030(&v9, v8, v7, 5, v4[5] - 701558691, v6);
  40.   sub_1163030(&v6, v9, v8, 9, v4[10] + 38016083, v7);
  41.   sub_1163030(&v7, v6, v9, 14, v4[15] - 660478335, v8);
  42.   sub_1163030(&v8, v7, v6, 20, v4[4] - 405537848, v9);
  43.   sub_1163030(&v9, v8, v7, 5, v4[9] + 568446438, v6);
  44.   sub_1163030(&v6, v9, v8, 9, v4[14] - 1019803690, v7);
  45.   sub_1163030(&v7, v6, v9, 14, v4[3] - 187363961, v8);
  46.   sub_1163030(&v8, v7, v6, 20, v4[8] + 1163531501, v9);
  47.   sub_1163030(&v9, v8, v7, 5, v4[13] - 1444681467, v6);
  48.   sub_1163030(&v6, v9, v8, 9, v4[2] - 51403784, v7);
  49.   sub_1163030(&v7, v6, v9, 14, v4[7] + 1735328473, v8);
  50.   sub_1163030(&v8, v7, v6, 20, v4[12] - 1926607734, v9);
  51.   sub_1163068(&v9, v8, v7, 4, v4[5] - 378558, v6);
  52.   sub_1163068(&v6, v9, v8, 11, v4[8] - 2022574463, v7);
  53.   sub_1163068(&v7, v6, v9, 16, v4[11] + 1839030562, v8);
  54.   sub_1163068(&v8, v7, v6, 23, v4[14] - 35309556, v9);
  55.   sub_1163068(&v9, v8, v7, 4, v4[1] - 1530992060, v6);
  56.   sub_1163068(&v6, v9, v8, 11, v4[4] + 1272893353, v7);
  57.   sub_1163068(&v7, v6, v9, 16, v4[7] - 155497632, v8);
  58.   sub_1163068(&v8, v7, v6, 23, v4[10] - 1094730640, v9);
  59.   sub_1163068(&v9, v8, v7, 4, v4[13] + 681279174, v6);
  60.   sub_1163068(&v6, v9, v8, 11, *v4 - 358537222, v7);
  61.   sub_1163068(&v7, v6, v9, 16, v4[3] - 722521979, v8);
  62.   sub_1163068(&v8, v7, v6, 23, v4[6] + 76029189, v9);
  63.   sub_1163068(&v9, v8, v7, 4, v4[9] - 640364487, v6);
  64.   sub_1163068(&v6, v9, v8, 11, v4[12] - 421815835, v7);
  65.   sub_1163068(&v7, v6, v9, 16, v4[15] + 530742520, v8);
  66.   sub_1163068(&v8, v7, v6, 23, v4[2] - 995338651, v9);
  67.   sub_116309C(&v9, v8, v7, 6, *v4 - 198630844, v6);
  68.   sub_116309C(&v6, v9, v8, 10, v4[7] + 1126891415, v7);
  69.   sub_116309C(&v7, v6, v9, 15, v4[14] - 1416354905, v8);
  70.   sub_116309C(&v8, v7, v6, 21, v4[5] - 57434055, v9);
  71.   sub_116309C(&v9, v8, v7, 6, v4[12] + 1700485571, v6);
  72.   sub_116309C(&v6, v9, v8, 10, v4[3] - 1894986606, v7);
  73.   sub_116309C(&v7, v6, v9, 15, v4[10] - 1051523, v8);
  74.   sub_116309C(&v8, v7, v6, 21, v4[1] - 2054922799, v9);
  75.   sub_116309C(&v9, v8, v7, 6, v4[8] + 1873313359, v6);
  76.   sub_116309C(&v6, v9, v8, 10, v4[15] - 30611744, v7);
  77.   sub_116309C(&v7, v6, v9, 15, v4[6] - 1560198380, v8);
  78.   sub_116309C(&v8, v7, v6, 21, v4[13] + 1309151649, v9);
  79.   sub_116309C(&v9, v8, v7, 6, v4[4] - 145523070, v6);
  80.   sub_116309C(&v6, v9, v8, 10, v4[11] - 1120210379, v7);
  81.   sub_116309C(&v7, v6, v9, 15, v4[2] + 718787259, v8);
  82.   sub_116309C(&v8, v7, v6, 21, v4[9] - 343485551, v9);
  83.   *(_DWORD *)v11 += v9;
  84.   *(_DWORD *)(v11 + 4) += v8;
  85.   *(_DWORD *)(v11 + 8) += v7;
  86.   result = v11;
  87.   *(_DWORD *)(result + 12) += v6;
  88.   return result;
  89. }


и вспомогательные процедуры:

Code:
  1. int *__userpurge sub_1162FF8@<eax>(int *result@<eax>, int a2@<edx>, int a3@<ecx>, char a4, int a5, int a6)
  2. {
  3.   *result += a5 + (a2 & (a6 ^ a3) ^ a6);
  4.   *result = (*result << a4) | ((unsigned int)*result >> (32 - a4));
  5.   *result += a2;
  6.   return result;
  7. }
  8.  
  9.  
  10. int *__userpurge sub_1163030@<eax>(int *result@<eax>, int a2@<edx>, int a3@<ecx>, char a4, int a5, int a6)
  11. {
  12.   *result += a5 + (a6 & (a3 ^ a2) ^ a3);
  13.   *result = (*result << a4) | ((unsigned int)*result >> (32 - a4));
  14.   *result += a2;
  15.   return result;
  16. }
  17.  
  18. int *__userpurge sub_1163068@<eax>(int *result@<eax>, int a2@<edx>, int a3@<ecx>, char a4, int a5, int a6)
  19. {
  20.   *result += a5 + (a6 ^ a2 ^ a3);
  21.   *result = (*result << a4) | ((unsigned int)*result >> (32 - a4));
  22.   *result += a2;
  23.   return result;
  24. }
  25.  
  26. int *__userpurge sub_116309C@<eax>(int *result@<eax>, int a2@<edx>, int a3@<ecx>, char a4, int a5, int a6)
  27. {
  28.   *result += a5 + ((a2 | ~a6) ^ a3);
  29.   *result = (*result << a4) | ((unsigned int)*result >> (32 - a4));
  30.   *result += a2;
  31.   return result;
  32. }


На входе передаю:
67452301EFCDAB8998BADCFE10325476

На выходе получается:
EDF82238EAB733D6ABF2EC77C9AB9567

Заранее спасибо!




Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 12 декабря 2016 09:22
· Личное сообщение · #2

Ну рипай, хуле тут думать ! А для начала можешь константы сравнить, вдруг где-то поменяно.

-----
ds


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


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

Создано: 12 декабря 2016 10:12 · Поправил: DenCoder
· Личное сообщение · #3

cryptX
Да, это md5. IV посмотрите: v6, v7, v8, v9 должны быть 67452301h, 0EFCDAB89h, 98BADCFEh, 76543210h

-----
IZ.RU


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

Ранг: 42.9 (посетитель), 13thx
Активность: 0.040
Статус: Участник

Создано: 12 декабря 2016 18:20 · Поправил: cryptX
· Личное сообщение · #4

DenCoder
Спасибо. IV частично совпало (на последнем у меня 10325476h), но вот выходной хеш другой, покопаюсь еще может что то недосмотрел.



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 12 декабря 2016 17:27
· Личное сообщение · #5

cryptX пишет:
IV частично совпало (на последнем у меня 10325476h)

так и должно быть, DenCoder ошибся




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

Создано: 12 декабря 2016 18:56
· Личное сообщение · #6

cryptX пишет:
На входе передаю:
67452301EFCDAB8998BADCFE10325476

На выходе получается:
EDF82238EAB733D6ABF2EC77C9AB9567

а на вход данные передаются через программу, или вводятся вручную?

там ведь надо корректно буфер оформить - по стандарту, данные хешируются блоками по 64 байта;
после хэшируемых данных дописывается 1 установленный бит, а последний блок должен в конце содержать длину в битах.

на конкретном примере, на входе в sub_11630D4 в ecx должен быть адрес буфера, оформленного таким образом:

67 45 23 01 EF CD AB 89 98 BA DC FE 10 32 54 76
80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00



Ранг: 42.9 (посетитель), 13thx
Активность: 0.040
Статус: Участник

Создано: 13 декабря 2016 10:04 · Поправил: cryptX
· Личное сообщение · #7

-=AkaBOSS=-
через программу.

Вот смотри что у меня перед входом в функцию 11630D4():

--> Link <--

как я понимаю в 12EF9C находится IV, в 12EFAC длина в битах.
А уже в 12EFB4 данные которые нужно хешировать.

На выходе получается это

--> Link <--

В 12ЕF9C уже выходные данные правильно ?




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

Создано: 13 декабря 2016 12:09 · Поправил: -=AkaBOSS=-
· Личное сообщение · #8

cryptX пишет:
В 12ЕF9C уже выходные данные правильно ?

ксли говорить о стандарте MD5 - нет, это промежуточные данные.
Хэш перед использованием должен быть финализирован, как я описывал выше.

Код основной трансформации, несомненно, MD5 - все константы, смещения, и раундовые функции соответствуют стандарту. Но вот как оно работает с блоками - это еще выяснить надо.

Глядя на код, предполагаю что в ESI - общий размер данных для обработки, а в EBP - размер теущего блока.
Если это так, тогда остальная фигня (все эти двойки и таймштамп в конце) выступают в роли эдакой "соли" в промежутках между кусками хэшируемых данных.

Плюс виден еще и второй вызов трансформации на 1162F1D.

Короч надо разбирать эту процедуру, тут что-то самописное.


cryptX пишет:
в 12EFAC длина в битах.

400h = 1024
1024/8 = 128
получается, 128 байт уже хэшировано? или как?


reversecode пишет:
обычный md5, функция transform

иногда полезно читать не только шапку

reversecode пишет:
третий день

тема создана вчера утром, между прочим

reversecode пишет:
что полный md5, не такой

я ему это и объясняю, в общем-то
и по скринам из #7 уже ясно что хэшируемые блоки формируются не по стандарту




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

Создано: 13 декабря 2016 11:05
· Личное сообщение · #9

обычный md5, функция transform

а сам md5 состоит еще с INIT UPDATE FINAL
вот и думайте

Добавлено спустя 1 час 35 минут
-=AkaBOSS=-
что я там должен увидеть ? что третий день никто афтару не может сказать что он анализирует данные средины алгоритма ?
что полный md5, не такой



Ранг: 42.9 (посетитель), 13thx
Активность: 0.040
Статус: Участник

Создано: 14 декабря 2016 00:48
· Личное сообщение · #10

Спасибо за ответы!

Далнейшая отладка показала что функция sub_11630D4() вызывается несколько раз, при первом визове у функций совпадает IV с МД5, но вот второй вызов уже использует хеш от первого вызова как IV, третий - хеш от второго как IV итд...да и при каждом вызове входные данные для хеширования различаются.

А функция вроде "INIT UPDATE FINAL" так и не нашел, нужный хеш появляется сразу после последного вызова 11630D4(). Может в программе только используется функция transform()-a ?!

Сделаю рип функций и дам знать правильны ли мои доводы.




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

Создано: 14 декабря 2016 00:54
· Личное сообщение · #11

нет не может
инициализация констант в INIT и только
там где в цикле transform и есть UPDATE
вообще в гугле найдите любой псевдокод реализации и сравните со своим
банально даже в рейсе выше трансформа псевдокод посмотреть и сразу станет ясно что UPDATE

Добавлено спустя 1 минуту
рипать смысла нет
есть смысл правильно поймать вход и выход в md5 или что у вас там
и сравнить со стандартным
а вы сравниваете средину промежуточных данных алгоса




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

Создано: 14 декабря 2016 18:38
· Личное сообщение · #12

cryptX пишет:
Далнейшая отладка показала что функция sub_11630D4() вызывается несколько раз, при первом визове у функций совпадает IV с МД5, но вот второй вызов уже использует хеш от первого вызова как IV, третий - хеш от второго как IV итд...да и при каждом вызове входные данные для хеширования различаются.


это по сути и есть последовательное хеширование, блоками по 64 байта.
хэш инициализируется один раз на старте расчёта, потом используется предыдущее состояние.

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

3d97_14.12.2016_EXELAB.rU.tgz - md5test.exe

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

Ранг: 42.9 (посетитель), 13thx
Активность: 0.040
Статус: Участник

Создано: 14 декабря 2016 19:00 · Поправил: cryptX
· Личное сообщение · #13

-=AkaBOSS=-
Спасибо, буду копать и по аналогий найти процедуры в программе.



Ранг: 9.0 (гость), 6thx
Активность: 0.030.02
Статус: Участник

Создано: 14 декабря 2016 19:07
· Личное сообщение · #14

cryptX пишет:
Спасибо, но семпл что то не запускается.

Боже Боже... Всё запускается, в отладчике смотри, ты ж реверсер ?!.

Я всё понимаю, но за 3 дня не осилить мд5 - это наводит на мысли, может стоит в запросы ?




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

Создано: 14 декабря 2016 19:09 · Поправил: -=AkaBOSS=-
· Личное сообщение · #15

cryptX пишет:
Спасибо, но семпл что то не запускается.

в каком смысле?
там лишнего кода нет, поэтому гуёв он не рисует.
предназначен исключительно для просморта под отладчиком или в дизасме.

вдогонку - аттачу сорц на фасме.
не факт, что с макросами будет всё понятно, но мало ли...

dd45_14.12.2016_EXELAB.rU.tgz - md5.asm



Ранг: 42.9 (посетитель), 13thx
Активность: 0.040
Статус: Участник

Создано: 15 декабря 2016 14:42
· Личное сообщение · #16

СПАСИБО Всем!!!

Разобрался наконец! Там было мд5!

Входные данные изначально я правильно нашел, но оказалось там добавляется соль прямо перед входом в функцию transform () что я конечно упустил


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