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

 eXeL@B —› Вопросы новичков —› подскажите md5 или нет
Посл.ответ Сообщение

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

Создано: 07 сентября 2014 20:44
· Личное сообщение · #1

если кому не сложно гляньте dll
call по этому адресу 100146CD (в качестве параметров строка и ее длинна). на выходе 16 байт

это
.text:1001538E and dword ptr [eax], 0
.text:10015391 and dword ptr [eax+4], 0
.text:10015395 mov dword ptr [eax+8], 67452301h
.text:1001539C mov dword ptr [eax+0Ch], 0EFCDAB89h
.text:100153A3 mov dword ptr [eax+10h], 98BADCFEh
.text:100153AA mov dword ptr [eax+14h], 10325476
и код по адресу 100153B2 вроде бы намекает на md5, но что-то у меня не выходит получить такой же результат как в dll. пробовал и md5 и md4. то ли модифицированный, то ли несколько раз прогоняeтся...

http://rghost.ru/57898444



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 07 сентября 2014 21:07
· Личное сообщение · #2

MD5 Initializing A=67452301 B=EFCDAB89 C=98BADCFE D=10325476



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 08 сентября 2014 07:37
· Личное сообщение · #3

Code:
  1. void MD5_Init(MD5_CTX *c)
  2.          {
  3.          c->A=INIT_DATA_A;
  4.          c->B=INIT_DATA_B;
  5.          c->C=INIT_DATA_C;
  6.          c->D=INIT_DATA_D;
  7.          c->Nl=0;
  8.          c->Nh=0;
  9.          c->num=0;
  10.          }

т.е.
Code:
  1. MOV EDX,DWORD PTR SS:[ESP+4]            
  2. MOV DWORD PTR DS:[EDX],67452301
  3. XOR EAX,EAX
  4. MOV DWORD PTR DS:[EDX+4],EFCDAB89
  5. MOV DWORD PTR DS:[EDX+10],EAX
  6. MOV DWORD PTR DS:[EDX+14],EAX
  7. MOV DWORD PTR DS:[EDX+58],EAX
  8. MOV DWORD PTR DS:[EDX+8],98BADCFE
  9. MOV DWORD PTR DS:[EDX+0C],10325476
  10. RETN

а тут константы раскиданы немного по другому
с другой стороны, по идее 10015C16 - MD5_Update и 10015CA2 - MD5_Final. 100153B2 - MD5_Transform

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

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

Создано: 08 сентября 2014 07:58
· Личное сообщение · #4

Двойной MD5 с солью. В PasswordsPro этот алгоритм называется MD5(HMAC).
https://ru.wikipedia.org/wiki/HMAC

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

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

Создано: 09 сентября 2014 20:37
· Личное сообщение · #5

Prober пишет:
Двойной MD5 с солью. В PasswordsPro этот алгоритм называется MD5(HMAC).
https://ru.wikipedia.org/wiki/HMAC

да действительно оно, спс. есть два блока по $40 байт, один заполнен "6" другой "". и на входе в функцию помимо основного текста для хеширования, есть ключевое слово (раньше я думал просто доп проверка), с хешем которого ксорятся два блока по $40 байт, ну и потом работа с основным текстом...
но все таки видимо алгоритм модифицирован. т.к. перепробовал несколько вариантов и не могу получить такой же хеш.
буду наверно asm код копировать...



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

Создано: 10 сентября 2014 09:43
· Личное сообщение · #6

zds пишет:
но все таки видимо алгоритм модифицирован

Не модифицирован, один в один. PPro дал такой же хеш, как DLL.

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


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 сентября 2014 12:52
· Личное сообщение · #7

zds
Попробуйте --> OpenSSL hmac<--

-----
Stuck to the plan, always think that we would stand up, never ran.


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

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

Создано: 11 сентября 2014 23:45
· Личное сообщение · #8

Prober пишет:
Не модифицирован, один в один. PPro дал такой же хеш, как DLL.

блин, видимо я очень криворук. перерыл множество примеров реализации, так и не смог подобрать нужный. в том числе и PPRro не выдает нужного хэша
например исходные данные:
ключ
01B43528 48 00 49 00 54 00 41 00 43 00 48 00 49 00 00 00 H.I.T.A.C.H.I...
данные
01BF02AC 54 00 45 00 53 00 54 00 44 00 41 00 54 00 41 00 T.E.S.T.D.A.T.A.
01BF02BC 5F 00 54 00 45 00 53 00 54 00 44 00 41 00 54 00 _.T.E.S.T.D.A.T.
01BF02CC 41 00 5F 00 54 00 45 00 53 00 54 00 44 00 41 00 A._.T.E.S.T.D.A.
01BF02DC 54 00 41 00 5F 00 54 00 45 00 53 00 54 00 31 00 T.A._.T.E.S.T.1.
результат
094BE2E8 8D 29 E3 18 27 50 11 BE 6E D7 69 7E 40 E1 04 21 .)..'P..n.i~@..!


нашел вот такую асм реализацию http://rghost.ru/57966594
результат 40914afbb3e103024e50fcac1ab69bfc


ARCHANGEL пишет:
Попробуйте --> OpenSSL hmac<--

C к сожалению не знаю. могу только на Delphi и немного C#

нашел такую реализацию через Cryptoapi
Code:
  1. function Hashhmacsha1(const Key, Value: AnsiString): AnsiString;
  2. const
  3.   KEY_LEN_MAX = 16;
  4. var
  5.   hCryptProvider: HCRYPTPROV;
  6.   hHash: HCRYPTHASH;
  7.   hKey: HCRYPTKEY;
  8.   bHash: array[0..$7F] of Byte;
  9.   dwHashLen: dWord;
  10.   i: Integer;
  11.  
  12.   hPubKey : HCRYPTKey;
  13.   hHmacHash: HCRYPTHASH;
  14.   bHmacHash: array[0..$7F] of Byte;
  15.   dwHmacHashLen: dWord;
  16.   hmac_info : Wcrypt2.HMAC_INFO;
  17.  
  18.   keyBlob: record
  19.     keyHeader: BLOBHEADER;
  20.     keySize: DWORD;
  21.     keyData: array[0..KEY_LEN_MAX-1] of Byte;
  22.   end;
  23.   keyLen : INTEGER;
  24. begin
  25.   dwHashLen := 32;
  26.   dwHmacHashLen := 32;
  27.   {get context for crypt default provider}
  28.   if CryptAcquireContext(@hCryptProvider, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) then
  29.   begin
  30.     {create hash-object MD5}
  31.     if CryptCreateHash(hCryptProvider, CALG_MD5, 0, 0, @hHash) then
  32.     begin
  33.  
  34.       {get hash from password}
  35.       if CryptHashData(hHash, PByte(Key), Length(Key), 0) then
  36.       begin
  37.  
  38.         // hHash is now a hash of the provided key, (SHA1)
  39.         // Now we derive a key for it
  40.         hPubKey := 0;
  41.  
  42.         FillChar(keyBlob, SizeOf(keyBlob), 0);
  43.         keyBlob.keyHeader.bType := PLAINTEXTKEYBLOB;
  44.         keyBlob.keyHeader.bVersion := CUR_BLOB_VERSION;
  45.         keyBlob.keyHeader.aiKeyAlg := CALG_RC4;
  46.         KeyBlob.keySize := KEY_LEN_MAX;
  47.  
  48.         if(Length(key) < (KEY_LEN_MAX))then
  49.           KeyLen := Length(key)
  50.         else
  51.           KeyLen := KEY_LEN_MAX;
  52.         Move(Key[1], KeyBlob.keyData[0], KeyLen );
  53.  
  54.         if CryptImportKey(hCryptProvider, @keyBlob, SizeOf(KeyBlob), hPubKey, 0, @hKey) then
  55.         begin
  56.  
  57.           //hkey now holds our key. So we have do the whole thing over again
  58.           ZeroMemory( @hmac_info, SizeOf(hmac_info) );
  59.           hmac_info.HashAlgid := CALG_MD5;
  60.           if CryptCreateHash(hCryptProvider, CALG_HMAC, hKey, 0, @hHmacHash) then
  61.           begin
  62.               if CryptSetHashParam( hHmacHash, HP_HMAC_INFO, @hmac_info, 0) then
  63.               begin
  64.  
  65.                 if CryptHashData(hHmacHash, @Value[1], Length(Value), 0) then
  66.                 begin
  67.                   if CryptGetHashParam(hHmacHash, HP_HASHVAL, @bHmacHash[0], @dwHmacHashLen, 0) then
  68.                   begin
  69.                     for i := 0 to dwHmacHashLen-1 do
  70.                       Result := Result + IntToHex(bHmacHash[i], 2);
  71.                   end
  72.                   else
  73.                    WriteLn( 'CryptGetHashParam ERROR --> ' + SysErrorMessage(GetLastError)) ;
  74.                 end
  75.                 else
  76.                   WriteLn( 'CryptHashData ERROR --> ' + SysErrorMessage(GetLastError)) ;
  77.                 {destroy hash-object}
  78.                 CryptDestroyHash(hHmacHash);
  79.                 CryptDestroyKey(hKey);
  80.               end
  81.               else
  82.                 WriteLn( 'CryptSetHashParam ERROR --> ' + SysErrorMessage(GetLastError)) ;
  83.  
  84.           end
  85.           else
  86.             WriteLn( 'CryptCreateHash ERROR --> ' + SysErrorMessage(GetLastError)) ;
  87.         end
  88.         else
  89.           WriteLn( 'CryptDeriveKey ERROR --> ' + SysErrorMessage(GetLastError)) ;
  90.  
  91.       end;
  92.       {destroy hash-object}
  93.       CryptDestroyHash(hHash);
  94.     end;
  95.     {release the context for crypt default provider}
  96.     CryptReleaseContext(hCryptProvider, 0);
  97.   end;
  98.   Result := AnsiLowerCase(Result);
  99. end;

результат такой же как и выше. Ppro тоже выдает такой же хэш http://rghost.ru/57966825
вобщем чувствую, что я где сильно туплю...как бы уже начал тупо переносить acm код, но просто из принципа хочется понять где косяк, да и чувствую в переносе будет куча багов




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

Создано: 12 сентября 2014 02:48
· Личное сообщение · #9

zds
На скрине ASCII-строки, сорки тоже для них же, на примере же блок данных на основе юникод-строк, а если работаете с блоками по 64 байта, зачем вообще строки сдались ? Если вы думали, что на примере строк упростили задачу - то получилось немного наоборот.

zds пишет:
как бы уже начал тупо переносить acm код

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

p.s. Последний раз риппал 49к строк асм кода (писал кг к плагу для 3ds макса), на рип+дебаг ушло почти 8 часов, это я к тому, что когда это хеш или код "в одну сторону", то часто самым быстрым является именно рип+дальнейшая асм-вставка.

-----
ds


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

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

Создано: 12 сентября 2014 08:13
· Личное сообщение · #10

DimitarSerg пишет:
Вы уж извините за прямоту, тема создана 7 числа, а на дворе 12-ое, этот код можно было наверное не один раз риппнуть и отшлифовать.

p.s. Последний раз риппал 49к строк асм кода (писал кг к плагу для 3ds макса), на рип+дебаг ушло почти 8 часов, это я к тому, что когда это хеш или код "в одну сторону", то часто самым быстрым является именно рип+дальнейшая асм-вставка.

да я бы рад сесть и пару вечеров полностью уделить проблеме. но в силу сложившихся жизненных проблем, могу пока уделить по 1-2 часа и то вечер через вечер...
да и если бы я был профи как все кто мне ответил (спасибо всем) я уверен что хватило бы и пары часов, да и не было бы этой темы.



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

Создано: 12 сентября 2014 08:16
· Личное сообщение · #11

Еще раз сравнил с PPro, действительно, есть нюанс при размере соли >16 байтов, с короткой солью результаты одинаковые. PPro все 64 байта соли, как и положено, ксорит с константами, а ваша программа только 16 начальных байтов. На примере ваших данных:
1. Берутся 64 байта 0x36, первые 16 байтов ксорятся с Unicode("TESTDATA").
2. Сзади добавляются 14 байтов Unicode("HITACHI").
3. Считается MD5 от этих 78 байтов --> DC40C30CCA656393BD992C70C0FC7D6B
4. Берутся 64 байта 0x5C, первые 16 байтов ксорятся с Unicode("TESTDATA").
5. Сзади добавляются 16 байтов из п. 3.
6. Считается MD5 от этих 80 байтов --> B1E77F65200094BBD126BD2CBE6DC19B
Результат тот же в вашей ДЛЛ и в ППро. Думаю, это несложно на любом языке написать, либо действительно рипнуть, если уж иначе не выходит.

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


Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 12 сентября 2014 14:24
· Личное сообщение · #12

zds пишет:
могу пока уделить по 1-2 часа

любой md5 гораздо менеее часа рипается. base32/36 тоже. в "запросы.." не проще?

-----
От многой мудрости много скорби, и умножающий знание умножает печаль



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


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