-
Автор темы
- #1
У меня задача разобрать дизассемблерный код и написать генерацию пароля по имени.
С этим я справился, хоть и не без проблем, но меня ставит в тупик другой момент.. Функция генерации хеша из логина и пароля работают отдельно друг, от друга, но при этом результат выполнения обоих функций должен совпадать. Помимо прочего, пароль должен состоять из "a-z, A-Z, 0-9" символов. Каким образом это возможно?
Я не шарю за алгоритмы, а в курсе нечего не было о этом, сам код проверок из проги я вытащил, но что дальше делать не знаю.
Подскажите пожалуйста.
С этим я справился, хоть и не без проблем, но меня ставит в тупик другой момент.. Функция генерации хеша из логина и пароля работают отдельно друг, от друга, но при этом результат выполнения обоих функций должен совпадать. Помимо прочего, пароль должен состоять из "a-z, A-Z, 0-9" символов. Каким образом это возможно?
Я не шарю за алгоритмы, а в курсе нечего не было о этом, сам код проверок из проги я вытащил, но что дальше делать не знаю.
Подскажите пожалуйста.
Реверс:
DWORD32 genNameHash(byte *szName)
{
DWORD32 crc = -1;
for (DWORD idx = 0; idx < strlen((char *)szName); idx++)
{
crc ^= szName[idx];
for (int j = 0; j < 8; j++)
{
char converChar = (crc & 1);
crc = -converChar & 0xEDB88320 ^ (crc >> 1);
/*
.text:00438076 mov eax, [ebp+crc]
.text:00438079 and eax, 1
.text:0043807C neg eax // CHAR!
.text:0043807E mov [ebp+numBuff], eax
.text:00438081 mov eax, [ebp+crc]
.text:00438084 shr eax, 1
.text:00438086 mov ecx, [ebp+numBuff]
.text:00438089 and ecx, 0EDB88320h
.text:0043808F xor eax, ecx
.text:00438091 mov [ebp+crc], eax
*/
}
}
printf("name hash: 0x%X(0x%X)\n", ~crc, ~crc & 0xFF);
return ~crc;
}
DWORD32 genPassHash(byte* pass)
{
size_t idx = 0; DWORD32 hash = 0;
while (pass[idx] != NULL)
{
hash += pass[idx++] ^ 0x99;
/*
mov eax, [ebp+pass]
add eax, [ebp+i]
movsx ecx, byte ptr [eax]
xor ecx, 99h
add ecx, [ebp+hash]
mov [ebp+hash], ecx
*/
}
printf("pass hash: 0x%X(0x%X)\n", hash, hash & 0xFF);
return hash;
}
bool isValid(byte *str)
{
size_t idx = 0;
while (str[idx] != NULL)
{
if (str[idx] >= 'a' && str[idx] <= 'z' ||
str[idx] >= 'A' && str[idx] <= 'Z' ||
str[idx] >= '0' && str[idx] <= '9')
{
idx++;
continue;
}
return false;
}
return true;
}
bool isAccess(byte* name, byte* pass)
{
if (!isValid(name)) {
return MessageBox(NULL, "Name a-z, A-Z, 0-9", "Falsch Daten", 0);
}
if (!isValid(pass)) {
return MessageBox(NULL, "Pass a-z, A-Z, 0-9", "Falsch Daten", 0);
}
return (genNameHash(name) & 0xFF) == (genPassHash(pass) & 0xFF);
/*
mov [ebp+nameHash], 0
mov [ebp+passHash], 0
mov eax, [ebp+name]
push eax
call j_nameHash
add esp, 4
and eax, 0FFh
mov [ebp+nameHash], eax
mov eax, [ebp+pass]
push eax ; Str
call j_genPassHash
add esp, 4
and eax, 0FFh
mov [ebp+passHash], eax
mov eax, [ebp+nameHash]
cmp eax, [ebp+passHash]
jnz short loc_437ED8
*/
}
int main()
{
byte name[] = "hallo", pass[] = "1234"; // false
printf("Access: %s\n", (isAccess(name, pass)) ? "true" : "false");
getchar();
return 1;
}
Последнее редактирование: