Я использую встроенную сборку для создания набора паролей, которые я буду использовать для противодействия данному хешу. Я использовал этот веб-сайт в качестве справочного материала для создания паролей.
Это работает безупречно в однопоточной среде. Он генерирует бесконечное количество увеличивающихся паролей.
Поскольку у меня есть только базовые знания об асме, я понимаю эту идею. GCC использует ATT, поэтому я компилирую с -masm=intel
Во время попытки многопоточности программы я понимаю, что этот подход может не работать.
В следующем коде используются 2 глобальные переменные C, и я предполагаю , что это может быть проблемой.
__asm__("pushad\n\t"
"mov edi, offset plaintext\n\t" <---- global variable
"mov ebx, offset charsetTable\n\t" <---- again
"L1: movzx eax, byte ptr [edi]\n\t"
" movzx eax, byte ptr [charsetTable+eax]\n\t"
" cmp al, 0\n\t"
" je L2\n\t"
" mov [edi],al\n\t"
" jmp L3\n\t"
"L2: xlat\n\t"
" mov [edi],al\n\t"
" inc edi\n\t"
" jmp L1\n\t"
"L3: popad\n\t");
Он дает недетерминированный результат в переменной открытого текста.
Как создать обходной путь, чтобы каждый поток обращался к своей собственной переменной открытого текста? (Если это проблема ...).
Я пытался изменить этот код, чтобы использовать расширенную сборку, но каждый раз терпел неудачу. Вероятно, из-за того, что все учебники используют синтаксис ATT.
Буду очень признателен за любую помощь, так как я застрял на несколько часов: (
Редактировать : Запуск программы с двумя потоками и печать содержимого открытого текста сразу после инструкции asm приводит к:
b
b
d
d
f
f
...
Редактировать2 :
pthread_create(&thread[i], NULL, crack, (void *) &args[i]))
[...]
void *crack(void *arg) {
struct threadArgs *param = arg;
struct crypt_data crypt; // storage for reentrant version of crypt(3)
char *tmpHash = NULL;
size_t len = strlen(param->methodAndSalt);
size_t cipherlen = strlen(param->cipher);
crypt.initialized = 0;
for(int i = 0; i <= LIMIT; i++) {
// intel syntax
__asm__ ("pushad\n\t"
//mov edi, offset %0\n\t"
"mov edi, offset plaintext\n\t"
"mov ebx, offset charsetTable\n\t"
"L1: movzx eax, byte ptr [edi]\n\t"
" movzx eax, byte ptr [charsetTable+eax]\n\t"
" cmp al, 0\n\t"
" je L2\n\t"
" mov [edi],al\n\t"
" jmp L3\n\t"
"L2: xlat\n\t"
" mov [edi],al\n\t"
" inc edi\n\t"
" jmp L1\n\t"
"L3: popad\n\t");
tmpHash = crypt_r(plaintext, param->methodAndSalt, &crypt);
if(0 == memcmp(tmpHash+len, param->cipher, cipherlen)) {
printf("success: %s\n", plaintext);
break;
}
}
return 0;
}