Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Парочка изменений #1

Closed
michitta opened this issue Feb 6, 2024 · 27 comments
Closed

Парочка изменений #1

michitta opened this issue Feb 6, 2024 · 27 comments

Comments

@michitta
Copy link

michitta commented Feb 6, 2024

Здравствуйте! Мне очень понравился Ваш проект. Во время внедрения в своё приложение, я пересмотрел некоторые реализованные Вами способы для большей оптимизации и уменьшения размера итогового приложения.

Вот несколько моих изменений:

  1. Для windows можно использовать библиотеку wmi, которая позволяет быстро и без спавна окон powershell получить необходимые параметры (код указан в качестве примера):
    #[cfg(target_os = "windows")]
    pub fn get_mid_result() -> Result<String, MIDError> {
    use wmi::{COMLibrary, WMIConnection};

    let com_connection = unsafe { COMLibrary::assume_initialized() };
    let wmi_connection =
        WMIConnection::new(com_connection.into()).expect("Failed to connect to WMI");

    let mac_address_base: Vec<MACGeneric> = wmi_connection
        .raw_query("SELECT MACAddress from Win32_NetworkAdapter WHERE MACAddress IS NOT NULL")
        .unwrap();

    let bios_serial_base: Vec<SerialNumberGeneric> = wmi_connection
        .raw_query("SELECT SerialNumber from Win32_BIOS WHERE SerialNumber IS NOT NULL")
        .unwrap();

    let processor_id_base: Vec<ProcessorIdGeneric> = wmi_connection
        .raw_query("SELECT ProcessorId from Win32_Processor WHERE ProcessorId IS NOT NULL")
        .unwrap();

    let mut result = Vec::new();

    parse_and_push(&mac_address_base[0].MACAddress, &mut result);
    parse_and_push(&bios_serial_base[0].SerialNumber, &mut result);
    parse_and_push(&processor_id_base[0].ProcessorId, &mut result);

    if result.is_empty() {
        return Err(MIDError::ResultMidError);
    }

    let combined_string = result.join("|");

    Ok(combined_string)
    }
  1. Так как ring очень много весит, я использовал sha2 для генерации уникального идентификатора ПК. Это позволило сильно уменьшить размер приложения.
@doroved
Copy link
Owner

doroved commented Feb 6, 2024

Здравствуйте! Мне очень понравился Ваш проект. Во время внедрения в своё приложение, я пересмотрел некоторые реализованные Вами способы для большей оптимизации и уменьшения размера итогового приложения.

Вот несколько моих изменений:

  1. Для windows можно использовать библиотеку wmi, которая позволяет быстро и без спавна окон powershell получить необходимые параметры (код указан в качестве примера):
    #[cfg(target_os = "windows")]
    pub fn get_mid_result() -> Result<String, MIDError> {
    use wmi::{COMLibrary, WMIConnection};

    let com_connection = unsafe { COMLibrary::assume_initialized() };
    let wmi_connection =
        WMIConnection::new(com_connection.into()).expect("Failed to connect to WMI");

    let mac_address_base: Vec<MACGeneric> = wmi_connection
        .raw_query("SELECT MACAddress from Win32_NetworkAdapter WHERE MACAddress IS NOT NULL")
        .unwrap();

    let bios_serial_base: Vec<SerialNumberGeneric> = wmi_connection
        .raw_query("SELECT SerialNumber from Win32_BIOS WHERE SerialNumber IS NOT NULL")
        .unwrap();

    let processor_id_base: Vec<ProcessorIdGeneric> = wmi_connection
        .raw_query("SELECT ProcessorId from Win32_Processor WHERE ProcessorId IS NOT NULL")
        .unwrap();

    let mut result = Vec::new();

    parse_and_push(&mac_address_base[0].MACAddress, &mut result);
    parse_and_push(&bios_serial_base[0].SerialNumber, &mut result);
    parse_and_push(&processor_id_base[0].ProcessorId, &mut result);

    if result.is_empty() {
        return Err(MIDError::ResultMidError);
    }

    let combined_string = result.join("|");

    Ok(combined_string)
    }
  1. Так как ring очень много весит, я использовал sha2 для генерации уникального идентификатора ПК. Это позволило сильно уменьшить размер приложения.

Привет, спасибо)

  1. Изначально было сделано через WMIC, но оно оказалось Deprecated, поэтому переделал на Powershell, т.к. он есть на каждой машине.
  2. Действительно, не обратил внимание на размер ring, попробую заменить на hmac и sha2

@michitta
Copy link
Author

michitta commented Feb 6, 2024

Здравствуйте! Мне очень понравился Ваш проект. Во время внедрения в своё приложение, я пересмотрел некоторые реализованные Вами способы для большей оптимизации и уменьшения размера итогового приложения.
Вот несколько моих изменений:

  1. Для windows можно использовать библиотеку wmi, которая позволяет быстро и без спавна окон powershell получить необходимые параметры (код указан в качестве примера):
    #[cfg(target_os = "windows")]
    pub fn get_mid_result() -> Result<String, MIDError> {
    use wmi::{COMLibrary, WMIConnection};

    let com_connection = unsafe { COMLibrary::assume_initialized() };
    let wmi_connection =
        WMIConnection::new(com_connection.into()).expect("Failed to connect to WMI");

    let mac_address_base: Vec<MACGeneric> = wmi_connection
        .raw_query("SELECT MACAddress from Win32_NetworkAdapter WHERE MACAddress IS NOT NULL")
        .unwrap();

    let bios_serial_base: Vec<SerialNumberGeneric> = wmi_connection
        .raw_query("SELECT SerialNumber from Win32_BIOS WHERE SerialNumber IS NOT NULL")
        .unwrap();

    let processor_id_base: Vec<ProcessorIdGeneric> = wmi_connection
        .raw_query("SELECT ProcessorId from Win32_Processor WHERE ProcessorId IS NOT NULL")
        .unwrap();

    let mut result = Vec::new();

    parse_and_push(&mac_address_base[0].MACAddress, &mut result);
    parse_and_push(&bios_serial_base[0].SerialNumber, &mut result);
    parse_and_push(&processor_id_base[0].ProcessorId, &mut result);

    if result.is_empty() {
        return Err(MIDError::ResultMidError);
    }

    let combined_string = result.join("|");

    Ok(combined_string)
    }
  1. Так как ring очень много весит, я использовал sha2 для генерации уникального идентификатора ПК. Это позволило сильно уменьшить размер приложения.

Привет, спасибо)

  1. Изначально было сделано через WMIC, но оно оказалось Deprecated, поэтому переделал на Powershell, т.к. он есть на каждой машине.
  2. Действительно, не обратил внимание на размер ring, попробую заменить на hmac и sha2

Так это WMI, а не WMIC
image

@doroved
Copy link
Owner

doroved commented Feb 6, 2024

Так это WMI, а не WMIC

Я как не виндовс юзеров, не шарю за это)
Насколько критично использование Powershell? И это именно на винде? Потому что на макос тоже используется std::process::Command

@michitta
Copy link
Author

michitta commented Feb 6, 2024

Так это WMI, а не WMIC

Я как не виндовс юзеров, не шарю за это) Насколько критично использование Powershell? И это именно на винде? Потому что на макос тоже используется std::process::Command

На windows во время получения появляется 4 окна powershell )

@doroved
Copy link
Owner

doroved commented Feb 6, 2024

На windows во время получения появляется 4 окна powershell )

Прикол)
А попробуй добавить этот момент во всех команды винды, в исходники установленного пакета у себя. Если сработает, то добавлю и залью обнову.
image

let csproduct_output = run_shell_comand(
    "powershell",
    [
        "-WindowStyle",
        "Hidden",
        "-command",
        r#"Get-WmiObject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID"#,
    ],
)
.unwrap_or("".into());

Тут до сих пор открыто issue, но пишут, что обязательно сначала -WindowStyle в команде должно идти
PowerShell/PowerShell#3028 (comment)

@michitta
Copy link
Author

michitta commented Feb 6, 2024

На windows во время получения появляется 4 окна powershell )

Прикол) А попробуй добавить этот момент во всех команды винды, в исходники установленного пакета у себя. Если сработает, то добавлю и залью обнову. image

let csproduct_output = run_shell_comand(
    "powershell",
    [
        "-WindowStyle",
        "Hidden",
        "-command",
        r#"Get-WmiObject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID"#,
    ],
)
.unwrap_or("".into());

Тут до сих пор открыто issue, но пишут, что обязательно сначала -WindowStyle в команде должно идти PowerShell/PowerShell#3028 (comment)

image
Запустил в таком виде, консоль не появилась

@doroved
Copy link
Owner

doroved commented Feb 6, 2024

Запустил в таком виде, консоль не появилась

Отлично, а проверь, данные отдает такая команда? Если да, то поправлю и обновлю сегодня

@michitta
Copy link
Author

michitta commented Feb 6, 2024

Запустил в таком виде, консоль не появилась

Отлично, а проверь, данные отдает такая команда? Если да, то поправлю и обновлю сегодня

Отдаёт

@doroved
Copy link
Owner

doroved commented Feb 7, 2024

Отдаёт

Готово, оптимизировал зависимости и добавил WindowStyle Hidden
Версия 1.1.2
Проверь у себя и скажи, все ли ок)

@michitta
Copy link
Author

michitta commented Feb 7, 2024

Отдаёт

Готово, оптимизировал зависимости и добавил WindowStyle Hidden Версия 1.1.2 Проверь у себя и скажи, все ли ок)

Всё работает, но всё-равно очень медленно. Минимальное время полученное в ходе 3 запусков приложения: 2.89s.

@doroved
Copy link
Owner

doroved commented Feb 14, 2024

но всё-равно очень медленно. Минимальное время полученное в ходе 3 запусков приложения: 2.89s.

Наверное надо будет асинхронно вызывать команды powershell, чтобы ускорить

@doroved
Copy link
Owner

doroved commented Feb 18, 2024

@michitta

Загрузи крейт к себе на пк, замени код в windows.rs на этот и потести скорость плз)

#[cfg(target_os = "windows")]
use crate::errors::MIDError;

#[cfg(target_os = "windows")]
use crate::utils::run_shell_comand;

#[cfg(target_os = "windows")]
pub(crate) fn get_mid_result() -> Result<String, MIDError> {
    let combined_output = run_shell_comand(
        "powershell",
        [
            "-WindowStyle",
            "Hidden",
            "-command",
            r#"
            $csproduct = Get-WmiObject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID;
            $bios = Get-WmiObject Win32_BIOS | Select-Object -ExpandProperty SerialNumber;
            $baseboard = Get-WmiObject Win32_BaseBoard | Select-Object -ExpandProperty SerialNumber;
            $cpu = Get-WmiObject Win32_Processor | Select-Object -ExpandProperty ProcessorId;
            "$csproduct|$bios|$baseboard|$cpu"
            "#,
            ],
    )
    .unwrap_or("".into());

    if combined_output.is_empty() {
        return Err(MIDError::ResultMidError);
    }

    let combined_string = combined_output
        .trim()
        .trim_start_matches('|')
        .trim_end_matches('|');

    Ok(combined_string.to_string())
}

И да, перед этим сними mid текущей версии и сравни его с тем, что получится с этим кодом, должно совпасть.

@doroved
Copy link
Owner

doroved commented Feb 23, 2024

Всё работает, но всё-равно очень медленно. Минимальное время полученное в ходе 3 запусков приложения: 2.89s.

Если нужно часто дергать mid, то например, имеет смысл сохранять его в state

@michitta
Copy link
Author

michitta commented Mar 4, 2024

Извиняюсь за долгий ответ. Hwid я записывал в sessionStorage. Сейчас я отказался от получения hwid из-за проблем с уникальностью получаемого hwid. На Linux и macos может и сработает подобный вариант получения hwid (который у Вас в crate), но на windows постоянно попадаются повторения получаемого hwid.

@doroved
Copy link
Owner

doroved commented Mar 4, 2024

Сейчас я отказался от получения hwid из-за проблем с уникальностью получаемого hwid

Проблемы с уникальностью в целом на windows или в текущем крейте?

На Linux и macos может и сработает

На Linux практически нет надежных вариантов, она вся секьюрная, самый идеальный вариант для macos.

но на windows постоянно попадаются повторения получаемого hwid.

Можно подробней пожалуйста, как вы это отследили, запустили трафик на свое приложение? Странно, используется 4 не связанных между собой параметра, у разных людей вы заметили одинаковый хеш MID?
В любом случае максимально информации хотелось бы, на сколько это возможно, спасибо)

@michitta
Copy link
Author

michitta commented Mar 4, 2024

Проблемы с уникальностью в целом на windows. Другие платформы протестировать не было возможности.

Я разрабатываю приватный лаунчер для Minecraft проектов.

На бэке организовал добавление в таблицу к пользователю hwid. В итоге тестирования на аудитории ~10к человек у многих вылетала ошибка, которая гласила, что данный ПК уже привязан к другому аккаунту. Я пробовал и другие параметры использовать для вычисления hwid, но повторения всё равно были.

@doroved
Copy link
Owner

doroved commented Mar 4, 2024

Проблемы с уникальностью в целом на windows. Другие платформы протестировать не было возможности.

Я разрабатываю приватный лаунчер для Minecraft проектов.

На бэке организовал добавление в таблицу к пользователю hwid. В итоге тестирования на аудитории ~10к человек у многих вылетала ошибка, которая гласила, что данный ПК уже привязан к другому аккаунту. Я пробовал и другие параметры использовать для вычисления hwid, но повторения всё равно были.

А сколько конкретно людей из 10к, можно посчитать? Интересен %.

  1. Проверьте, нет ли ошибок в самой логике определения привязки и отображения подобного уведомления.
  2. Выведите в интерфейс программы хеш MID и попросите тех людей, кто столкнулся с проблемой, прислать вам хеш, который у них отображается, чтобы убедиться, что он действительно один и тот же.
  3. Опросите людей с проблемой, какие у них железки стоят. Очень странно, даже если производитель один и тот же, почему ID одинаковые.

@michitta
Copy link
Author

michitta commented Mar 4, 2024

  1. В логике нет ошибок

  2. У меня логгер на бэке стоял под это дело

  3. Железо было разное

@michitta
Copy link
Author

michitta commented Mar 4, 2024

У некоторых пользователей были проблемы с получением части параметров. Почему на одной системе все параметры получаются, а на другой нет - для меня загадка

@doroved
Copy link
Owner

doroved commented Mar 4, 2024

У некоторых пользователей были проблемы с получением части параметров. Почему на одной системе все параметры получаются, а на другой нет - для меня загадка

Да, я только начал про это писать, опередили)
Похоже, что часть параметров не определяется и есть какой то 1-2 одинаковых для всех людей с проблемой.
Идеально сделать логирование списка параметров, чтобы выявить какие из них не уникальные и дальше можно изучать этот вопрос.

@michitta
Copy link
Author

michitta commented Mar 4, 2024

"А сколько конкретно людей из 10к, можно посчитать? Интересен %." - процент подсчитать не смогу.

Ещё хотел добавить, что процессор лучше не использовать для получения hwid. Если разработчик хочет сделать привязку ПК к аккаунту, то значение будет меняться. Я думаю, что стоит идти в сторону получения каких-то данных от материнской платы, чтобы при замене процессора не происходила смена hwid.

@michitta
Copy link
Author

michitta commented Mar 4, 2024

В ближайшие дни верну проверку по HWID и отпишусь о результатах более подробно

@doroved
Copy link
Owner

doroved commented Mar 4, 2024

Если разработчик хочет сделать привязку ПК к аккаунту, то значение будет меняться.

Имейте ввиду, что cpu_output может меняться?

Я думаю, что стоит идти в сторону получения каких-то данных от материнской платы, чтобы при замене процессора не происходила смена hwid.

Проблема в том, что ПК не винде, как конструктор, по идее там можно заменить всё и тогда отпечаток изменится, но надеюсь это не частый случай и в таком случае пользователю просто надо будет перепривязать свой аккаунт на обновленном устройстве.

@michitta
Copy link
Author

michitta commented Mar 4, 2024

Если разработчик хочет сделать привязку ПК к аккаунту, то значение будет меняться.

Имейте ввиду, что cpu_output может меняться?

Я думаю, что стоит идти в сторону получения каких-то данных от материнской платы, чтобы при замене процессора не происходила смена hwid.

Проблема в том, что ПК не винде, как конструктор, по идее там можно заменить всё и тогда отпечаток изменится, но надеюсь это не частый случай и в таком случае пользователю просто надо будет перепривязать свой аккаунт на обновленном устройстве.

Подобная защита по HWID защищает только от школьников, посмотревших гайды на ютубе, но когда аудитория состоит только из них - это хорошее решение))) (на винде)

@doroved
Copy link
Owner

doroved commented Mar 4, 2024

Подобная защита по HWID защищает только от школьников

А как еще иначе лицензировать софт кроме как создания MID?) Поэтому и используются идентификаторы железок, которые программно не подменить, только если железо перебирать, что становится нецелесообразным для тех, кто хочет ваш софт использовать бесплатно (если есть триал версия на каждый уникальный MID)

@doroved
Copy link
Owner

doroved commented Mar 5, 2024

@michitta а потестируй пожалуйста этот вариант #1 (comment)
И можешь мне в тг написать плз, там удобнее будет (в профиле есть), есть некоторые мысли по пустым показателям некоторых юзеров.

@doroved
Copy link
Owner

doroved commented Mar 5, 2024

Выпустил версию 1.1.3 с этим кодом, который быстрее чуть больше х2.
В следующих версиях рассмотрю использование wmi, т.к. через него еще быстрее будет.

@doroved doroved closed this as completed Mar 5, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants