0 / 0 / 0
Регистрация: 12.08.2019
Сообщений: 3
|
|||||||||||
1 | |||||||||||
Как управлять процессом компиляции и сборки драйвера12.08.2019, 13:56. Показов 1764. Ответов 5
Метки нет (Все метки)
Здравствуйте.
Некоторое время назад, появилось у меня желание заняться декомпиляцией одного драйвера. Зачем мне это нужно? - да из спортивного интереса, хочу понять как и что этот драйвер делает. Это занятие оказалось весьма увлекательным, декомпилированный исходник постепенно увеличивается, а код драйвера, получаемый при компиляции этого исходника, при определенных условиях, зачастую совпадает (или почти совпадает) с кодом исходного драйвера. Но, гладко получается не все, в связи с чем прошу у Вас помощи. Для начала о средствах разработки, посредством которых я работаю: - Windows Driver Kit (WDK 7600.16385.1); - Microsoft Visual Studio 2005; - Visual DDK, который производит некоторую интегрирацию WDK и VS. Вопрос первый. В коде исходного драйвера, точкой входа в драйвер является следующий код:
Когда я компилирую восстановленный мной исходник посредством только WDK (VS используется в качестве редактора текста исходника), точка входа в драйвер, так же имеет участок кода добавленный компилятором (правда выполняющий другие функции):
Ну и собственно сам вопрос, можно ли, при компиляции, как либо управлять кодом, который добавляется компилятором, или это не управляемый процесс, жестко зашитый в глубины компилятора? Вопрос второй. Связка VS и WDK (посредством Visual DDK) позволяет, при разработке драйвера, использовать компилятор VS и линкер WDK для создания файла драйвера. В таком варианте, с настройкой оптимизации компилятора для получения минимального размера конечного файла, мне удалось получить код, почти идентичный коду исходного драйвера (за исключением куска кода по которому задан первый вопрос, которого просто нет при компиляции средствами VS). И собственно вопрос, можно ли как либо произвести настройку оптимизации компилятора WDK?
0
|
12.08.2019, 13:56 | |
Ответы с готовыми решениями:
5
Как из .NET управлять другим процессом? Ошибка компиляции и сборки Нюансы ручной сборки, линковки и компиляции Roslyn, (статическая?) линковка сборки при компиляции |
Эксперт Hardware
|
||||||
13.08.2019, 06:34 | 2 | |||||
..не правильно вы полагаете.
это не компилятор вставляет, а разраб проверяет процессор на поддержку инструкции CPUID. Если она НЕ поддерживается - в строке(9) выходим из драйвера. Дальше со-строки(10) вызывается CPUID с EAX=1 или "Features". cmp eax,00000500h проверяет биты [11:8], а это семейство процессора "Family" (Intel/AMD etc). это пролог и эпилог функции, который добавляет компилятор, если функция имеет аргументы. Если аргументов нет, то эта батва не добавляется компилем. Добавлено через 11 минут кстати, в сишном хидере "ntstatus.h" перечисляются все коды-ошибок.. например в строке(19) первого листинга имеем mov eax,C0000001h и дальше ret открываем хидер и видим:
0
|
0 / 0 / 0
Регистрация: 12.08.2019
Сообщений: 3
|
|
13.08.2019, 13:18 [ТС] | 3 |
Согласен, моё предположение о том, что данный код вставлен компилятором, не верно. Да, это разработчик предусмотрел проверку того, на каком процессоре запускается драйвер, и если процессор не подходящий, то запуск драйвера прекращается.
Но... Если исходить из того, что код, добавленый используемым мной компилятором является прологом (и это только пролог, а ни как не ...пролог и эпилог функции так как переход непосредственно на саму функцию, которой является NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) , происходит в последней, 7-й строке данного кода jmp L00010BC0 ), то, код проверки процессора (код из первого листинга, из исходного драйвера), добавлен разработчиком как пролог к функции, причем к точно такой же функции NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) (которая к слову имеет аргументы), и переход на которую осуществляется почти в самом конце пролога (в строке 17 jmp L00016288 ), если процессор подходящий (следом за этим переходом, в конце этого кода, только выход из драйвера при неподходящем процессоре).И теперь переформулирую свой вопрос, как можно повлиять на пролог, который добавляется компилятором, мне нужно что бы перед вызовом функции вызывался пролог, который написал я сам, допустим проводящий проверку подходит ли данный процессор для этого драйвера? Это возможно?
0
|
Эксперт Hardware
|
|
13.08.2019, 15:39 | 4 |
с чего-бы это?
пролог - push ebp --> mov ebp,esp , а эпилог - pop ebp --> ret если учесть call в строке(5), то рано или поздно pop ebp получит управление. только не понятно, куда подевался тут ret .оформлять функцию в виде функции без параметров. если параметры всё-таки нужны, то засылать их в стек до вызова функции мне непонятно одно.. зачем вы ведёте борьбу за лишние 4-байта? ну есть этот пролог, да и пусть будет.. кому он мешает?
0
|
0 / 0 / 0
Регистрация: 12.08.2019
Сообщений: 3
|
||||||||||||||||
13.08.2019, 16:17 [ТС] | 5 | |||||||||||||||
Увы и ах,
ret в данном участке отсутствует. Вот он более полно:
call SUB_L00011105 вызывает следующую функцию (которую тоже писал не я, ее добавил компилятор):
jmp L00010BC0 идет переход на DriverEntry, которую писал я:
ret Мне это нужно, не для экономии нескольких байт, я хочу восстановить исходник и во всех подробностях понять как и что делает этот драйвер. Добавлено через 14 минут Смысл того что я делаю, сводится к тому, чтобы выставить настройки компиляции такими, какими они были у разработчика. Вероятно, со временем, я сам смогу найти ответы на свои вопросы, но с Вашей помощью, я надеюсь, эти ответы будет проще отыскать. P.S. На всякий случай, для данной функции я не в состоянии передать параметры, функция вызывается операционной системой при старте, при загрузке драйвера.
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
14.08.2019, 20:32 | 6 |
Косвенно можно влиять на этот процесс. Ну ты-же видишь, что первой-же проверкой после EntryPoint является проверка запущен ли декомпилированный драйвер на пне или не на пне. Если он запущен на компьютере с 386 или 486 процессором, то драйвер немедленно посылает операционку на буквы C0000001h. А в коде твоего варианта этой проверки нет. Ну так значит ты компилируешь свой код без указания целевого процессора, а разработчик указал компилятору целевой процессор 586.
Добавлено через 17 минут Тут такой компилятор Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.207 for 80x86 Что-то я не вижу в нем других опций кроме /arch:<SSE|SSE2> minimum CPU architecture requirements, one of: SSE - enable use of instructions available with SSE enabled CPUs SSE2 - enable use of instructions available with SSE2 enabled CPUs Наверно разработчик использовал VS. Укажи в настройках этой студии целовой процессор Пень = 586. Есть наверно у нее такие настройки. И посмотри появится ли у тебя эта преамбула с инструкцией cpuid при компиляции.
0
|
14.08.2019, 20:32 | |
14.08.2019, 20:32 | |
Помогаю со студенческими работами здесь
6
Ошибки при компиляции сборки декомпилированной DnSpy Изменить версию сборки при каждой компиляции Научите делать (интегрировать в PE и обычные сборки драйвера и программы) Какие есть сборки для установки без компиляции? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |