Трассировка Mhash-файлов (хеширование)
Я пытаюсь проследить, как эта программа с открытым исходным кодом, mhash вычисляет, что она хэширует
Я могу успешно запустить программу, используя следующие команды:
gcc -o пример example.c -lmhash
(также mhash в настоящее время установлен, и я использую Ubuntu Linux)
Mhash можно найти здесь: http://mhash.sourceforge.net/
и пример, который я попробовал, здесь:
#include <mhash.h>
#include <stdio.h>
int main()
{
char password[] = "Jefe";
int keylen = 4;
char data[] = "what do ya want for nothing?";
int datalen = 28;
MHASH td;
unsigned char *mac;
int j;
td = mhash_hmac_init(MHASH_MD5, password, keylen,
mhash_get_hash_pblock(MHASH_MD5));
mhash(td, data, datalen);
mac = mhash_hmac_end(td);
/*
* The output should be 0x750c783e6ab0b503eaa86e310a5db738
* according to RFC 2104.
*/
printf("0x");
for (j = 0; j < mhash_get_block_size(MHASH_MD5); j++) {
printf("%.2x", mac[j]);
}
printf("\n");
exit(0);
}
Я прочитал API, у него очень хорошая документация, но там очень много файлов, я не знаю, из каких областей он наследует свои алгоритмы?
Спасибо за ваше время и помощь заранее
1 ответ
Ваш вопрос мне кажется немного расплывчатым... Я не уверен, что полностью его понимаю. Я приду в себя ответ, хотя.
Если вы просто не знаете, что исполняется за это MD5
хэш самый простой способ получить это, вероятно, подключить себя с отладчиком на этой вашей программе примера. Убедитесь, что у вас включены флаги отладки mhash
библиотека (которая по умолчанию включена), затем перейдите mhash
и посмотри, куда тебя это приведет. Вы не можете ничего пропустить таким образом.
В gdb это будет выглядеть примерно так (вы, вероятно, захотите использовать IDE - возможно, затмение, чтобы сделать его намного красивее):
$ gdb ./test.exe
..
Reading symbols from /home/B41655/workspace/ctest/test.exe...done.
(gdb) break main
Breakpoint 1 at 0x4011af: file test.c, line 5.
(gdb) run
Starting program: /home/B41655/workspace/ctest/test.exe
[New Thread 10200.0x205c]
[New Thread 10200.0x27b0]
Breakpoint 1, main () at test.c:5
5 char password[] = "Jefe";
(gdb) s
6 int keylen = 4;
(gdb) s
7 char data[] = "what do ya want for nothing?";
(gdb) s
8 int datalen = 28;
(gdb) s
13 td = mhash_hmac_init(MHASH_MD5, password, keylen,
(gdb) s
mhash_get_hash_pblock (type=MHASH_MD5) at mhash.c:438
438 {
(gdb) s
441 MHASH_ALG_LOOP(ret = p->hash_pblock);
и так далее...
Если по какой-либо причине вы хотите пассивно получить какой-то график вызовов вашего example
Выполнение программы вы можете сделать это с помощью профилировщика. С помощью gprof
в этой программе выдается что-то вроде этого (для этого потребуется, чтобы ваша библиотека / программа была перекомпилирована с флагом -pg):
index % time self children called name
0.00 0.00 17/17 main [81]
[2] 0.0 0.00 0.00 17 mhash_get_block_size [2]
-----------------------------------------------
0.00 0.00 1/9 mhash [14]
0.00 0.00 2/9 mhash_hmac_deinit [17]
0.00 0.00 2/9 mhash_hmac_init [20]
0.00 0.00 2/9 MD5Update [9]
0.00 0.00 2/9 MD5Final [10]
[3] 0.0 0.00 0.00 9 mutils_memcpy [3]
-----------------------------------------------
0.00 0.00 1/6 mhash_deinit [15]
0.00 0.00 1/6 mhash_hmac_init [20]
0.00 0.00 2/6 mhash_hmac_deinit [17]
0.00 0.00 2/6 MD5Final [10]
[4] 0.0 0.00 0.00 6 mutils_bzero [4]
-----------------------------------------------
0.00 0.00 1/6 mhash_hmac_end_m [19]
0.00 0.00 1/6 mhash_hmac_init [20]
0.00 0.00 4/6 mhash_init_int [12]
[5] 0.0 0.00 0.00 6 mutils_malloc [5]
-----------------------------------------------
0.00 0.00 2/6 MD5Update [9]
0.00 0.00 4/6 MD5Final [10]
[6] 0.0 0.00 0.00 6 mutils_word32nswap [6]
-----------------------------------------------
0.00 0.00 1/5 mhash_deinit [15]
0.00 0.00 4/5 mhash_hmac_deinit [17]
[7] 0.0 0.00 0.00 5 mutils_free [7]
-----------------------------------------------
0.00 0.00 2/4 MD5Update [9]
0.00 0.00 2/4 MD5Final [10]
[8] 0.0 0.00 0.00 4 MD5Transform [8]
-----------------------------------------------
0.00 0.00 1/4 mhash [14]
0.00 0.00 1/4 mhash_hmac_init [20]
0.00 0.00 2/4 mhash_hmac_deinit [17]
[9] 0.0 0.00 0.00 4 MD5Update [9]
0.00 0.00 2/9 mutils_memcpy [3]
0.00 0.00 2/6 mutils_word32nswap [6]
0.00 0.00 2/4 MD5Transform [8]
-----------------------------------------------
0.00 0.00 1/2 mhash_deinit [15]
0.00 0.00 1/2 mhash_hmac_deinit [17]
[10] 0.0 0.00 0.00 2 MD5Final [10]
0.00 0.00 4/6 mutils_word32nswap [6]
0.00 0.00 2/4 MD5Transform [8]
0.00 0.00 2/9 mutils_memcpy [3]
0.00 0.00 2/6 mutils_bzero [4]
-----------------------------------------------
0.00 0.00 2/2 mhash_init_int [12]
[11] 0.0 0.00 0.00 2 MD5Init [11]
-----------------------------------------------
0.00 0.00 1/2 mhash_hmac_deinit [17]
0.00 0.00 1/2 mhash_hmac_init [20]
[12] 0.0 0.00 0.00 2 mhash_init_int [12]
0.00 0.00 4/6 mutils_malloc [5]
0.00 0.00 2/2 mutils_memset [13]
0.00 0.00 2/2 MD5Init [11]
-----------------------------------------------
0.00 0.00 2/2 mhash_init_int [12]
[13] 0.0 0.00 0.00 2 mutils_memset [13]
-----------------------------------------------
0.00 0.00 1/1 main [81]
[14] 0.0 0.00 0.00 1 mhash [14]
0.00 0.00 1/9 mutils_memcpy [3]
0.00 0.00 1/4 MD5Update [9]
-----------------------------------------------
0.00 0.00 1/1 mhash_hmac_deinit [17]
[15] 0.0 0.00 0.00 1 mhash_deinit [15]
0.00 0.00 1/6 mutils_bzero [4]
0.00 0.00 1/2 MD5Final [10]
0.00 0.00 1/5 mutils_free [7]
-----------------------------------------------
0.00 0.00 1/1 main [81]
[16] 0.0 0.00 0.00 1 mhash_get_hash_pblock [16]
-----------------------------------------------
0.00 0.00 1/1 mhash_hmac_end_m [19]
[17] 0.0 0.00 0.00 1 mhash_hmac_deinit [17]
0.00 0.00 4/5 mutils_free [7]
0.00 0.00 2/9 mutils_memcpy [3]
0.00 0.00 2/4 MD5Update [9]
0.00 0.00 2/6 mutils_bzero [4]
0.00 0.00 1/2 mhash_init_int [12]
0.00 0.00 1/2 MD5Final [10]
0.00 0.00 1/1 mhash_deinit [15]
-----------------------------------------------
0.00 0.00 1/1 main [81]
[18] 0.0 0.00 0.00 1 mhash_hmac_end [18]
0.00 0.00 1/1 mhash_hmac_end_m [19]
-----------------------------------------------
0.00 0.00 1/1 mhash_hmac_end [18]
[19] 0.0 0.00 0.00 1 mhash_hmac_end_m [19]
0.00 0.00 1/6 mutils_malloc [5]
0.00 0.00 1/1 mhash_hmac_deinit [17]
-----------------------------------------------
0.00 0.00 1/1 main [81]
[20] 0.0 0.00 0.00 1 mhash_hmac_init [20]
0.00 0.00 2/9 mutils_memcpy [3]
0.00 0.00 1/2 mhash_init_int [12]
0.00 0.00 1/6 mutils_malloc [5]
0.00 0.00 1/6 mutils_bzero [4]
0.00 0.00 1/4 MD5Update [9]
-----------------------------------------------
показывая, какие функции были выполнены и как они были вызваны.