Я использую встроенную сборку для создания набора паролей, которые я буду использовать для грубой силы против заданного хэша. Я использовал этот веб-сайт в качестве эталона для построения паролей.
Это работает безупречно в однопоточной среде. Он производит бесконечное количество увеличивающихся паролей.
Поскольку у меня есть только базовые знания ассемблера, я понимаю эту идею. 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;
}
plaintext
иcharsetTable
, если два или более потока могут получить к ним доступ. Из того, что вы написали, трудно сказать, действительно ли это проблема. Можете ли вы показать нам код потока? - person Tony The Lion   schedule 18.09.2011asm
какvolatile
, иначе GCC может его переместить. Кроме того, вы должны иметьmemory
в clobberlist. См. здесь. - person user786653   schedule 18.09.2011xlat
(которая могла быть самой быстрой 20 лет назад). - person Gunther Piez   schedule 19.08.2012