Сейчас на форуме: Adler, asfa, bartolomeo (+9 невидимых)

 eXeL@B —› Вопросы новичков —› Реверсинг программы, управляющей включением WI-Fi
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 01 октября 2012 10:24
· Личное сообщение · #1

Имеется ноутбук, RoverBook Voyager B514. В нем есть вай-фай, оный врубается кнопкой, расположенной отдельно. вторая кнопка управляет питанием процессора (включает выключает тротлинг). Для того чтоб эти кнопки работали есть утилита Power manager and wireless lan RF OnOff. --> Link <--
Грубо говоря утилитка управляет известной в мире Линух штукой под названием RF_Kill (аппаратно включает выключает вай фай). Вот уже 5 ый год, как я не могу победить этот RF_kill под Линуксом. Пытался выйти на авторов утилиты дабы исходники дали или портировали на Линух - почили авторы видать уже.
Вот и пришла мне в голову идея провести реверсинг этой утилиты, с целью узнать каким макаром включается вай-фай. А потом под линух свою утилитку забацать.
Что выяснил?
Дизассемблер Qllydbg.
Программа написана на Visual C++, для определения нажатия кнопки включения используется хук. Скан-код нужной кнопки 0x6D.
У меня дальше затык.
Что дальше искать? Какие-то специфические API функции?
На аппаратном уровне как работает RF_kill не представляю. То ли это это отдельный ключ в шине питания адаптера на материнке, то ли это фишка самого адаптера (intel 2200bg). В программном представлении это должно быть как запись определенного значения по какому то адресу. Хе-хе это то и ежу понятно.
Так вот я и хочу выцепить эту запись определенного значения по какому то адресу.
Путешествия по F7 пока ничего не дали, стараюсь смотреть повнимательнее.
Да и еще иметтся библиотека для этой проги. Назначение ее пока не выяснил. Опыта маловато.

336f_01.10.2012_EXELAB.rU.tgz - PM.exe



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 07 октября 2012 14:54
· Личное сообщение · #2

На вкл и выкл там по нескольку посылок. Я так понимаю там сначала посылается код операции, ждет ответного сигнала, потом посылается состояние. И опять же с синхронизацией. Вместо того чтоб мозги е..ть посмотрите уже сорс от hexrays указанных мной функций. Там буквально нужно определить назначение нескольких переменных и все, остальной код можно один в один передирать



Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 07 октября 2012 14:55
· Личное сообщение · #3

В биосе есть управление вай-фаем. То бишь разрешить-запретить.
И насколько я вижу из того, что перед глазами PCI-ем тут и не пахнет.



Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 07 октября 2012 15:00
· Личное сообщение · #4

Code:
  1. char __stdcall SetPortVal(DWORD BytesReturned, int a2, char a3)
  2. {
  3.   char result; // al@2
  4.   __int16 InBuffer; // [sp+0h] [bp-8h]@11
  5.   int v11; // [sp+2h] [bp-6h]@11
  6.   char v12; // [sp+6h] [bp-2h]@11
  7.  
  8.   if ( !byte_10009B8C )
  9.          return 0;
  10.   if ( byte_10009A80 )
  11.   {
  12.          if ( (unsigned __int8)a3 == 1 )
  13.          {
  14.            _DX = BytesReturned;
  15.            _AL = a2;
  16.            __asm { out     dx, al }
  17.          }
  18.     else
  19.     {
  20.            if ( (unsigned __int8)a3 == 2 )
  21.       {
  22.                  _DX = BytesReturned;
  23.         _AX = a2;
  24.                  __asm { out     dx, ax }
  25.         return 1;
  26.            }
  27.       if ( (unsigned __int8)a3 == 4 )
  28.       {
  29.                  _DX = BytesReturned;
  30.                  _EAX = a2;
  31.                  __asm { out     dx, eax }
  32.                  return 1;
  33.       }
  34.          }
  35.          result = 1;
  36.   }
  37.   else
  38.   {
  39.          v12 = a3;
  40.          v11 = a2;
  41.          InBuffer = BytesReturned;
  42.          result = DeviceIoControl(hDevice, 0x220007u, &InBuffer, 7u, 0, 0, &BytesReturned, 0) != 0;
  43.   }
  44.   return result;
  45. }





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 октября 2012 20:09 · Поправил: reversecode
· Личное сообщение · #5

вам нужна не реализация set/get port а значения которые в них заганяются при вкл/выкл

uhuhuh пишет:
насколько я вижу из того, что перед глазами PCI-ем тут и не пахнет.

у вас нулевое представление о том как работает PCI,
я например вижу работу программы PM.exe с PCI



Ранг: 47.6 (посетитель), 15thx
Активность: 0.030.02
Статус: Участник

Создано: 08 октября 2012 00:33
· Личное сообщение · #6

вообщем не могу эту хрень молча читать

uhuhuh reversecode тебе крутит голову
работает твоя хрень следующим образом
если прерывание IRQ твоего вайфая больше 16 а оно по любому больше то используется apic и биос тут повлиять ни как не может
он вообще отключается после передачи управления загрузчику

значит твоему устройству выделен кусок памяти где то вверху
например обычная сетевая карта реалтек 810 серии

память FDDFE000 по FDDFE0FF - это стек этой карты отмапленый в верхнюю память
IO - EC00h по ECFF - тоже самое только непосредственно на шине
в принципе записывать туда под прыщами не сложнее чем в файл -->тыц <--
ну и прерывание для вызова всего этого у меня например это IRQ-20d (0x0014h)

и если бы не ана..ные ограничения венды ты мог бы смело открыть эту память и записать туда всё что угодно
точно так же и с твоим свистком
где тебе раздобыть спецификацию на него я не знаю даже приблизительно
а кнопка твоя для компьютера ни чем не оличается например от пробела или numlock а
можешь замапить её на включение плеера


и да reversecode имелся ввиду аппаратный IO в приведённом примере это контролер X-шины KBC




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 08 октября 2012 00:54
· Личное сообщение · #7

mdscorp что я кручу?
может вы уже вместе сходите стяните книгу Архитектура PC и почитаете как устроен PCI и как это все мапится итд и где там начинает работать биос а где acpi
?

мне лень в какие то споры вступать
но в PM.exe
есть доступ к PCI бас мастеру или арбитру для дальнейшего доступа к карточке итд
Code:
  1. .text:004019D0 sub_4019D0      proc near               ; CODE XREF: _READ_DEV_ID_sub_402220+5Fp
  2. .text:004019D0
  3. .text:004019D0 var_4           = dword ptr -4
  4. .text:004019D0 arg_0           = dword ptr  4
  5. .text:004019D0 arg_4           = byte ptr  8
  6. .text:004019D0
  7. .text:004019D0                 push    ecx
  8. .text:004019D1                 mov     eax, [esp+4+arg_0]
  9. .text:004019D5                 push    4
  10. .text:004019D7                 add     eax, 2Ch
  11. .text:004019DA                 mov     [esp+8+var_4], 0
  12. .text:004019E2                 push    eax
  13. .text:004019E3                 push    0CF8h
  14. .text:004019E8                 call    ds:SetPortVal
  15. .text:004019EE                 lea     ecx, [esp-8+arg_4]
  16. .text:004019F2                 push    4
  17. .text:004019F4                 push    ecx
  18. .text:004019F5                 push    0CFCh
  19. .text:004019FA                 call    ds:GetPortVal
  20. .text:00401A00                 mov     eax, [esp+4+var_4]
  21. .text:00401A04                 pop     ecx
  22. .text:00401A05                 retn
  23. .text:00401A05 sub_4019D0      endp

регистры CFCh и CF8h вам что то говорят? а мне говорят.

разбирать все я так же не хочу. я лиш помогаю.

если человек не может само разобратся есть тема, "ищу специалиста"

| Сообщение посчитали полезным: ClockMan, =TS=

Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 08 октября 2012 19:51
· Личное сообщение · #8

Остыньте братья.
Да, я в методах доступа к компутерному железу не шарю. Но я и не прошу все сделать за меня. Я параллельно читаю всяку информацию, способную мне помочь. Нет у меня времени, постоянно заниматься этим вопросом, по вечерам только, и то не кажый божий день. Но попрошу не удалять тему в виду моей кажущейся непроходимости, я не таков. просто тема для меня новая, а в драйверописательстве для винды вообще полный нуб.
Но....
reverscode скорее всего прав. Обращение происходит по отмапленному драйвером winio.sys адресу, косвенно об этом говорят экпортируемые и импортируемые функции библиотеки winio.dll.
Курю дальше.....



Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 08 октября 2012 19:57
· Личное сообщение · #9

про CFCh и CF8h почитал, действительно PCI-ем запахло



Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 08 октября 2012 20:47
· Личное сообщение · #10

Но.... этим PCI пахнет только при запуске утилиты. И запись и чтение по PCI только при запуске программы.
Включение- выключение вафли осуществляется в библиотеке. .




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 08 октября 2012 20:54
· Личное сообщение · #11

