На сей раз нам дана программа testprg,
представляющая из себя форму с неактивными
кнопками и строкой меню.

Наша задача сделать следующие:

  • сделать кнопки активными
  • сменить заголовок главного окна на "TestPrg"
  • добавить действие кнопке "exit", а
    именно выход

  • добавить действие кнопке "option 1",
    при нажатии на кнопке должно появиться
    сообщение "The function works perfectly!" с
    заголовком "Option 1"

  • добавить действие меню "exit",
    аналогичное одноименной кнопке

  • добавить действие меню "option 1",
    аналогичное одноименной кнопке

  • добавить действие меню "option 2", при
    ее нажатии кнопка "Exit" должна стать
    невидимой, при повторном нажатии
    появиться

Инструменты которые мы будем
использовать:

  • Hiew
  • дизассемблер, я использую IDA
  • любой шестнадцатиричный редактор, я
    использую WinHex

Приступим. Для начала сделаем самое
простое, поменяем заголовок программы с "Captionqq"
на "TestPrg", для этого запустим
шестнадцатиричный редактор, откроем в нем
наш файл "testprg.exe" и воспользуемся
поиском, чтобы быстро найти заголовок.
Включаем поиск по байтам и вводим
"43006100700074", это первые байты заголовка
"Captionqq" 43 — код символа "C", 61 — "a",
70 — "p", 74 — "t", их должен разделять
байт 00, так хранятся ресурсы. Нашли это
сочетание по адресу "00001004", теперь
заменим байты начиная с 43 — код символа "C",
на  540065007300740050007200670020002000, байты нового
заголовка "TestPrg".

Изменили, теперь сохраняем сделанные
изменения. Запускаем, работает — заголовок
тот, что нам нужен. Первую задачу выполнили.
Идем дальше.

Сделаем кнопки на форме активными. Для
этого нам необходимо изменить их свойства в
ресурсах. Снова запустим hex редактор,
откроем в нем наш файл, зададим поиск по
названию кнопок 4f007000740069, первые символы
названия кнопки "Option 1". Нашли.

00001008 73 00 74 00 50 00 72 00 67 00 20 00 s.t.P.r.g. . 
00001014 20 00 00 00 00 00 01 58 00 00 00 00 ……X…. ;
00000158 — нужный нам dword, свойства кнопки
00001020 04 00 0D 00 22 00 0C 00 B8 0B FF FF ….»…ё.яя 
0000102С 80 00 4F 00 70 00 74 00 69 00 6F 00 Ђ.O.p.t.i.o. ;
название кнопки
00001038 6E 00 20 00 31 00 00 00 00 00 00 00 n. .1……. 
00001044 00 00 01 50 00 00 00 00 2A 00 0D 00 …P….*… 
00001050 24 00 0C 00 B9 0B FF FF 80 00 45 $…№.яяЂ.E

Теперь заменим dword с 00000158 на 00000150 (без стиля
WS_DISABLED), таким образом получим:

00001008 73 00 74 00 50 00 72 00 67 00 20 00
s.t.P.r.g. . 
00001014 20 00 00 00 00 00 01 50 00 00 00 00 ……P…. 
00001020 04 00 0D 00 22 00 0C 00 B8 0B FF FF …."…ё.яя 

Тоже самое сделаем со второй кнопкой, "Exit":

00001044 00 00 01 58 00 00 00 00 2A 00 0D 00 …X….*…
;
00000158 ее свойства
00001050 24 00 0C 00 B9 0B FF FF 80 00 45 00 $…№.яяЂ.E. ;
название
кнопки

0000105C 78 00 69 00 74 00 00 00 00 00 00 00 x.i.t…….
00001068 07 00 00 50 00 00 00 00 02 00 06 00 …P……..
00001074 50 00 15 00 00 00 FF FF 80 00 00 00 P…..яяЂ..
.

получим:

 …P….*… 
 $…№.яяЂ.E.
 x.i.t…….

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

Теперь добавим действие кнопке "Option 1". Как
мы помним из условия, при нажатии на кнопке
должно появиться сообщение  "The function work
perfectly!" с заголовком "Option 1". 
Сперва посмотрим в ресурсах ее ID:

00001014 20 00 00 00 00 00 01 58 00 00 00 00
……X….
00001020 04 00 0D 00 22 00 0C 00 B8 0B FF FF …."…ё.яя ;
0BB8
— ID кнопки "Option 1"

0000102C 80 00 4F 00 70 00 74 00 69 00 6F 00 Ђ.O.p.t.i.o.
00001038 6E 00 20 00 31 00 00 00 00 00 00 00 n. .1…….
00001044 00 00 01 58 00 00 00 00 2A 00 0D 00 …X….*…

Запустим IDA, дизассемблируем наш файл. Идем
по адресу 004010C6, этот участок кода проверяет
controls ID:

004010C6 loc_4010C6: ; CODE XREF:
sub_40102B+6Fj
004010C6 cmp ax, 7D01h
004010CA jnz short loc_4010CE
004010CC jmp short loc_401117
004010CE ; ———————
004010CE 
004010CE loc_4010CE: ; CODE XREF: sub_40102B+9Fj
004010CE cmp ax, 7D02h
004010D2 jnz short loc_401117
004010D4 noped ;
свободный
участок

004010D6 noped
004010D9 noped
004010DE jmp short loc_401117
004010E0 ; ———————
004010E0 
004010E0 loc_4010E0: ; CODE XREF: sub_40102B+69j
004010E0 mov edx, [ebp+arg_8]
004010E3 shr edx, 10h
004010E6 or dx, dx
004010E9 jnz short loc_40110C
004010EB cmp ax, 0BB8h ;
сравнение
— нажата ли кнопка "Option 1"

004010EF jnz short loc_401106 ;
если
нет прыгаем на 401106 и проверяет следующие ID

004010F1 noped ;
свободный
участок

004010F3 noped
004010F8 noped
004010FD noped
004010FF noped
00401104 jmp short loc_40110C
00401106 ; ———————
00401106 
00401106 loc_401106: ; CODE XREF: sub_40102B+C4j
00401106 cmp ax, 0BB9h
0040110A jnz short $+2
0040110C 
0040110C loc_40110C: ; CODE XREF: sub_40102B+BEj
0040110C ; sub_40102B+D9j
0040110C jmp short loc_401117
0040110E ; ———————
0040110E 
0040110E loc_40110E: ; CODE XREF: sub_40102B+5Cj
0040110E mov eax, 0
00401113 leave
00401114 retn 10h
00401117 ; ———————
00401117 loc_401117: ; CODE XREF: sub_40102B+31j
00401117 ; sub_40102B+50j …
00401117 mov eax, 1
0040111C leave
0040111D retn 10h

Смотрим по адресу 004010EB инструкцию
 
cmp ax, 0BB8h

это как раз идентификатор кнопки "Option
1", идет сравнение нажата ли кнопка "Option
1" и следующая инструкция

jnz short loc_401106

реагирует в зависимости от результата
проверки, если кнока "Option 1" нажата
продолжает путь и попадает на пустой
участок кода забитый nop’ами, иначе прыгаем
на 401106 и проверяет другие идентификаторы.

004010F1 noped
004010F3 noped
004010F8 noped
004010FD noped
004010FF noped

004010FF-004010F1=14 

В нашем распоряжении находятся 14 байт,
этого нам хватит. Т.о. если кнопка "Option
1" нажата мы продолжаем, где свободного
места достаточно для нашего кода. Запомним
адрес, куда мы будем дописывать свой код
004010F1. Делать мы это будем с помощью hiew,
запустим hiew откроем наш файл, теперь ищем
свободное место в файле для сообщения и
заголовка, я выбрал по адресу 402170, там много
свободного места. 

402170 — будем использовать для заголовка
сообщения
402180 — для самого сообщения

переключимся в режим дизассемблера (F4),
нажмем F5 и введем адрес который мы запомнили
.00401106, жмем F3 затем F2 и пишем наш код:

push 0 ; uType
push 402170;
заголовок,
должен быть "The function works perfectly!"

push 402180;
текст, должен
быть "Option 1"

push 0 ; hWnd
call 0000053E ;
вызов MessageBoxA

Что должно получиться:

004010E0 mov edx, [ebp+arg_8]
004010E3 shr edx, 10h
004010E6 or dx, dx
004010E9 jnz short loc_40110C
004010EB cmp ax, 0BB8h
004010EF jnz short loc_401106
004010F1 push 0 ; uType
004010F3 push offset unk_402170 ; lpCaption
004010F8 push offset unk_402180 ; lpText
004010FD push 0 ; hWnd
004010FF call MessageBoxA
00401104 jmp short loc_40110C
00401106 ; ———————
00401106 
00401106 loc_401106: ; CODE XREF: sub_40102B+C4j
00401106 cmp ax, 0BB9h
0040110A jnz short $+2

Сохраняем F9 и выходим из hiew. Теперь нам
нужно записать само сообщение и заголовок
по выбранному нами смещению, как мы помним:

402170 — будем использовать для заголовка
сообщения
402180 — для самого сообщения

