Сейчас на форуме: Adler, asfa, bartolomeo (+9 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Реверсинг программы, управляющей включением WI-Fi |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 01 октября 2012 10:24 · Личное сообщение · #1 Имеется ноутбук, RoverBook Voyager B514. В нем есть вай-фай, оный врубается кнопкой, расположенной отдельно. вторая кнопка управляет питанием процессора (включает выключает тротлинг). Для того чтоб эти кнопки работали есть утилита Power manager and wireless lan RF OnOff. Грубо говоря утилитка управляет известной в мире Линух штукой под названием RF_Kill (аппаратно включает выключает вай фай). Вот уже 5 ый год, как я не могу победить этот RF_kill под Линуксом. Пытался выйти на авторов утилиты дабы исходники дали или портировали на Линух - почили авторы видать уже. Вот и пришла мне в голову идея провести реверсинг этой утилиты, с целью узнать каким макаром включается вай-фай. А потом под линух свою утилитку забацать. Что выяснил? Дизассемблер Qllydbg. Программа написана на Visual C++, для определения нажатия кнопки включения используется хук. Скан-код нужной кнопки 0x6D. У меня дальше затык. Что дальше искать? Какие-то специфические API функции? На аппаратном уровне как работает RF_kill не представляю. То ли это это отдельный ключ в шине питания адаптера на материнке, то ли это фишка самого адаптера (intel 2200bg). В программном представлении это должно быть как запись определенного значения по какому то адресу. Хе-хе это то и ежу понятно. Так вот я и хочу выцепить эту запись определенного значения по какому то адресу. Путешествия по F7 пока ничего не дали, стараюсь смотреть повнимательнее. Да и еще иметтся библиотека для этой проги. Назначение ее пока не выяснил. Опыта маловато. ![]() ![]() |
|
Создано: 07 октября 2012 14:54 · Личное сообщение · #2 На вкл и выкл там по нескольку посылок. Я так понимаю там сначала посылается код операции, ждет ответного сигнала, потом посылается состояние. И опять же с синхронизацией. Вместо того чтоб мозги е..ть посмотрите уже сорс от hexrays указанных мной функций. Там буквально нужно определить назначение нескольких переменных и все, остальной код можно один в один передирать ![]() |
|
Создано: 07 октября 2012 14:55 · Личное сообщение · #3 |
|
Создано: 07 октября 2012 15:00 · Личное сообщение · #4 Code:
![]() |
|
Создано: 07 октября 2012 20:09 · Поправил: reversecode · Личное сообщение · #5 |
|
Создано: 08 октября 2012 00:33 · Личное сообщение · #6 вообщем не могу эту хрень молча читать uhuhuh reversecode тебе крутит голову работает твоя хрень следующим образом если прерывание он вообще отключается после передачи управления загрузчику значит твоему устройству выделен кусок памяти где то вверху например обычная сетевая карта реалтек 810 серии память FDDFE000 по FDDFE0FF - это стек этой карты отмапленый в верхнюю память IO - EC00h по ECFF - тоже самое только непосредственно на шине в принципе записывать туда под прыщами не сложнее чем в файл ну и прерывание для вызова всего этого у меня например это IRQ-20d (0x0014h) и если бы не ана..ные ограничения венды ты мог бы смело открыть эту память и записать туда всё что угодно точно так же и с твоим свистком где тебе раздобыть спецификацию на него я не знаю даже приблизительно а кнопка твоя для компьютера ни чем не оличается например от пробела или numlock а можешь замапить её на включение плеера и да reversecode имелся ввиду аппаратный IO в приведённом примере это контролер X-шины KBC ![]() |
|
Создано: 08 октября 2012 00:54 · Личное сообщение · #7 mdscorp что я кручу? может вы уже вместе сходите стяните книгу Архитектура PC и почитаете как устроен PCI и как это все мапится итд и где там начинает работать биос а где acpi ? мне лень в какие то споры вступать но в PM.exe есть доступ к PCI бас мастеру или арбитру для дальнейшего доступа к карточке итд Code:
регистры CFCh и CF8h вам что то говорят? а мне говорят. разбирать все я так же не хочу. я лиш помогаю. если человек не может само разобратся есть тема, "ищу специалиста" ![]() |
|
Создано: 08 октября 2012 19:51 · Личное сообщение · #8 Остыньте братья. Да, я в методах доступа к компутерному железу не шарю. Но я и не прошу все сделать за меня. Я параллельно читаю всяку информацию, способную мне помочь. Нет у меня времени, постоянно заниматься этим вопросом, по вечерам только, и то не кажый божий день. Но попрошу не удалять тему в виду моей кажущейся непроходимости, я не таков. просто тема для меня новая, а в драйверописательстве для винды вообще полный нуб. Но.... reverscode скорее всего прав. Обращение происходит по отмапленному драйвером winio.sys адресу, косвенно об этом говорят экпортируемые и импортируемые функции библиотеки winio.dll. Курю дальше..... ![]() |
|
Создано: 08 октября 2012 19:57 · Личное сообщение · #9 |
|
Создано: 08 октября 2012 20:47 · Личное сообщение · #10 |
|
Создано: 08 октября 2012 20:54 · Личное сообщение · #11 хОспади.... вам не нужно лезть ни в какие библиотеки, вам нужно всего навсего поставить бряки на Get/Set Port которые вызываются с библиотеки, нажать вкл и залогировать значения Get/Set и нажать выкл и залогировать какие значения и сколько пойдет для Get/Set и все причем если значения будут извлекатся из портов PCI то метод бряков не пройдет, потому что там есть время ожидания получения значения и контроль статусов, вы пока будете держать бряк, оно уйдет и в результате залогируете совершенно другие значения но для начала хоты бы получить предварительные залогирование значения, что бы оценить диапазон портов IO это по простому, по сложному пути это просто разобрать работу всего PM.exe ![]() |
|
Создано: 08 октября 2012 23:19 · Личное сообщение · #12 Code:
Обращаю внимание на PUSH 118E и PUSH 118F. Именно эти значения вызываются их стека и учавствуют в команде Code:
То бишь получается Code:
и Code:
Значится константа адрес порта. ![]() |
|
Создано: 08 октября 2012 23:34 · Поправил: reversecode · Личное сообщение · #13 Code:
uhuhuh пишет: Значится константа адрес порта. и да и нет, эта константа IO порт в отмапленой PCI WIFI карточке что бы на 100% убедится зайдите дебагером в Set/Get порт и посмотрите куда пойдет дальше в out/in или в DeviceIoControl если в отмапленое адресс пространство карточки значит в DeviceIoControl пойдет, тоесть в драйвер ![]() |
|
Создано: 08 октября 2012 23:39 · Личное сообщение · #14 Я вот не понимаю, к чему это гадание на кофейной гуще про адрес порта. Если я правильно понял то, что от вас хотел reversecode, то это всё примерно выглядит вот так. Делаете библиотеку для перехвата в вашем приложении через таблицу импорта двух функций GetPortVal/SetPortVal. Теперь, если я правильно понял ваш хексреевский листинг, то для char __stdcall SetPortVal(DWORD BytesReturned, int a2, char a3) на входе в функцию логгируем a2 и a3, на выходе - BytesReturned, реализацию GetPortVal не видел, но полагаю - догадаться там не сильно сложно. Потом sprintf юзаем для форматирования лога, и либо через OutputDebugString выводим, либо через лог-файл (прямо в файл какой-то пишем). Так несколько раз - полученный резульата сравниваем, если вызовы одинаковые, пишем свои аналоги по образу и подобию реевских листингов (с поправками на линукс) и воспроизводим лог вызовов (последовательность и параметры). А потом уже можно о чём-то говорить. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 08 октября 2012 23:50 · Поправил: ajax · Личное сообщение · #15 |
|
Создано: 08 октября 2012 23:59 · Личное сообщение · #16 Code:
По вызову CALL ESI попадаем на вот этот участок, где и происходит включение вафли. (Парой постов выше я показал участок кода считывающий с порта, ну не суть, тама почти одинаково.) Code:
OUT 0x118Fh, 0x0080h ![]() |
|
Создано: 09 октября 2012 00:03 · Личное сообщение · #17 |
|
Создано: 09 октября 2012 00:15 · Поправил: reversecode · Личное сообщение · #18 |
|
Создано: 09 октября 2012 02:13 · Поправил: Модератор · Личное сообщение · #19 |
|
Создано: 10 октября 2012 00:24 · Поправил: uhuhuh · Личное сообщение · #20 В общем результат таков. Собрал пока отдельный исполняемый файл на включение вафли и отдельный исполняемый файл на выключение. Осталось прикрутить их к кнопке и добавить статус состояния вафли. Но это уже мелочи. На идею меня натолкнула вот эти статейки : Первую ссылку подсказал mdscorp. за что ему спасибо ![]() reversecode отдельное спасибо за терпение, в конце концов мы с вами к истине пришли. ![]() Ну а дальше разбираться в Виндовской утилите не вижу смысла. Усе почти понятно ![]() Вот для примера линуксовый исполняемый файл включающий вафлю и светодиод. Code:
кстати, эти порты действительно зарезервированы. Вот что говорит dmesg: 0.059580] system 00:05: ioport range 0x1180-0x11bf has been reserved ![]() |
<< . 1 . 2 . |
![]() |
eXeL@B —› Вопросы новичков —› Реверсинг программы, управляющей включением WI-Fi |