как вставить адрес строки в стек со сборкой, машинный код - PullRequest
2 голосов
/ 02 января 2011

Я изменяю minesweeper.exe, чтобы понять, как работает внедрение кода.Я просто хочу, чтобы тральщик показывал окно сообщения перед запуском.Итак, я нахожу «пещеру» в исполняемом файле, а затем определяю строку для отображения в окне сообщений и вызываю окно сообщений.Кроме того, конечно, я должен изменить значение в точке входа модуля исполняемого файла и сначала направить его в мой дополнительный код, а затем продолжить свой собственный код.Итак, в пещере, что я делаю;

"hello starbuck",0

push 0 //arg4 of MessageBoxW function
push the address of my string //arg3, must be title
push the address of my string //arg2, must be the message
push 0  //arg1
call MessageBoxW
...

Теперь, так как адреса памяти кодов в исполняемом файле меняются каждый раз, когда он загружается в память, для вызова функции MessageBoxW я даю смещение адреса, гдеMessageBoxW определяется в таблице адресов импорта.Например, если MessageBoxW определено в address1 в IAT, а инструкция сразу после call MessageBoxW находится в address2 вместо записи call MessageBoxW, я пишу call address2 - address1.

Итак, мой вопрос, как мне сделать это для отправки адреса строки в стек?Например, если я делаю эти изменения через ollydbg, я даю немедленный адрес «привет старбак» для нажатия, и это работает.Но после перезагрузки исполняемого файла или его запуска вне ollydbg он, естественно, завершается сбоем, поскольку немедленные адреса меняются.

Заранее спасибо, Yigit.

Редактировать: Теперь эта проблема возникает из-заСлово о точке входа модуля изменяется каждый раз, когда исполняемый файл открывается.Итак, чтобы увидеть, как другие строки помещаются в стеки, я сделал это:

Я нашел строку «Destroy Canvas» в коде.Это по адресу: 00403E44.А по адресу 0042878E есть инструкция PUSH 00403E44 (68 44 3E 40 00), которая означает, что указатель на строку помещается в стек.Затем я открыл exe в UltraEdit, нашел соответствующий адрес, который является 00027D8E.Там вместо «68 44 3E 40 00» написано «68 44 3E 00 01».Теперь это означает, что когда OllyDbg загружает исполняемый файл, он обновляет эти коды;00 01 до 40 00. Я посмотрел на другие строки, и их инструкции толчка также.Поэтому я подумал, может быть, если я напишу «68 DA 9A 00 01» вместо «68 DA 9A 40 00» в UltraEdit, чтобы подтолкнуть строку, она тоже будет обновлена.Но это не так.Когда после этого я открываю exe в OllyDbg, адрес, который нужно отправить, остается «01009ADA».

Так что я думаю, что должно быть что-то, что организует эти процедуры «обновления кода».Может быть, это как-то связано с таблицами перестановок, я не знаю.

Не могли бы вы подумать, что, может быть, мне следует задать этот вопрос как еще один вопрос?

Ответы [ 3 ]

0 голосов
/ 02 января 2011

Ваше решение:

Строка, которую вы добавляете, должна быть UTF-16.

Для строки «Hello» вы должны написать «Hello», точка - 00h.Убедитесь, что в конце этой строки есть как минимум 00h00h00h (3 X 0). Также убедитесь, что при вызове msgbox вы вызываете его с помощью dword ptr [] CALL DWORD PTR DS: [10010B8]

Inдетали:

В конце программы, рядом со строкой LoadLibrary (которая не является Unicode), добавьте свою строку в UTF-16, то есть каждый символ ASCII, разделенный 00h, и с завершением строки Unicode не менее 00h00h (00hобозначается точкой в ​​окне дампа ollydbg)

В точке входа в программу вы, вероятно, имеете это:

01003E21 PUSH 70
01003E23 PUSH winmine_.01001390
01003E28 CALL winmine_.0100400C

Замените его на JMP 01004A5F, дважды щелкнув на PUSH70 строка: (не пишите "winmine _.")

01003E21 JMP winmine_.01004A5F
01003E26 NOP
01003E27 NOP
01003E28 CALL winmine_.0100400C

На 01004A5F вы вводите свой код:

01004A5F PUSH 0
01004A61 PUSH winmine_.01004A5F
01004A66 PUSH winmine_.01004A5F
01004A6B PUSH 0
01004A6D CALL DWORD PTR[010010B8] ;msgbox

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

01004A72 PUSH 70
01004A74 PUSH winmine_.01001390
01004A79 JMP winmine_.01003E28

Чтобы найти адрес MessageBoxW, нажмите CTRL + N, и вы получите упорядоченный список зарегистрированных функций.

КакВ строке это выглядит так:

01004A58 UNICODE "Hello",0

Наслаждайтесь.

Исходное сообщение: Когда вы вставили свою строку в исполняемый файл, в OllyDbg попробуйте щелкнуть правой кнопкой мыши по разборкеОкно и поиск-> вся строка справочного текста.Там вы сможете найти свою строку и ее адрес.

Вот 2 статьи, которые вы должны внимательно прочитать:

http://osix.net/modules/article/?id=633

В части 2 этой статьи этообъясняется, как вы можете заменить существующую (неиспользуемую) строку в exe собственным сообщением и как вызвать ее с помощью пользовательской функции.

http://osix.net/modules/article/?id=758

Во второй части этой статьиэто объяснение о текстовом разделе и строках и о том, как на них ссылаться.

Это должно дать вам много информации, чтобы начать работу с приложением Windows.

В качестве дополнительного руководства по обращению игр Windows.: http://osix.net/modules/article/?id=723 (свободная ячейка)

0 голосов
/ 02 января 2011

Я думаю, что вам нужно сначала отправить адрес в AX, а затем нажать топор

mov ax,OFFSET string1  ;or use LEA ax,string1
push ax

, поэтому для создания вашего MessageBox вам нужно сделать:

mov ax,16            ;16 = Critical Icon (for example)
push ax
lea dx,title
push dx
lea dx,text
push dx
mov ax,0              ;0 is like NULL for the window's handle
push ax
call MesssageBox...
0 голосов
/ 02 января 2011

Смещение строки не должно меняться, если оно встроено в EXE.Это загружается как ресурс или динамически распределяется или как?Если один из последних, то вам нужно нажать на адрес, созданный динамически.Но статическая строка всегда должна загружаться с одним и тем же адресом смещения.

...