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

подмена указателя на функцию

gamerofh

HDD-drive
Пользователь
Регистрация
17.11.2020
Сообщения
21
Реакции
1
Стоит вот какая задачка:
Есть у винды файлик ntoskrnl.exe
и есть в нем функция ZwConvertBetweenPerformanceCounter
а внутри вызывается xKdEnumerateDebuggingDevices по указателю.

Научите, покажите, продайте (еще ваши варианты) решения подмены указателя на ту самую функцию xKdEnumerateDebuggingDevices чтобы в итоге вызывалась подмененная функция драйвера... Там еще 3 параметра передается в нее.

В общем такой вот хук нужно сделать а мозгов не хватает.

А в идеале нужно найти другую функцию и хук делать в другое место. Если кто-то из вас может написать вот такой вот драйвер, помогите.
Цель - научиться.
Еще цель найти партнера. Не малварь. Все безобиднее.
Версия сборки винды 2004, 1909, 1903
 
Пожалуйста, обратите внимание, что пользователь заблокирован
xKdEnumerateDebuggingDevices - это указатель на функцию в секции данных ntoskrnl.exe? Если да и секция данных имеет права на запись, то почему бы просто не переписать указатель?
 
xKdEnumerateDebuggingDevices - это указатель на функцию в секции данных ntoskrnl.exe? Если да и секция данных имеет права на запись, то почему бы просто не переписать указатель?
Все верно. Но некоторая кривизна рук норовит вот это просто превратить в сложно, непонятно. Нужен пример. Вы абсолютно верно уловили и я понимаю что это просто. Но как найти грамотно смещение, и на что его менять... в общем теряюсь.
В целом нужно найти другое аналогичное место для перехвата но с этим я думаю справлюсь, а вот сам перехват - белое пятно.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
xKdEnumerateDebuggingDevices она есть в таблице экспорта?
 
xKdEnumerateDebuggingDevices она есть в таблице экспорта?
snap1.png

вот что есть. v8 читаем с смещения, а там

snap2.png

В таблице экспорта нет ее. Но подозреваю что для версии сборки 2004 это вот и есть правильные смещения которые нужно переписать:
0x140c00920
0x140c00928
0x140c00930

Но повторюсь я не совсем понимаю что делаю
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну так а вопрос то какой? В секции данных, если верить иде, ты должен переписать ...20 и ...28.
 
Ну так а вопрос то какой? В секции данных, если верить иде, ты должен переписать ...20 и ...28.
Вопрос как раз в этом и состоит что "надо переписать". А я как та собака павлова понимаю все. Нашел что хочу, а вот написать не могу. С плохо знаю. На что поменять? где взять адрес моей функции? Как его пропихнуть по нужному адресу? Примерчик бы. Наверняка тут есть люди кто уже имеет на руках подобный функционал в исходниках. Надеюсь что покажут. Там коду то в теории с десяток строк.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
На что поменять?
На свою функцию с такими же аргументами и конвенцией вызовов.

где взять адрес моей функции?
Написать функцию и https://metanit.com/cpp/c/5.11.php

Как его пропихнуть по нужному адресу?
Код:
*((ULONGLONG*)0x140c00920) = (ULONGLONG)MyFunc;
*((ULONGLONG*)0x140c00928) = (ULONGLONG)MyFunc;
 
*((ULONGLONG*)0x140c00920) = (ULONGLONG)MyFunc;
Сишка вот так запросто дает возможность залезть в чужую память? Или это все же смещение относительно базы ntoskrnl.exe?
Для чтения памяти (чужой) я использую MmCopyVirtualMemory, а вы намекаете что для записи чего то можно вот так вот просто? а не опять же например MmCopyVirtualMemory?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Сишка вот так запросто дает возможность залезть в чужую память? Или это все же смещение относительно базы ntoskrnl.exe?
Что значит "чужая память"? Ядерная память одна. Если ntoskrnl.exe грузится всегда по одному базовому адресу, то именно этот адрес. Если грузится по разным, то надо высчитать смещение относительно базового адреса по-умолчанию, потом прибавить это смещение к действительному базовому адресу ntoskrnl.exe.
 
