OKI, - Do tôi chỉ biết mỗi lập trình VC++, nên tôi chỉ đề cập đến ngôn ngữ này thui . Các bác nào biết các lập trình trên các ngôn ngữ khác có thể POST lên cho mọi nguời tham khảo . - Đối với VC++, thì đã có sẵn thư viện của MD5 ( tôi có đính kèm ), các bác chỉ việc copy 2 file này và cho vào thư mục ( theo như giả định ) : C:\Program Files\Microsoft Visual Studio\VC98\Include\Md5\ ( ở đây tôi tạo một thư mục Md5 và PASTE 2 file này vào . - Khi sử dụng thì ta gọi 2 File này ra bằng cách khai báo : #include "Md5\md5.c" - Và trong Source của KeyGen ta viết thế này : Code: md5_context md5; static char reaName[64]={0}; char reaSerial[64]={0}; unsigned char reaMD5String[64]={0}; char reaTemp[10]={0}; int LenUser=0; int i=0, j=0; LenUser=GetDlgItemText(IDC_Name,reaName,128); if (LenUser < 1 || LenUser > 64) { MessageBox(" ===== Your name atleast 1 chart ===== \n\n ===== But not over than 64 charts ===== ","Hey !! Please input your name again !! "); } else { md5_starts(&md5); md5_update(&md5,(uint8 *) reaName,LenUser); md5_finish(&md5,reaMD5String); i=0; j=0; while ( i < 16 ) { wsprintf(reaTemp,"%02x", (reaMD5String[i]&0xFF)); reaSerial[j] = reaTemp[0]; reaSerial[j+1] = reaTemp[1]; j+=2; i++; } SetDlgItemText(IDC_Serial,reaSerial); } - Nhân tiện tôi nói thêm, đối với lập trình VB, khi xem xét đoạn code MD5Start hay MD5Init thì ta không thể thấy ngay các giá trị ban đầu, mà đây là cả một đoạn FUNTION , và để tìm đến được địa chỉ lưu các giá trị MD5Start hay MD5Init ta cần nhìn vào cửa sổ STACK trong Olly . - Trong các Link bác KIENMANOWAR giởi thiệu trong BOX CRACKER, thì link : http://www.akramsoft.com giởi thiệu về soft được viết bằng VB và sử dụng thuật toán MD5 . CÁc bác có thể tham khảo nó . Nó PACK ở một dạng lạ, nhưng PEiD có thể UnPACK hoàn chỉnh .Thằng này khá đơn giản nhưng hơi đểu . CÁc bác làm quen MD5 rồi hẵng làm thử em này . :D (joke) Moonbaby vì mình mới tham gia vào reaonline.net nên không biết bác nào đã có mã nguồn của MD5 chưa nhưng thừa còn hơn thiếu mình xin mạn phép giới thiệu một mã nguồn của MD5 :spam_lase code: Code: MD5.h #ifndef _MD5_H #define _MD5_H #ifndef uint8 #define uint8 unsigned char #endif #ifndef uint32 #define uint32 unsigned long int #endif typedef struct { uint32 total[2]; uint32 state[4]; uint8 buffer[64]; } md5_context; void md5_starts( md5_context *ctx ); void md5_update( md5_context *ctx, uint8 *input, uint32 length ); void md5_finish( md5_context *ctx, uint8 digest[16] ); #endif /* md5.h */ MD5.c #include <string.h> #include "md5.h" #define GET_UINT32(n,b,i) \ { \ (n) = ( (uint32) (b)[(i) ] ) \ | ( (uint32) (b)[(i) + 1] << 8 ) \ | ( (uint32) (b)[(i) + 2] << 16 ) \ | ( (uint32) (b)[(i) + 3] << 24 ); \ } #define PUT_UINT32(n,b,i) \ { \ (b)[(i) ] = (uint8) ( (n) ); \ (b)[(i) + 1] = (uint8) ( (n) >> 8 ); \ (b)[(i) + 2] = (uint8) ( (n) >> 16 ); \ (b)[(i) + 3] = (uint8) ( (n) >> 24 ); \ } void md5_starts( md5_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; } void md5_process( md5_context *ctx, uint8 data[64] ) { uint32 X[16], A, B, C, D; GET_UINT32( X[0], data, 0 ); GET_UINT32( X[1], data, 4 ); GET_UINT32( X[2], data, 8 ); GET_UINT32( X[3], data, 12 ); GET_UINT32( X[4], data, 16 ); GET_UINT32( X[5], data, 20 ); GET_UINT32( X[6], data, 24 ); GET_UINT32( X[7], data, 28 ); GET_UINT32( X[8], data, 32 ); GET_UINT32( X[9], data, 36 ); GET_UINT32( X[10], data, 40 ); GET_UINT32( X[11], data, 44 ); GET_UINT32( X[12], data, 48 ); GET_UINT32( X[13], data, 52 ); GET_UINT32( X[14], data, 56 ); GET_UINT32( X[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define P(a,b,c,d,k,s,t) \ { \ a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; #define F(x,y,z) (z ^ (x & (y ^ z))) P( A, B, C, D, 0, 7, 0xD76AA478 ); P( D, A, B, C, 1, 12, 0xE8C7B756 ); P( C, D, A, B, 2, 17, 0x242070DB ); P( B, C, D, A, 3, 22, 0xC1BDCEEE ); P( A, B, C, D, 4, 7, 0xF57C0FAF ); P( D, A, B, C, 5, 12, 0x4787C62A ); P( C, D, A, B, 6, 17, 0xA8304613 ); P( B, C, D, A, 7, 22, 0xFD469501 ); P( A, B, C, D, 8, 7, 0x698098D8 ); P( D, A, B, C, 9, 12, 0x8B44F7AF ); P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); P( B, C, D, A, 11, 22, 0x895CD7BE ); P( A, B, C, D, 12, 7, 0x6B901122 ); P( D, A, B, C, 13, 12, 0xFD987193 ); P( C, D, A, B, 14, 17, 0xA679438E ); P( B, C, D, A, 15, 22, 0x49B40821 ); #undef F #define F(x,y,z) (y ^ (z & (x ^ y))) P( A, B, C, D, 1, 5, 0xF61E2562 ); P( D, A, B, C, 6, 9, 0xC040B340 ); P( C, D, A, B, 11, 14, 0x265E5A51 ); P( B, C, D, A, 0, 20, 0xE9B6C7AA ); P( A, B, C, D, 5, 5, 0xD62F105D ); P( D, A, B, C, 10, 9, 0x02441453 ); P( C, D, A, B, 15, 14, 0xD8A1E681 ); . D, 1, 5, 0xF61E2562 ); P( D, A, B, C, 6, 9, 0xC040B3 40 ); P( C, D, A, B, 11 , 14 , 0x265E5A 51 ); P( B, C, D, A, 0, 20, 0xE9B6C7AA ); P( A, B, C, D, 5, 5, 0xD62F 105 D ); P( D, A, B, C, 10 ,. 22, 0xFD4695 01 ); P( A, B, C, D, 8, 7, 0x69 809 8D8 ); P( D, A, B, C, 9, 12 , 0x8B44F7AF ); P( C, D, A, B, 10 , 17 , 0xFFFF5BB1 ); P( B, C, D, A, 11 , 22, 0x895CD7BE ); P( A, B, C, D, 12 ,. 0x895CD7BE ); P( A, B, C, D, 12 , 7, 0x6B9 01 1 22 ); P( D, A, B, C, 13 , 12 , 0xFD98 719 3 ); P( C, D, A, B, 14 , 17 , 0xA679438E ); P( B, C, D, A, 15 , 22, 0x49B 408 21 ); #undef F #define F(x,y,z)