Вопрос Чтение из реестра

Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
Приветствую человека, который по какой-то причине кликнул на данную тему. Проблема такова и очень странная. Все примеры я приложу. Делаю простенький LoadLibrary инжектор чисто для себя. И раз уж люблю делать всё по красоте, то решил читать все данные из регистров, чтобы точно знать откуда и какой запускать exe-шник. Проблема в том, что на моем тестовом проекте всё работает отлично, я получаю путь из функции, но если это делать на основном проекте лоадера я получаю мусорные символы, вместо пути. Стоит отметить, что если выводить значение в консоль до того, как возвращать значение строка всё такая же правильная, но когда я её получил и вывел, то там какое-то дерьмо, прикладываю видос.

P.s. на первом рабочем столе - основной проект. на втором - тестовый. На обоих проектах стоит использование многобайтовой кодировки, так как без этого оно попросту не работает.

 
Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
SetConsoleOutputCP(CP_UTF8)?
Даже ради интереса попробовал, но это не то, что и логично. Здесь проблема вовсе не в выводе, да и в самой функции же всё правильно выводится, лол. Я просто не понимаю, почему на одном проекте всё ок, а на другом хуйня какая-то. Учитывая, что по настройкам они идентичны...
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Даже ради интереса попробовал, но это не то, что и логично. Здесь проблема вовсе не в выводе, да и в самой функции же всё правильно выводится, лол. Я просто не понимаю, почему на одном проекте всё ок, а на другом хуйня какая-то. Учитывая, что по настройкам они идентичны...
Обычно в таких ситуациях прикладывают код, в том числе и различия между проектами. Просто так подобные проблемы в работе не возникают.
P.S.: регистр?) Думаю, Вы имели в виду реестр.
 
Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
Обычно в таких ситуациях прикладывают код, в том числе и различия между проектами. Просто так подобные проблемы в работе не возникают.
P.S.: регистр?) Думаю, Вы имели в виду реестр.
Да реально перепутал, реестр. Но опять же, как я и говорил в посте. Код идентичный на обоих проектах, настройки тоже.
 
Олдфаг
Статус
Оффлайн
Регистрация
5 Июл 2017
Сообщения
2,108
Реакции[?]
1,189
Поинты[?]
0
Приветствую человека, который по какой-то причине кликнул на данную тему. Проблема такова и очень странная. Все примеры я приложу. Делаю простенький LoadLibrary инжектор чисто для себя. И раз уж люблю делать всё по красоте, то решил читать все данные из регистров, чтобы точно знать откуда и какой запускать exe-шник. Проблема в том, что на моем тестовом проекте всё работает отлично, я получаю путь из функции, но если это делать на основном проекте лоадера я получаю мусорные символы, вместо пути. Стоит отметить, что если выводить значение в консоль до того, как возвращать значение строка всё такая же правильная, но когда я её получил и вывел, то там какое-то дерьмо, прикладываю видос.

P.s. на первом рабочем столе - основной проект. на втором - тестовый. На обоих проектах стоит использование многобайтовой кодировки, так как без этого оно попросту не работает.

Ты в RegistryRead() резервируешь 255 байт по стеку, то есть "создаешь локальную TCHAR[255]", но ты это делаешь непосредственно в RegistryRead(), а после выхода из этой функции, то, что было зарезервировано этой функцией в стеке может использоваться повторно, так-как из той функции ты уже вышел. Грубо говоря, локальные переменные нельзя использовать за пределами функции, где она создавалась, а твоя TCHAR[255] как раз таковой является, то есть ты используешь в Inject() уже остаточные данные из стека от использования старой функции, что является грубейшей ошибкой, ты пытаешься использовать локальную переменную от функции, которая уже закончила своё выполнение.

Как исправить. Создай TCHAR[255] в функции Inject() и передавай адрес в аргумент для RegistryRead(). Думаешь почему WIN API RegQueryValueEx требует в аргументы передавать адрес на массив символов, а не просто возвращает тебе адрес на этот массив, как раз по той причине, с которой ты столкнулся.

Сделай так-же, только по отношению к Inject() -> RegistryRead(). Если же тебе нужны данные на постоянной основе, то есть ты собираешься их использоваться за пределами функции Inject(), то создавай глобальную переменную, а не локальную, и используй её. Локальная переменная доступна только до тех пор, пока функция не завершилась, то есть с твоей локальной переменной могут считаться другие функции, которые были вызваны внутри той функции, где ты создал эту локальную переменную, но не наоборот, после окончания выполнения функции, этот участок стека будет использоваться уже другими функциями, что были вызваны раньше той функции, где ты резервировал этот участок памяти
1651527152350.png
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
Ты в RegistryRead() резервируешь 255 байт по стеку, то есть "создаешь локальную TCHAR[255]", но ты это делаешь непосредственно в RegistryRead(), а после выхода из этой функции, то, что было зарезервировано этой функцией в стеке может использоваться повторно, так-как из той функции ты уже вышел. Грубо говоря, локальные переменные нельзя использовать за пределами функции, где она создавалась, а твоя TCHAR[255] как раз таковой является, то есть ты используешь в Inject() уже остаточные данные из стека от использования старой функции, что является грубейшей ошибкой, ты пытаешься использовать локальную переменную от функции, которая уже закончила своё выполнение.

Как исправить. Создай TCHAR[255] в функции Inject() и передавай адрес в аргумент для RegistryRead(). Думаешь почему WIN API RegQueryValueEx требует в аргументы передавать адрес на массив символов, а не просто возвращает тебе адрес на этот массив, как раз по той причине, с которой ты столкнулся.

Сделай так-же, только по отношению к Inject() -> RegistryRead(). Если же тебе нужны данные на постоянной основе, то есть ты собираешься их использоваться за пределами функции Inject(), то создавай глобальную переменную, а не локальную, и используй её
Посмотреть вложение 202107
Огромное тебе спасибо, заработало. Странно, что я этого не углядел и ещё более неясно почему при примерно таких же условиях другой проект работает, но и ладно.
 
Олдфаг
Статус
Оффлайн
Регистрация
5 Июл 2017
Сообщения
2,108
Реакции[?]
1,189
Поинты[?]
0
Огромное тебе спасибо, заработало. Странно, что я этого не углядел и ещё более неясно почему при примерно таких же условиях другой проект работает, но и ладно.
Просто в другом проекте этот участок стека не использовался, предположу, что ты просто получал данные и ничего после этого больше не делал, однако ты использовал остаточные данные от старой функции, сохранность которых уже невозможна в дальнейшем, так-как это остаточные данные от локальных переменных, которые по логике, уже не нужны, и этот участок памяти уже становится свободным для использования. Функция наследила в стеке, тебе просто повезло в том плане, что эти остаточные данные из памяти не были изменены
 
Сверху Снизу