Загрузим WinHex, откроем наш файл. По адресу
402170 (770 для WinHex), запишем: "Option 1",  а по
адресу 402180 (780 для WinHex): "The function works perfectly!"

Теперь этот участок будет выглядеть так:

0000075C 00 00 00 00 00 00 00 00 00 00 00 00
…………
00000768 00 00 00 00 00 00 00 00 4F 70 74 69 ……..Opti
00000774 6F 6E 31 20 00 00 00 00 00 00 00 00 on1 ……..
00000780 54 68 65 20 66 75 6E 63 74 69 6F 6E The function
0000078C 20 77 6F 72 6B 73 20 70 65 72 66 65 works perfe
00000798 63 74 6C 79 21 00 00 00 00 00 00 00 ctly!…….
000007A4 00 00 00 00 00 00 00 00 00 00 00 00 …………

Сохраняем. Запускаем наш файл, пробуем
нажать "Option 1", появляется нужное нам
сообщение, с нужным заголовком, все верно.
Еще одно задание мы выполнили.

Теперь сделаем рабочей меню "Exit".

Также посмотрим в ресурсах ее ID:

00000FCC 32 00 20 00 2E 00 2E 00 2E 00 00 00 2.
………
00000FD8 00 08 00 00 00 00 80 00 02 7D 45 00 ……Ђ..}E. ; 7D02 — ID
строки меню "Exit"
00000FE4 78 00 69 00 74 00 00 00 80 08 CA 10 x.i.t…Ђ.К.
00000FF0 00 00 00 00 03 00 0A 00 0A 00 53 00 ……….S.
00000FFC 1C 00 FF FF BA 0B 00 00 54 00 65 ..яяє…T.e

Ее проверка находится по адресу 00401106:

004010CE 
004010CE loc_4010CE: ; CODE XREF: sub_40102B+9Fj
004010CE cmp ax, 7D02h ;
нажата ли
меню "Exit"

004010D2 jnz short loc_401117 ;
если
нажата остаемся, иначе прыгаем на 401117

004010D4 noped
004010D6 noped
004010D9 noped
004010DE jmp short loc_401117

004010DE-004010D4=10

Снова тут есть достаточно свободного места
для нашего кода. Запомним адрес, куда мы
будем дописывать свой код 004010D4. Запустим hiew,
откроем в нем наш файл, переключимся в режим
дизассемблера, перейдем по адресу .004010D4,
нажмем F3 затем F2 и введем следующие:

push 0
push [d],[ebp][08] ; handle
call 00000052C ;
вызов EndDialog

сохраняем F9 и выходим из hiew. Запускаем нашу
программу, из контекста меню выбираем "Exit"
и программа завершает работу. Теперь
сделаем рабочей кнопку "Exit" на форме.

Снова смотрим ее ID в ресурсах:

00001014 20 00 00 00 00 00 01 58 00 00 00 00 ……X….
00001020 04 00 0D 00 22 00 0C 00 B8 0B FF FF ….»…ё.яя ;
0BB8 — ID кнопки «Option 1»
0000102C 80 00 4F 00 70 00 74 00 69 00 6F 00 Ђ.O.p.t.i.o.
00001038 6E 00 20 00 31 00 00 00 00 00 00 00 n. .1…….
00001044 00 00 01 58 00 00 00 00 2A 00 0D 00 …X….*…

Ее проверка находится по адресу 00401106:

00401106 cmp ax, 0BB9h ; нажата
ли кнопка "Exit"

0040110A jnz short $+2
0040110C 
0040110C loc_40110C: ; CODE XREF: sub_40102B+BEj
0040110C ; sub_40102B+D9j
0040110C jmp short loc_401117

Места для нашего кода здесь нет, но нам оно и
не нужно, мы просто сделаем прыжок на наш
код который мы писали для меню "Exit", а
находится он, как мы помним, по адресу 004010D4,
именно туда мы и должны прыгнуть в случае
если кнопка "Exit" на форме нажата.

Для этого изменим инструкцию по адресу 0040110A 

jnz short $+2 на jz 4010D4

Запустим hiew, откроем наш файл, переключимся
в режим дизассемблера, пойдем по адресу 40110A,
нажмем F3, затем F2 и введем:

jz 000004D4

Сохраним F9 и выйдем из hiew.

Пробуем запустить, нажмем на кнопку "Exit"
и программа закроется.

Оставить мнение

Check Also

Скрытая сила пробела. Эксплуатируем критическую уязвимость в Apache Tomcat

В этой статье мы поговорим о баге в Apache Tomcat, популярнейшем веб-сервере для сайтов на…