хОспади.... вам не нужно лезть ни в какие библиотеки,
вам нужно всего навсего поставить бряки на Get/Set Port которые вызываются с библиотеки,
нажать вкл и залогировать значения Get/Set
и нажать выкл и залогировать какие значения и сколько пойдет для Get/Set
и все

причем если значения будут извлекатся из портов PCI то метод бряков не пройдет, потому что там есть время ожидания получения значения и контроль статусов, вы пока будете держать бряк, оно уйдет и в результате залогируете совершенно другие значения

но для начала хоты бы получить предварительные залогирование значения,
что бы оценить диапазон портов IO

это по простому,
по сложному пути это просто разобрать работу всего PM.exe



Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 08 октября 2012 23:19
· Личное сообщение · #12

Code:
  1. 00401C57  |. 8B3D 0C944100  MOV EDI,DWORD PTR DS:[<&WINIO.GetPortVal>]      ; WINIO.GetPortVal
  2. 00401C5D  |. 8D4424 10      LEA EAX,DWORD PTR SS:[ESP+10]
  3. 00401C61  |. 6A 01          PUSH 1
  4. 00401C63  |. 50             PUSH EAX
  5. 00401C64  |. 68 8F110000    PUSH 118F
  6. 00401C69  |. 8935 FC2B4200  MOV DWORD PTR DS:[422BFC],ESI
  7. 00401C6F  |. C74424 1C 0000>MOV DWORD PTR SS:[ESP+1C],0
  8. 00401C77  |. C74424 14 0000>MOV DWORD PTR SS:[ESP+14],0
  9. 00401C7F  |. FFD7           CALL EDI                                        ; <&WINIO.GetPortVal>
  10. 00401C81  |. 8D4C24 08      LEA ECX,DWORD PTR SS:[ESP+8]
  11. 00401C85  |. 6A 01          PUSH 1
  12. 00401C87  |. 51             PUSH ECX
  13. 00401C88  |. 68 8E110000    PUSH 118E
  14. 00401C8D  |. FFD7           CALL EDI


Обращаю внимание на PUSH 118E и PUSH 118F.
Именно эти значения вызываются их стека и учавствуют в команде

Code:
  1. OUT DX,AL


То бишь получается

Code:
  1. OUT 0x118E, AL

и
Code:
  1. OUT 0x118F, AL


Значится константа адрес порта.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 08 октября 2012 23:34 · Поправил: reversecode
· Личное сообщение · #13

Code:
  1. void __cdecl ON_OFF_sub_401C50(int ONa1)
  2. {
  3.   int ONv1; // esi@1
  4.   int v2; // edx@1
  5.   int v3; // eax@2
  6.   int v4; // ST24_4@3
  7.   int a2; // [sp+30h] [bp+8h]@0
  8.   int a4; // [sp+38h] [bp+10h]@0
  9.  
  10.   ONv1 = ONa1;
  11.   WIFI_state__dword_422BFC = ONa1;
  12.   ONa1 = 0;
  13.   GetPortVal(0x118Fu, &ONa1, 1);
  14.   GetPortVal(0x118Eu, &a2, 1);
  15.   v2 = a4 & 0xFD;
  16.   a4 &= 0xFDu;
  17.   a2 &= 0x7Fu;
  18.   if ( ONv1 )
  19.   {
  20.     v3 = a2;
  21.     LOBYTE(v3) = a2 | 0x80;
  22.     a4 = v2 | 2;
  23.     a2 = v3;
  24.   }
  25.   SetPortVal(0x118Fu, a4, 1);
  26.   SetPortVal(0x118Eu, v4, 1);
  27. }


uhuhuh пишет:
Значится константа адрес порта.

и да и нет, эта константа IO порт в отмапленой PCI WIFI карточке

что бы на 100% убедится зайдите дебагером в Set/Get порт и посмотрите куда пойдет дальше в out/in или в DeviceIoControl

если в отмапленое адресс пространство карточки значит в DeviceIoControl пойдет, тоесть в драйвер




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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.





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 08 октября 2012 23:50 · Поправил: ajax
· Личное сообщение · #15

ARCHANGEL пишет:
OutputDebugString

часто не гут, гадит регистры. надо не забывать сэйвить/ресторить. все остальное - согласен

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 08 октября 2012 23:59
· Личное сообщение · #16