Попахивает античитами, зачем тебе "ядерные" файлы поднадобилось трогать?
Оно самое. Балуюсь с Battleye. Пока что счет в его пользу. Уж больно злой античит на сегодня. То подпись ему не нравится, то протокол коммуникации с драйвером.
 
Последнее редактирование:
Зачем тебе драйвер, что ты хочешь получить в итоге?
BE не дает читать память игры напрямую из UserMode а если и можно то флаг и бан. Следовательно читаю драйвером. Но коммуникация с драйвером пока вопрос открытый. Вот пробую такие хуки. Это для коммуникации с драйвером для обмена. А уже чит то ли отправляет то ли рисует... это уже детали. С самим читом проблем нет. А вот обход античита - та еще задача.
 
Вот что выходит. Сборка винды 2004.
0x140c00920 то что нужно поменять
0xfffff80465800000 - адрес смещения ntoskrnl
0xfffff805a6400920 - сумма.
Но ведь это же ересь? При попытке читать (писать не пробовал) бсодит. Впрочем не удивлен. Топчусь на месте как слепой
 
Пожалуйста, обратите внимание, что пользователь заблокирован
0x140c00920 - вот ты сам подумай, если бы это было смещение в ntoskrnl, то сколько сотен мегабайт у тебя должен был бы весить сам ntoskrnl.
 
Научите, покажите, продайте (еще ваши варианты) решения подмены указателя на ту самую функцию
В общем такой вот хук нужно сделать а мозгов не хватает.
Цель - научиться.

0x140c00920 - вот ты сам подумай, если бы это было смещение в ntoskrnl, то сколько сотен мегабайт у тебя должен был бы весить сам ntoskrnl.

Да я понимаю что лажаю. Но если бы я знал что происходит и куда копать я бы копал. А так я просто перебираю кнопочки на клаве как та обезьяна.
*((ULONGLONG*)0x140c00920) = (ULONGLONG)MyFunc;

Обратное равенство вероятно тоже имеет смысл? но нет же.
ULONGLONG tmpValue = *((ULONGLONG*)0x140c00920)

я и обратился за помощью с целью понять и научиться у тех кто уже знает. А к чему пришел: вот те строчка, вот еще - иди разбирайся. Если не не сложно - помоги разобраться. Толку думать если я видимо не понимаю сущность .data секции. Белое пятно которое хочу заполнить. Если это не смещение внутри ntoskrnl то что это? Я все это время крутил код и так и эдак, и не стал бы писать если б снова в тупик не зашел, точнее наоборот планировал выложить решение. А так и не нашел его
 
Код:
        ULONGLONG bla2 = *((ULONGLONG*)(0x140c00920));
//        SayToSenpai("BOFH: p bla2 is 0x%I64x", bla2);
на удивление без вывода DbgPrintEx не бсодит, а вот если раскомментировать то бсод
 
Пожалуйста, обратите внимание, что пользователь заблокирован
на удивление без вывода DbgPrintEx не бсодит, а вот если раскомментировать то бсод
Потому, что bla2 не используемая переменная и ее вырезает оптимизатор.

0x140c00920
Еще раз. То, что ты видишь в IDA это виртуальный адрес, когда ntoskrnl грузится по базовому адресу по-умолчанию. Чтобы найти смещение, тебе надо из этого адреса вычесть базовый адрес по-умолчанию. Затем найти базовый адрес в ядре и прибавить полученное смещение.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Но если бы я знал что происходит и куда копать я бы копал.
Так иди учи С, иди учи PE-формат, что такое RVA, что такое VA, что такое Raw Offset и как они связаны между собой.
 


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