Member 9795765 Ответов: 1

Vb.net арифметическая операция привела к переполнению при декодировании


Я работаю над новой функцией декодирования для инструмента восстановления пароля. Я пробовал код на c++ и работал (я не писал эту функцию):

void poco_pwd(u_char *pwd, int type) {
    int     len,
            tmp;
    u_char  *out;
    short   azz;

    if(type) azz = 0x2537;  // encrypt message
        else azz = 0x2a9a;  // other passwords

    len = strlen(pwd) >> 1;
    out = pwd;
    while(len--) {
        sscanf(pwd, "%02X", &tmp);
        pwd += 2;
        *out++ = tmp ^ (azz >> 8);
        azz = ((tmp + azz) * 0x8141) + 0x3171;
    }
    *out = 0;
}



Я попытался преобразовать этот код в vb.net и c#, но он бросает арифметическую операцию переполнения. Это новое значение функции помещается в переменную" azz". "azz" - это короткая переменная, но эти значения очень длинные (((tmp + azz) * 0x8141) + 0x3171). Странно, что он работает на c++.

Что я уже пробовал:

Я преобразовать этот код, чтобы vb.net:

Dim encpass As String = "1EF66D8BD3C32476CEC8CF" 'Hex Value
Dim encpassByte As Byte() = Encoding.UTF8.GetBytes(HexToString(encpass))
Dim azz As Integer = &H2A9A
Dim len As Integer = encpassByte.Length >> 1
Dim storage(len) As Char

For i = 0 To len
    storage(i) = (ChrW(encpassByte(i) Xor (azz >> 8)))
    azz = ((encpassByte(i) + azz) * &H8141) + &H3171 'Error: arithmetic operation resulted in an overflow.
Next

Console.WriteLine(storage.ToString)
Console.ReadKey()


Функция Hex to string

Function HexToString(ByVal hex As String) As String
    Dim text As New System.Text.StringBuilder(hex.Length \ 2)
    For i As Integer = 0 To hex.Length - 2 Step 2
        text.Append(Chr(Convert.ToByte(hex.Substring(i, 2), 16)))
    Next
    Return text.ToString
End Function

1 Ответов

Рейтинг:
0

Bernhard Hiller

Целое число имеет 32 бита. Если количество становится больше, чем это, вы можете получить это исключение ArithmeticOverflow. Старому C++ было все равно: он просто выбросил значение 33-го байта и дальше. Это означает, что вам нужен здесь какой-то способ имитировать это грязное поведение C++. С помощью C# вы можете использовать unchecked ключевое слово, но, похоже, в нем нет эквивалента. VB.Net.
Тем не менее, я не вижу решения с VB.Стандартная функциональность сети. Я бы искал библиотеку с 64-битным целочисленным типом, выполнял вычисления с временной переменной этого типа, а затем делал bitwise and чтобы вернуть его к 32 битам.