Преобразование шестнадцатеричных значений в байты с использованием широкой строки win32 API - вызов matasano # 2 - PullRequest
0 голосов
/ 11 октября 2019

Я начал выполнять задачи 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;
}

1 Ответ

0 голосов
/ 14 октября 2019

Я пробовал этот код, но когда я проверяю strlen первого значения, он возвращает длину 3, а не 18 во второй шестнадцатеричной строке:

Длина строки C определяется завершающим нулевым символом: строка AC равна числу символов между началом строки и завершающим нулевым символом (без учета самого завершающего нулевого символа).

Таким образом, причина в том, что четвертый символ first является завершающим нулевым символом ('\0'), причина strlen остановка и возврат 3.

...