Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
DaVillka
7 / 7 / 3
Регистрация: 31.10.2015
Сообщений: 93
Завершенные тесты: 1
#1

Узнать адрес указателя

07.01.2017, 20:05. Просмотров 511. Ответов 26
Метки нет (Все метки)

Есть функция в чужой программе, которая в качестве параметров принимает указатель на структуру. Вопрос, как узнать адрес этой структуры, если нельзя поставить сплайс на начало функции, так как там уже стоит чужой сплайс?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2017, 20:05
Ответы с готовыми решениями:

Как узнать адрес указателя?
(void *)str показывает адрес строки, а как узнать адрес указателя? char *str...

Как узнать адрес указателя на char?
Например, вот есть массив символов и указатель. И указателю присваиваем адрес...

Адрес объекта, адрес указателя. Где что находится?
#include <iostream> void Foo(int* val) { std::cout << val << " " <<...

Изменить адрес указателя
Подскажите пожалуйста, как изменить не только адрес куда указывает указатель,...

Сменить адрес указателя
Подскажите пожалуйста, допустим есть 2 массива A и B с 2-я указателями на них a...

26
Убежденный
Ушел с форума
Эксперт С++
15954 / 7266 / 1178
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.01.2017, 20:26 #2
С каких это пор один сплайс является помехой для другого?
0
jupman
230 / 133 / 19
Регистрация: 10.11.2015
Сообщений: 305
07.01.2017, 20:41 #3
Цитата Сообщение от Убежденный Посмотреть сообщение
С каких это пор один сплайс является помехой для другого?
Смотря какой сплайс, может там jmp/jcc или rip-адресация. Пересчитывать придется.

Добавлено через 10 минут
Цитата Сообщение от DaVillka Посмотреть сообщение
Вопрос, как узнать адрес этой структуры, если нельзя поставить сплайс на начало функции
Ну, сплайсинг не единственный метод. Есть ещё: хот патч, точки останова, патч таблицы импорта.
0
DaVillka
7 / 7 / 3
Регистрация: 31.10.2015
Сообщений: 93
Завершенные тесты: 1
07.01.2017, 20:43  [ТС] #4
Убежденный, ну вообще да, но в данном случае нельзя поставить, ибо та прога что ставит сплайс проверяет его наличие, если поставить поверх, то выкинет из проги, можно поставить за ним свой, но тогда в качестве указателя будет не то что нужно
0
Убежденный
Ушел с форума
Эксперт С++
15954 / 7266 / 1178
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.01.2017, 20:59 #5
Цитата Сообщение от jupman Посмотреть сообщение
Смотря какой сплайс, может там jmp/jcc или rip-адресация. Пересчитывать придется.
Также не вижу проблемы. Все нормальные библиотеки для перехватов умеют
обрабатывать такие ситуации. Да и без сторонних либ можно просто сделать
хак под конкретную реализацию чужого сплайса.

Цитата Сообщение от DaVillka Посмотреть сообщение
в данном случае нельзя поставить, ибо та прога что ставит сплайс проверяет его наличие, если поставить поверх, то выкинет из проги
Тогда надо сначала поставить сплайс на проверку сплайса, а потом засплайсить сам сплайс
0
Renji
2102 / 1543 / 470
Регистрация: 05.06.2014
Сообщений: 4,473
07.01.2017, 20:59 #6
Цитата Сообщение от DaVillka Посмотреть сообщение
Убежденный, ну вообще да, но в данном случае нельзя поставить, ибо та прога что ставит сплайс проверяет его наличие, если поставить поверх, то выкинет из проги, можно поставить за ним свой, но тогда в качестве указателя будет не то что нужно
А вы попробуйте хукнуть код хука. Ну, то есть, чужая прога внедряет jmp на свой перехватчик. А вы по адресу этого jmp пройдите и прям туда впихните свой jmp.
0
DaVillka
7 / 7 / 3
Регистрация: 31.10.2015
Сообщений: 93
Завершенные тесты: 1
07.01.2017, 21:04  [ТС] #7
Renji, да там стоит еще один од хук) и тоже проверяется, и дальше тоже проверяется )

Добавлено через 1 минуту
Убежденный, но я не знаю как проверяется наличие сплайса, а если поставить свой сплайс после ихнего, то нельзя как то узнать адрес ?
0
jupman
230 / 133 / 19
Регистрация: 10.11.2015
Сообщений: 305
07.01.2017, 21:06 #8
Цитата Сообщение от Renji Посмотреть сообщение
А вы попробуйте хукнуть код хука. Ну, то есть, чужая прога внедряет jmp на свой перехватчик. А вы по адресу этого jmp пройдите и прям туда впихните свой jmp.
А потом сторонний код будет снимать хук и вырвет нам почву из под ног.
0
Убежденный
Ушел с форума
Эксперт С++
15954 / 7266 / 1178
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.01.2017, 21:10 #9
А нельзя ли поставить свой сплайс раньше чужого?
0
DaVillka
7 / 7 / 3
Регистрация: 31.10.2015
Сообщений: 93
Завершенные тесты: 1
07.01.2017, 21:14  [ТС] #10
Убежденный, можно, но его же вроде как все равно перепишет чужой сплайс ? Оо
0
jupman
230 / 133 / 19
Регистрация: 10.11.2015
Сообщений: 305
07.01.2017, 21:28 #11
Цитата Сообщение от Renji Посмотреть сообщение
А вы попробуйте хукнуть код хука. Ну, то есть, чужая прога внедряет jmp на свой перехватчик. А вы по адресу этого jmp пройдите и прям туда впихните свой jmp.
Цитата Сообщение от jupman Посмотреть сообщение
А потом сторонний код будет снимать хук и вырвет нам почву из под ног.
Renji, Я сглупил, так можно сделать. Вы все верно говорите.
0
Undisputed
202 / 133 / 35
Регистрация: 10.06.2014
Сообщений: 1,605
Завершенные тесты: 3
07.01.2017, 21:54 #12
Извините что залез в чужую тему, а что такое сплайс? Гугл ничего толком не выдал
Это из оперы ассемблера?
0
jupman
230 / 133 / 19
Регистрация: 10.11.2015
Сообщений: 305
07.01.2017, 21:57 #13
Цитата Сообщение от Убежденный Посмотреть сообщение
Также не вижу проблемы. Все нормальные библиотеки для перехватов умеют
обрабатывать такие ситуации. Да и без сторонних либ можно просто сделать
хак под конкретную реализацию чужого сплайса.
Да, знаю что либы умеют. Просто помню ТС создавал тему про пересчет джампа, поэтому думаю у него свой велосипед.
0
Убежденный
Ушел с форума
Эксперт С++
15954 / 7266 / 1178
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.01.2017, 21:59 #14
Цитата Сообщение от DaVillka Посмотреть сообщение
я не знаю как проверяется наличие сплайса, а если поставить свой сплайс после ихнего, то нельзя как то узнать адрес ?
А откуда ты знаешь, что чужой сплайс проверяется?
Может быть, твой сплайс реализован некорректно и из-за этого все валится?..

Цитата Сообщение от jupman Посмотреть сообщение
Просто помню ТС создавал тему про пересчет джампа, поэтому думаю у него свой велосипед.
Ага, вот и я стал что-то в таком духе подозревать.
Свой сплайсинг, свой дизасм, что-то вдруг падает, только непонятно где...
0
jupman
230 / 133 / 19
Регистрация: 10.11.2015
Сообщений: 305
07.01.2017, 22:00 #15
sys_beginner, перехват посредством модификации тела функции (патч кода)
1
Убежденный
Ушел с форума
Эксперт С++
15954 / 7266 / 1178
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.01.2017, 22:01 #16
Цитата Сообщение от sys_beginner Посмотреть сообщение
а что такое сплайс?
Сплайсингом называют перехват функций через правку (патчинг) их тела.
Обычно первые несколько байт заменяются jmp с переходом на свой обработчик.
А обработчик, выполнив свою работу, прыгает на "трамплин" (или, как его
еще называют иногда, bridge), который выполняет "украденные" инструкции из
первых байт, чтобы восстановить контекст, так сказать, а затем переходит на
остаток оригинальной функции. В деталях техника может различаться, но
общий принцип примерно такой.
1
Undisputed
202 / 133 / 35
Регистрация: 10.06.2014
Сообщений: 1,605
Завершенные тесты: 3
07.01.2017, 22:09 #17
Убежденный,
Т.е когда выполняется функция, где то хранится адрес возврата в определенный контекст для продолжения выполнения программы. На уровне ассемблера можно подменить этот адрес, выполнить какой то код, а потом снова вернуться к продолжению программы?

Интересно где это может пригодится. Почему просто нельзя вызвать функцию а после нее другую функцию которая сделает то что делается при перехвате и до восстановления контекста
0
DaVillka
7 / 7 / 3
Регистрация: 31.10.2015
Сообщений: 93
Завершенные тесты: 1
07.01.2017, 22:14  [ТС] #18
Убежденный, jupman, да, у меня свой велосипед, со сплайсами все в порядке, это у них такой защитный механизм, если по адресу стоит не их сплайс а что то другое, то рушит процесс, и да, вопрос можно закрыть, я подменил функцию в таблице импорта(хоть и там то же есть камни, но они никак не относятся к тому, что я в результате смог получить)

Добавлено через 3 минуты
sys_beginner, ну дак в функции, в основном, передаются какие то параметры, без которых весь процесс может рухнуть, на пример виртуальные функции ты так просто не вызовешь, тебе нужно хукнуть функцию какую то, и сохранить this
0
Убежденный
Ушел с форума
Эксперт С++
15954 / 7266 / 1178
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.01.2017, 22:16 #19
Цитата Сообщение от sys_beginner Посмотреть сообщение
Т.е когда выполняется функция, где то хранится адрес возврата в определенный контекст для продолжения выполнения программы. На уровне ассемблера можно подменить этот адрес, выполнить какой то код, а потом снова вернуться к продолжению программы?
Это ты описываешь технику под названием ROP (Return-Oriented Programming)
А сплайсинг - несколько другое, его суть именно в перезаписи тела функции, -
обычно первых нескольких байт, - своим кодом, обычно прыжком на свой обработчик.

Интересно где это может пригодится.
Да много где. Когда тебе, например, нужно слегка изменить поведение какой-то программы.

Почему просто нельзя вызвать функцию а после нее другую функцию которая сделает то что делается при перехвате и до восстановления контекста
Потому что функцию вызываем не мы, ее вызывает чужой код, и когда он это делает - мы точно не знаем.
Мы лишь гости в этом мире процессе...
1
Undisputed
202 / 133 / 35
Регистрация: 10.06.2014
Сообщений: 1,605
Завершенные тесты: 3
07.01.2017, 22:17 #20
Цитата Сообщение от DaVillka Посмотреть сообщение
ну дак в функции, в основном, передаются какие то параметры, без которых весь процесс может рухнуть
Не понял, если в функцию не были переданы обязательные параметры, то программа не скомпилируется
А если это логическая ошибка то просто нужно пофиксить

Цитата Сообщение от DaVillka Посмотреть сообщение
на пример виртуальные функции ты так просто не вызовешь, тебе нужно хукнуть функцию какую то, и сохранить this
Почему не вызову? obj.virtualMethod(); какие проблемы? А this будет указывать на текущий объект
0
07.01.2017, 22:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 22:17

Сменить адрес указателя
У меня есть переменная v. Как сделать так, что бы в некоторый момент времени...

Получить адрес указателя на функцию
int(*ptr)(int) = &abs; cout << "&abs = " << &ptr << endl; cout << "&ptr =...

Изменить адрес указателя на функцию
void ShowNumber(int number) { printf("number = %d\n", number); } void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru