Сейчас на форуме: bartolomeo, -Sanchez- (+3 невидимых) |
eXeL@B —› Вопросы новичков —› Глобальный адрес |
Посл.ответ | Сообщение |
|
Создано: 04 марта 2006 13:00 · Личное сообщение · #1 А может и нет.... Привет ALL, тут такая проблемка, необходимо создать ну типа глобального адреса (переменной), на который бы я в одной процедуре складывал данные (type - string), а в другой мог бы считать эти данные от туда вот что я накидал (это соответственно для локальной переменной) sub esp, 50 ; резервируем в стеке 50 mov edi, esp ; делаем указание на вершину стека mov al,'a' ; загоняем в al символ "а" stos byte ptr es:[edi] ; три раза записываем в edi из al по аналогии s:=s+'a' stos byte ptr es:[edi] stos byte ptr es:[edi] mov eax, dword ptr ss:[esp] ; в eax содержимое esp 'aaa' call 00427364 ; TMessageForm._PROC_00427364() здесь выскакивает пустое сообщение, а надо с "ааа" add esp, 50 ; возвращаем стек в исходное состояние retn программа написана на Delphi 7 соответственно мной , ковыряю ее в OllyDbg кто чем может? Только с пояснениями в этом я новичек и могу тормозить |
|
Создано: 04 марта 2006 14:42 · Личное сообщение · #2 Здравствуйте Gydvin, вы писали: sub esp, 50 ; резервируем в стеке 50
Для корректной работы со стеком нехватает сохраненного значения esp, т.е.:
Это комментарий по фрагменту кода, этого кода мало для ответа на твой вопрос (ИМХО) |
|
Создано: 04 марта 2006 18:19 · Личное сообщение · #3 btCode спасибо что ответили первый вариант этого кода у меня как раз такой и был, но при выходе из процедуры у меня возникала ошибка "Ошибка записи по адресу 000000" вроде так, но это не суть, с этим разберусь. Код который я привел полный. Для правильной работы функции по адресу 00427364 необходимо через eax передать указатель на адрес на котором бы находилась фраза или какое либо слово созданное динамически. Вот примерно то чтоя хочу получить (DELPHI) var s:string; /////глобальная переменная procedure odin; begin s:=s+'a'; s:=s+'a'; s:=s+'a'; end; procedure dva; begin showmessage(s); end; процедуры вызываются последовательно. Мне же нужно создать вот эту самую S желательно с возможностью изменять размеры отведенного под нее места, хоть это и неважно потому что размер строки который туда будет записан известен зарание. Как это можно сделать? ЗЫ. Пытаюсь записать свой обработчик поверх уже существующего, но принципиально неважного по крайне мере для меня. |
|
Создано: 05 марта 2006 01:01 · Личное сообщение · #4 Вот код на асме, компилятор FASM--> flatassembler.net <-- http://flatassembler.net/ :
|
|
Создано: 05 марта 2006 11:34 · Личное сообщение · #5 [t]section 'code' code readable executable start_: invoke MessageBox,0,string,title,0 ;покажим исходную строку ..... section 'data' data readable writeable string db 0xF5,0xF3,0xE9 ;поле строки[/t Кстати спасибо за ссылку нечто подобное я искал Но у меня несколько иная задача, мне надо уже в готовом екзешнике выделить память под строку текста методами отладчика в частности OllyDbg. Целиком декомпилить его - это небыть хорошо, потом замучиешься его обратно собирать |
|
Создано: 05 марта 2006 13:35 · Личное сообщение · #6 Gydvin, может не совсем тебя понял, но для выделения памяти под строки делаю так(пример на том-же FASM`е): В переменной size - нужный размер invoke GlobalAlloc,GMEM_FIXED,[Size] invoke GlobalLock,eax; В eax получаем указатель на начало выделенной памяти В конце проги память освобождаем. В address - указатель на память invoke GlobalHandle,[Address] invoke GlobalFree,eax Прижелании легко переписывается в Olly |
|
Создано: 05 марта 2006 13:46 · Личное сообщение · #7 |
|
Создано: 05 марта 2006 14:26 · Личное сообщение · #8 |
|
Создано: 06 марта 2006 19:45 · Личное сообщение · #9 Здравствуйте, вот собственно, что у меня получилось, просьба к знающим людям посмотреть, насколько мой код глючный и какие ошибки я допустил 004F870C push ebp 004F870D mov ebp, esp 004F870F sub esp, 31 004F8712 mov dword ptr ss:[esp], 30 004F8719 mov dword ptr ss:[esp-4], 30 004F8721 mov edi, 00518540 ; указатель на адрес между секциями куда мы будем сохранять результат работы функции 004F8726 mov dword ptr ss:[esp-10], 00752058 ; указатель на первую ячейку двухмерного статистического массива (отсюда мы читаем значения) 004F872E mov esi, dword ptr ss:[esp-10] 004F8732 mov eax, dword ptr ds:[esi] 004F8734 test eax, eax 004F8736 je short 004F873A 004F8738 jmp short 004F8741 004F873A mov al, '0' 004F873C jmp short 004F8743 004F873E nop 004F873F nop 004F8740 nop 004F8741 mov al, '1' 004F8743 stos byte ptr es:[edi] 004F8744 mov eax, dword ptr ss:[esp] 004F8747 test eax, eax 004F8749 je short 004F875D 004F874B nop 004F874C nop 004F874D nop 004F874E nop 004F874F add esi, 4 004F8752 dec eax 004F8753 mov dword ptr ss:[esp], eax 004F8756 xor eax, eax 004F8758 jmp short 004F8732 004F875A nop 004F875B nop 004F875C nop 004F875D mov eax, dword ptr ss:[esp-4] 004F8761 test eax, eax 004F8763 je short 004F8787 004F8765 add dword ptr ss:[esp-10], 130 004F876D nop 004F876E nop 004F876F nop 004F8770 nop 004F8771 nop 004F8772 nop 004F8773 nop 004F8774 dec eax 004F8775 mov dword ptr ss:[esp-4], eax 004F8779 xor eax, eax 004F877B mov dword ptr ss:[esp], 30 004F8782 jmp short 004F872E 004F8784 nop 004F8785 nop 004F8786 nop 004F8787 mov esp, ebp 004F8789 pop ebp 004F878A retn ЗЫ. Еще такой вопрос. После выполнения означенной функции у нас по адресу 00518540 образовалась строка из 2401 символа, теперь как бы попроще сохранить это дело в текстовый файл при условии, что у нас есть путь (например С:\test.txt) прописаный по какому либо адресу. Желательно побитово, чтоб при записи я мог еще кое-что поменять. Чет поискал и ничего доходчивого не нашел. |
|
Создано: 06 марта 2006 23:24 · Личное сообщение · #10 Обрати внимание, что стек растет снизу вверх. Выделив место в стеке ты его не заюзал. Для корректной проверки значений из стека рекомендую предварительно отчищать выделенную область. Gydvin пишет: Желательно побитово Не путай термины. Gydvin пишет: 004F8753 mov dword ptr ss:[esp], eax Затреш нах. В eax не адрес. Пофиксь адреса на стек. В файл записать - через WriteFile и т.д., т.е. смотри WinAPI. |
|
Создано: 07 марта 2006 07:06 · Личное сообщение · #11 Обрати внимание, что стек растет снизу вверх. Выделив место в стеке ты его не заюзал. 004F872E mov esi, dword ptr ss:[esp-10] 004F8775 mov dword ptr ss:[esp-4] и т.д Затреш нах. тьфу понял, что я намутил, я распологаю данные ниже выделенной области ок, спасибо Для корректной проверки значений из стека рекомендую предварительно отчищать выделенную область. вычищать в цикле? |
|
Создано: 07 марта 2006 07:36 · Личное сообщение · #12 |
|
Создано: 07 марта 2006 13:02 · Личное сообщение · #13 Gydvin пишет: Пофиксь адреса на стек это как? Можно образец? ;) я имел ввиду правилное обращение к стеку, ну ты вроде понял. Gydvin пишет: Для корректной проверки значений из стека рекомендую предварительно отчищать выделенную область. вычищать в цикле? да, можно сделать так:
Это просто пример, делай как тебе удобно. Gydvin пишет: я распологаю данные ниже выделенной области НЕ ПУТАЙ, стек растет снизу вверх, т.о. dec, sub - перемещение вверх, inc, add - вниз |
|
Создано: 08 марта 2006 00:20 · Личное сообщение · #14 |
|
Создано: 08 марта 2006 08:14 · Личное сообщение · #15 |
|
Создано: 08 марта 2006 16:05 · Личное сообщение · #16 |
|
Создано: 08 марта 2006 16:40 · Личное сообщение · #17 |
eXeL@B —› Вопросы новичков —› Глобальный адрес |