Code:
  1. 00401CC9  |. 6A 01          PUSH 1
  2. 00401CCB  |. 52             PUSH EDX
  3. 00401CCC  |. 68 8F110000    PUSH 118F
  4. 00401CD1  |. FFD6           CALL ESI                                        ; <&WINIO.SetPortVal>


По вызову CALL ESI попадаем на вот этот участок, где и происходит включение вафли. (Парой постов выше я показал участок кода считывающий с порта, ну не суть, тама почти одинаково.)

Code:
  1. 100014E7   > 66:8B5424 0C   MOV DX,WORD PTR SS:[ESP+C]                      ; Case 1 of switch 100014B6
  2. 100014EC   . 8A4424 10      MOV AL,BYTE PTR SS:[ESP+10]
  3. 100014F0   . EE             <b>OUT DX, AL</b>                                       ; I/O command
  4. 100014F1   > B0 01          MOV AL,1                                        ; Default case of switch 100014B6
  5. 100014F3   . 83C4 08        ADD ESP,8
  6. 100014F6   . C2 0C00        RETN 0C


OUT 0x118Fh, 0x0080h



Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 09 октября 2012 00:03
· Личное сообщение · #17

В DeviceIoControl не заходит.
Значится, как я понимаю прямая пальба в порт??? С известным смещением в диапазоне выделенных адресов??




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 09 октября 2012 00:15 · Поправил: reversecode
· Личное сообщение · #18

значит скорее всего биосовские порты, я бы даже сказал зарезервированы системой именно для вашего бука, а не для wifi

а поклацайте в винде и поищите кто за собой держит это IO?



Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 09 октября 2012 02:13 · Поправил: Модератор
· Личное сообщение · #19

Хе-хе-хе...
Я спать...
О результатах доложусь завтра
В Линухе таки зажег светодиод
Все оказалось проще....
Хехе... И даже вафлю включил под линухом)))))
Завтра отпишусь
От модератора: не умеешь правкой пользоваться, обязательно чат устроить, что ты включил под линухом? ну давай я за тебя поправлю



Ранг: 0.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 10 октября 2012 00:24 · Поправил: uhuhuh
· Личное сообщение · #20

В общем результат таков. Собрал пока отдельный исполняемый файл на включение вафли и отдельный исполняемый файл на выключение. Осталось прикрутить их к кнопке и добавить статус состояния вафли. Но это уже мелочи. На идею меня натолкнула вот эти статейки : --> Тут<-- и --> Тут <--.

Первую ссылку подсказал mdscorp. за что ему спасибо
reversecode отдельное спасибо за терпение, в конце концов мы с вами к истине пришли.
Ну а дальше разбираться в Виндовской утилите не вижу смысла. Усе почти понятно А чего непонятно, значит и не надо. (не время ишо).

Вот для примера линуксовый исполняемый файл включающий вафлю и светодиод.

Code:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/io.h>
  4. #include <stdlib.h>
  5.  
  6. #define LEDPORT 0x118E /* Порт светодиода */ 
  7. #define WIFIPORT 0x118F /* Порт rf_Kill вафли*/
  8.  
  9. void main()
  10. {
  11.   /* Получаем доступ к порту */
  12.   if (ioperm(LEDPORT, 3, 1))
  13.     {
  14.       perror("ioperm");
  15.       exit(1);
  16.     }
  17.   
  18.   /* Зажигаем лампочку вафли */
  19.   outb(0x80, LEDPORT);
  20.   
  21.     /* Закрываем порт*/
  22.   if (ioperm(LEDPORT, 3, 0)) 
  23.     {
  24.       perror("ioperm");
  25.       exit(1);
  26.     }
  27.     
  28. usleep(100000);
  29.  
  30.   /* Получаем доступ к порту */
  31.   if (ioperm(WIFIPORT, 3, 1))
  32.     {
  33.       perror("ioperm");
  34.       //exit(1);
  35.     }
  36.   
  37.   /* Включаем вафлю (отключаем rf_kill) */
  38.   outb(0x12, WIFIPORT);
  39.   
  40.     /* Закрываем порт */
  41.   if (ioperm(WIFIPORT, 3, 0)) 
  42.     {
  43.       perror("ioperm");
  44.       exit(1);
  45.     }
  46.  
  47.  exit(0);
  48. }


кстати, эти порты действительно зарезервированы. Вот что говорит dmesg:
0.059580] system 00:05: ioport range 0x1180-0x11bf has been reserved


<< . 1 . 2 .
 eXeL@B —› Вопросы новичков —› Реверсинг программы, управляющей включением WI-Fi
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати