Я начал выполнять задачи matasano и решил сделать это только с C PL и API win32.
Я хочу сделать это таким образом, так как хочу очень хорошо ознакомиться с API win32и авторы вредоносных программ, использующих методы запутывания / шифрования.
Я заметил, что для второй задачи мне потребуется использовать широкополосную версию CryptStringToBinary (= CryptStringToBinaryW), поскольку я не могу правильно декодировать первуюшестнадцатеричная строка правильно (только 3 символа правильно декодируются, в отличие от 18 символов во второй заданной шестнадцатеричной строке).
Вот ссылка на вызов: https://cryptopals.com/sets/1/challenges/2
Я был на самом делепоследние несколько часов пытался преобразовать его в широкополосную версию, но я не мог заставить его работать вообще, вот мой текущий код (который прекрасно работает для ANSI):
LPSTR ToBinary(BYTE* test, LPSTR buffer, DWORD amount) {
if (CryptStringToBinaryA(test, strlen(test), CRYPT_STRING_HEXRAW, NULL, &amount, NULL, NULL))
{
buffer = malloc(amount + 1);
memset(buffer, 0, amount + 1);
if (buffer == NULL)
{
printf("failed, error: %lu", GetLastError());
return NULL;
}
if (CryptStringToBinaryA(test, strlen(test), CRYPT_STRING_HEXRAW, buffer, &amount, NULL, NULL))
{
printf("%s \n", buffer);
}
}
else
printf("failed, error: %lu", GetLastError());
return buffer;
}
int main(void)
{
BYTE * test = "1c0111001f010100061a024b53535009181c";
LPSTR first = NULL;
DWORD amount = 0;
first = ToBinary(test, first, amount);
LPSTR buffer2 = NULL;
BYTE* test2 = "686974207468652062756c6c277320657965";
amount = 0;
LPSTR second = NULL;
second = ToBinary(test2, second, amount);
return 0;
}
Мой вопрос:
Как мне преобразовать это в широкополосную версию?
Я пытался заменить все остроумие LPSTRh LPWSTR, strlen to wsclen и использование «переинтерпретации приведения» для преобразования из LPWSTR в BYTE *, как того требует документация winAPI. (например: foo = (BYTE *) test; когда test имеет тип LPCWSTR).
, но после всех моих изменений моя программа больше не работает.
Я довольноновичок в программировании на C, и я, вероятно, упускаю правильное «отношение» к подобным проблемам преобразования, я надеюсь, что это не прямая копия другого вопроса.
Редактировать:
Я пробовал этот код, но когда я проверяю strlen первого значения, он возвращает длину 3, а не 18 во второй шестнадцатеричной строке:
длина равна: 3
попал в яблочко
длина: 18
Вот код, который я пробовал:
BYTE* ToBinary(LPCWSTR test, BYTE* buffer, DWORD amount) {
if (CryptStringToBinaryW(test, wcslen(test), CRYPT_STRING_HEXRAW, NULL, &amount, NULL, NULL))
{
buffer = malloc(amount + 1);
memset(buffer, 0, amount + 1);
if (buffer == NULL)
{
printf("failed, error: %lu", GetLastError());
return NULL;
}
if (CryptStringToBinaryW(test, wcslen(test), CRYPT_STRING_HEXRAW, buffer, &amount, NULL, NULL))
{
return buffer;
}
}
printf("failed, error: %lu", GetLastError());
return 0;
}
int main(void)
{
LPCWSTR test = L"1c0111001f010100061a024b53535009181c";
BYTE* first = NULL;
DWORD amount = 0;
first = ToBinary(test, first, amount);
printf("%hS\n", first);
printf("length is: %d\n", strlen(first));
LPCWSTR test2 = L"686974207468652062756c6c277320657965";
amount = 0;
BYTE* second = NULL;
second = ToBinary(test2, second, amount);
printf("%hS\n", second);
printf("length is: %d\n", strlen(second));
return 0;
}