Сейчас на форуме: UniSoft, zds, ManHunter, rmn (+5 невидимых)

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

Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 28 января 2012 05:29 · Поправил: VOLKOFF
· Личное сообщение · #1

Если мимо подфорума, модерация не дремлет
В общем на семерке перестала работать и соответственно компилиться программа.
Затык в куске кода вычисления мд5
Исполнение на 7-ой валится в ntdll
Компилятор же пишет:
Code:
  1. undefined reference to `md5_starts'
  2. undefined reference to `md5_update'
  3. undefined reference to `md5_finish'

Собака видимо порылась в апишном вычислении хеш-сумм, плюсы не мой конек, знаю, что MD5Init(), MD5Update(), MD5Final() для этого юзались и из Cryptdll.dll со времен Vista продублированы в ntdll

На ХР все торт, на 7-ой шляпа.
По идее ничего сложного не должно быть, подсобите советом.

md5.h

Code:
  1. #ifndef _MD5_H
  2. #define _MD5_H
  3.  
  4. #ifndef uint8
  5. #define uint8  unsigned char
  6. #endif
  7.  
  8. #ifndef uint32
  9. #define uint32 unsigned long int
  10. #endif
  11.  
  12. typedef struct
  13. {
  14.     uint32 total[2];
  15.     uint32 state[4];
  16.     uint8 buffer[64];
  17. }
  18. md5_context;
  19.  
  20. void md5_starts( md5_context *ctx );
  21. void md5_update( md5_context *ctx, uint8 *input, uint32 length );
  22. void md5_finish( md5_context *ctx, uint8 digest[16] );
  23.  
  24. #endif /* md5.*/

md5.c
Code:
  1. #include <string.h>
  2.  
  3. #include "md5.h"
  4.  
  5. #define GET_UINT32(n,b,i)                       \
  6. {                                               \
  7.     (n) = ( (uint32) (b)[(i)    ]       )       \
  8.         | ( (uint32) (b)[(i) + 1] <<  8 )       \
  9.         | ( (uint32) (b)[(i) + 2] << 16 )       \
  10.         | ( (uint32) (b)[(i) + 3] << 24 ); \
  11. }
  12.  
  13. #define PUT_UINT32(n,b,i)                       \
  14. {                                               \
  15.     (b)[(i)    ] = (uint8) ( (n)       ); \
  16.     (b)[(i) + 1] = (uint8) ( (n) >>  8 ); \
  17.     (b)[(i) + 2] = (uint8) ( (n) >> 16 ); \
  18.     (b)[(i) + 3] = (uint8) ( (n) >> 24 ); \
  19. }
  20.  
  21. void md5_starts( md5_context *ctx )
  22. {
  23.     ctx->total[0] = 0;
  24.     ctx->total[1] = 0;
  25.  
  26.     ctx->state[0] = 0x67452301;
  27.     ctx->state[1] = 0xEFCDAB89;
  28.     ctx->state[2] = 0x98BADCFE;
  29.     ctx->state[3] = 0x10325476;
  30. }
  31.  
  32. void md5_process( md5_context *ctx, uint8 data[64] )
  33. {
  34.     uint32 X[16], A, B, C, D;
  35.  
  36.     GET_UINT32( X[0],  data,  0 );
  37.     GET_UINT32( X[1],  data,  4 );
  38.     GET_UINT32( X[2],  data,  8 );
  39.     GET_UINT32( X[3],  data, 12 );
  40.     GET_UINT32( X[4],  data, 16 );
  41.     GET_UINT32( X[5],  data, 20 );
  42.     GET_UINT32( X[6],  data, 24 );
  43.     GET_UINT32( X[7],  data, 28 );
  44.     GET_UINT32( X[8],  data, 32 );
  45.     GET_UINT32( X[9],  data, 36 );
  46.     GET_UINT32( X[10], data, 40 );
  47.     GET_UINT32( X[11], data, 44 );
  48.     GET_UINT32( X[12], data, 48 );
  49.     GET_UINT32( X[13], data, 52 );
  50.     GET_UINT32( X[14], data, 56 );
  51.     GET_UINT32( X[15], data, 60 );
  52.  
  53. #define S(x,n) ((<< n) | ((& 0xFFFFFFFF) >> (32 - n)))
  54.  
  55. #define P(a,b,c,d,k,s,t)                                \
  56. {                                                       \
  57.     a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
  58. }
  59.  
  60.     A = ctx->state[0];
  61.     B = ctx->state[1];
  62.     C = ctx->state[2];
  63.     D = ctx->state[3];
  64.  
  65. #define F(x,y,z) (z ^ (& (y ^ z)))
  66.  
  67.     P( A, B, C, D,  0,  7, 0xD76AA478 );
  68.     P( D, A, B, C,  1, 12, 0xE8C7B756 );
  69.     P( C, D, A, B,  2, 17, 0x242070DB );
  70.     P( B, C, D, A,  3, 22, 0xC1BDCEEE );
  71.     P( A, B, C, D,  4,  7, 0xF57C0FAF );
  72.     P( D, A, B, C,  5, 12, 0x4787C62A );
  73.     P( C, D, A, B,  6, 17, 0xA8304613 );
  74.     P( B, C, D, A,  7, 22, 0xFD469501 );
  75.     P( A, B, C, D,  8,  7, 0x698098D8 );
  76.     P( D, A, B, C,  9, 12, 0x8B44F7AF );
  77.     P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
  78.     P( B, C, D, A, 11, 22, 0x895CD7BE );
  79.     P( A, B, C, D, 12,  7, 0x6B901122 );
  80.     P( D, A, B, C, 13, 12, 0xFD987193 );
  81.     P( C, D, A, B, 14, 17, 0xA679438E );
  82.     P( B, C, D, A, 15, 22, 0x49B40821 );
  83.  
  84. #undef F
  85.  
  86. #define F(x,y,z) (y ^ (& (x ^ y)))
  87.  
  88.     P( A, B, C, D,  1,  5, 0xF61E2562 );
  89.     P( D, A, B, C,  6,  9, 0xC040B340 );
  90.     P( C, D, A, B, 11, 14, 0x265E5A51 );
  91.     P( B, C, D, A,  0, 20, 0xE9B6C7AA );
  92.     P( A, B, C, D,  5,  5, 0xD62F105D );
  93.     P( D, A, B, C, 10,  9, 0x02441453 );
  94.     P( C, D, A, B, 15, 14, 0xD8A1E681 );
  95.     P( B, C, D, A,  4, 20, 0xE7D3FBC8 );
  96.     P( A, B, C, D,  9,  5, 0x21E1CDE6 );
  97.     P( D, A, B, C, 14,  9, 0xC33707D6 );
  98.     P( C, D, A, B,  3, 14, 0xF4D50D87 );
  99.     P( B, C, D, A,  8, 20, 0x455A14ED );
  100.     P( A, B, C, D, 13,  5, 0xA9E3E905 );
  101.     P( D, A, B, C,  2,  9, 0xFCEFA3F8 );
  102.     P( C, D, A, B,  7, 14, 0x676F02D9 );
  103.     P( B, C, D, A, 12, 20, 0x8D2A4C8A );
  104.  
  105. #undef F
  106.     
  107. #define F(x,y,z) (x ^ y ^ z)
  108.  
  109.     P( A, B, C, D,  5,  4, 0xFFFA3942 );
  110.     P( D, A, B, C,  8, 11, 0x8771F681 );
  111.     P( C, D, A, B, 11, 16, 0x6D9D6122 );
  112.     P( B, C, D, A, 14, 23, 0xFDE5380C );
  113.     P( A, B, C, D,  1,  4, 0xA4BEEA44 );
  114.     P( D, A, B, C,  4, 11, 0x4BDECFA9 );
  115.     P( C, D, A, B,  7, 16, 0xF6BB4B60 );
  116.     P( B, C, D, A, 10, 23, 0xBEBFBC70 );
  117.     P( A, B, C, D, 13,  4, 0x289B7EC6 );
  118.     P( D, A, B, C,  0, 11, 0xEAA127FA );
  119.     P( C, D, A, B,  3, 16, 0xD4EF3085 );
  120.     P( B, C, D, A,  6, 23, 0x04881D05 );
  121.     P( A, B, C, D,  9,  4, 0xD9D4D039 );
  122.     P( D, A, B, C, 12, 11, 0xE6DB99E5 );
  123.     P( C, D, A, B, 15, 16, 0x1FA27CF8 );
  124.     P( B, C, D, A,  2, 23, 0xC4AC5665 );
  125.  
  126. #undef F
  127.  
  128. #define F(x,y,z) (y ^ (| ~z))
  129.  
  130.     P( A, B, C, D,  0,  6, 0xF4292244 );
  131.     P( D, A, B, C,  7, 10, 0x432AFF97 );
  132.     P( C, D, A, B, 14, 15, 0xAB9423A7 );
  133.     P( B, C, D, A,  5, 21, 0xFC93A039 );
  134.     P( A, B, C, D, 12,  6, 0x655B59C3 );
  135.     P( D, A, B, C,  3, 10, 0x8F0CCC92 );
  136.     P( C, D, A, B, 10, 15, 0xFFEFF47D );
  137.     P( B, C, D, A,  1, 21, 0x85845DD1 );
  138.     P( A, B, C, D,  8,  6, 0x6FA87E4F );
  139.     P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
  140.     P( C, D, A, B,  6, 15, 0xA3014314 );
  141.     P( B, C, D, A, 13, 21, 0x4E0811A1 );
  142.     P( A, B, C, D,  4,  6, 0xF7537E82 );
  143.     P( D, A, B, C, 11, 10, 0xBD3AF235 );
  144.     P( C, D, A, B,  2, 15, 0x2AD7D2BB );
  145.     P( B, C, D, A,  9, 21, 0xEB86D391 );
  146.  
  147. #undef F
  148.  
  149.     ctx->state[0] += A;
  150.     ctx->state[1] += B;
  151.     ctx->state[2] += C;
  152.     ctx->state[3] += D;
  153. }
  154.  
  155. void md5_update( md5_context *ctx, uint8 *input, uint32 length )
  156. {
  157.     uint32 left, fill;
  158.  
  159.     if( ! length ) return;
  160.  
  161.     left = ctx->total[0] & 0x3F;
  162.     fill = 64 - left;
  163.  
  164.     ctx->total[0] += length;
  165.     ctx->total[0] &= 0xFFFFFFFF;
  166.  
  167.     if( ctx->total[0] < length )
  168.         ctx->total[1]++;
  169.  
  170.     if( left && length >= fill )
  171.     {
  172.         memcpy( (void *) (ctx->buffer + left),
  173.                 (void *) input, fill );
  174.         md5_process( ctx, ctx->buffer );
  175.         length -= fill;
  176.         input  += fill;
  177.         left = 0;
  178.     }
  179.  
  180.     while( length >= 64 )
  181.     {
  182.         md5_process( ctx, input );
  183.         length -= 64;
  184.         input  += 64;
  185.     }
  186.  
  187.     if( length )
  188.     {
  189.         memcpy( (void *) (ctx->buffer + left),
  190.                 (void *) input, length );
  191.     }
  192. }
  193.  
  194. static uint8 md5_padding[64] =
  195. {
  196.  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  197.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  198.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  199.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  200. };
  201.  
  202. void md5_finish( md5_context *ctx, uint8 digest[16] )
  203. {
  204.     uint32 last, padn;
  205.     uint32 high, low;
  206.     uint8 msglen[8];
  207.  
  208.     high = ( ctx->total[0] >> 29 )
  209.          | ( ctx->total[1] <<  3 );
  210.     low  = ( ctx->total[0] <<  3 );
  211.  
  212.     PUT_UINT32( low,  msglen, 0 );
  213.     PUT_UINT32( high, msglen, 4 );
  214.  
  215.     last = ctx->total[0] & 0x3F;
  216.     padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
  217.  
  218.     md5_update( ctx, md5_padding, padn );
  219.     md5_update( ctx, msglen, 8 );
  220.  
  221.     PUT_UINT32( ctx->state[0], digest,  0 );
  222.     PUT_UINT32( ctx->state[1], digest,  4 );
  223.     PUT_UINT32( ctx->state[2], digest,  8 );
  224.     PUT_UINT32( ctx->state[3], digest, 12 );
  225. }
  226.  
  227. #ifdef TEST
  228.  
  229. #include <stdlib.h>
  230. #include <stdio.h>
  231.  
  232. static char *msg[] = 
  233. {
  234.     "",
  235.     "a",
  236.     "abc",
  237.     "message digest",
  238.     "abcdefghijklmnopqrstuvwxyz",
  239.     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
  240.     "12345678901234567890123456789012345678901234567890123456789012" \
  241.         "345678901234567890"
  242. };
  243.  
  244. static char *val[] =
  245. {
  246.     "d41d8cd98f00b204e9800998ecf8427e",
  247.     "0cc175b9c0f1b6a831c399e269772661",
  248.     "900150983cd24fb0d6963f7d28e17f72",
  249.     "f96b697d7cb7938d525a2f31aaf161d0",
  250.     "c3fcd3d76192e4007dfb496cca67e13b",
  251.     "d174ab98d277d9f5a5611c2c9f419d9f",
  252.     "57edf4a22be3c955ac49da2e2107b67a"
  253. };
  254.  
  255. int main( int argc, char *argv[] )
  256. {
  257.     FILE *f;
  258.     int i, j;
  259.     char output[33];
  260.     md5_context ctx;
  261.     unsigned char buf[1000];
  262.     unsigned char md5sum[16];
  263.  
  264.     if( argc < 2 )
  265.     {
  266.         printf( "\n MD5 Validation Tests:\n\n" );
  267.  
  268.         for( i = 0; i < 7; i++ )
  269.         {
  270.             printf( " Test %d ", i + 1 );
  271.  
  272.             md5_starts( &ctx );
  273.             md5_update( &ctx, (uint8 *) msg[i], strlen( msg[i] ) );
  274.             md5_finish( &ctx, md5sum );
  275.  
  276.             for( j = 0; j < 16; j++ )
  277.             {
  278.                 sprintf( output + j * 2, "%02x", md5sum[j] );
  279.             }
  280.  
  281.             if( memcmp( output, val[i], 32 ) )
  282.             {
  283.                 printf( "failed!\n" );
  284.                 return( 1 );
  285.             }
  286.  
  287.             printf( "passed.\n" );
  288.         }
  289.  
  290.         printf( "\n" );
  291.     }
  292.     else
  293.     {
  294.         if( ! ( f = fopen( argv[1], "rb" ) ) )
  295.         {
  296.             perror( "fopen" );
  297.             return( 1 );
  298.         }
  299.  
  300.         md5_starts( &ctx );
  301.  
  302.         while( ( i = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
  303.         {
  304.             md5_update( &ctx, buf, i );
  305.         }
  306.  
  307.         md5_finish( &ctx, md5sum );
  308.  
  309.         for( j = 0; j < 16; j++ )
  310.         {
  311.             printf( "%02x", md5sum[j] );
  312.         }
  313.  
  314.         printf( " %s\n", argv[1] );
  315.     }
  316.  
  317.     return( 0 );
  318. }
  319.  
  320. #endif





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

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

попробуй функции мд5 из advapi32.dll
имена MD5Update, MD5Final, MD5Init

-----
aLL rIGHTS rEVERSED!





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

Создано: 28 января 2012 10:12 · Поправил: Модератор
· Личное сообщение · #3

Чего-то я не совсем улавливаю, при чём тут сторонние либы, коль мд5 есть в сорцах и без внешних зависимостей, скомпиляй из сорцов да слинкуй с ним.
Если хочет облегчить код, зачем тогда сорцы мд5 выложены в первом посте? Это вроде как его код.




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

Создано: 28 января 2012 10:19
· Личное сообщение · #4

Archer пишет:
Чего-то я не совсем улавливаю, при чём тут сторонние либы, коль мд5 есть в сорцах и без внешних зависимостей, скомпиляй из сорцов да слинкуй с ним.

Может чел хочет облегчить код

-----
aLL rIGHTS rEVERSED!




Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 28 января 2012 16:04 · Поправил: VOLKOFF
· Личное сообщение · #5

Я в первом посте в каких-то предположениях мог и пальцем в небо ткнуть, поясню
Утиль работает и компилится на ХР, но не работает и не компилится на Вин7 (32), поскольку компилятор спотыкается на трех функциях из мд5 проверки (см. выше), предположил, что грабли там и выложил сорец, до отладчика не добрался, дикая лень одалела, думал малой кровью все закончиться




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

Создано: 28 января 2012 16:46 · Поправил: BoRoV
· Личное сообщение · #6

VOLKOFF пишет:
Я в первом посте в каких-то предположениях мог и пальцем в небо ткнуть

Попробую и я пальцем в небо ткнуть. Может следует md5.c включить в проект.

VOLKOFF пишет:
Почему утиль падает если и разбираться, то не тут.

Ну ты мочишь.

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




Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 28 января 2012 17:24 · Поправил: VOLKOFF
· Личное сообщение · #7

BoRoV, действительно на седьмой из исходника таинственным образом строка инклуда исчезла.
Затупил. Спасибо
Почему утиль падает если и разбираться, то не тут.


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