Сейчас на форуме: bartolomeo, -Sanchez- (+3 невидимых)

 eXeL@B —› Вопросы новичков —› Глобальный адрес
Посл.ответ Сообщение

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 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
кто чем может? Только с пояснениями в этом я новичек и могу тормозить



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

Создано: 04 марта 2006 14:42
· Личное сообщение · #2

Здравствуйте Gydvin, вы писали:

sub esp, 50 ; резервируем в стеке 50
......
add esp, 50 ; возвращаем стек в исходное состояние
retn


Для корректной работы со стеком нехватает сохраненного значения esp, т.е.:

push ebp
mov ebp,esp ; сохраняем значение esp
sub esp, 50 ; резервируем в стеке 50
.......
mov esp,ebp ; восстанавливаем esp, возвращаем стек в исходное состояние
pop ebp
retn


Это комментарий по фрагменту кода, этого кода мало для ответа на твой вопрос (ИМХО)



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 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 желательно с возможностью изменять размеры отведенного под нее места, хоть это и неважно потому что размер строки который туда будет записан известен зарание.

Как это можно сделать?

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



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

Создано: 05 марта 2006 01:01
· Личное сообщение · #4

Вот код на асме, компилятор FASM--> flatassembler.net <-- http://flatassembler.net/ :

format PE GUI 4.0
entry start_

;подключить файл макросов из пакета FASM
include '%PATH_TO_FASM_INCLUDE_DIR%\win32a.inc'

section 'code' code readable executable
start_:
invoke MessageBox,0,string,title,0 ;покажим исходную строку
mov edi,string ;помещаем указатель на строку
mov ecx,string_size ;размер строки
fillstr_:
mov byte [edi],'a'
inc edi
loop fillstr_
invoke MessageBox,0,string,0,0
invoke ExitProcess,0

section 'data' data readable writeable
string db 0xF5,0xF3,0xE9 ;поле строки
string_size = $-string
db 10 dup (0) ;дополнительные байты, для записи строки большего размера
title db 'Осторожно - ненормативная лексика %)',0

section 'imp' data readable import
library kernel,'KERNEL32.DLL'\
,user,'USER32.DLL'

import user\
,MessageBox,'MessageBoxA'

import kernel\
,ExitProcess,'ExitProcess'




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 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. Целиком декомпилить его - это небыть хорошо, потом замучиешься его обратно собирать



Ранг: 50.7 (постоянный)
Активность: 0.060
Статус: Участник

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



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

Создано: 05 марта 2006 13:46
· Личное сообщение · #7

Gydvin пишет:
Но у меня несколько иная задача, мне надо уже в готовом екзешнике выделить память под строку текста методами отладчика в частности OllyDbg.


Может быть тогда найти свободное место в файле( в конце секций) и использовать под свою строку, пофиксив адреса.



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 марта 2006 14:26
· Личное сообщение · #8

btCode Может быть тогда найти свободное место в файле( в конце секций) и использовать под свою строку

На этом собственно я и остановился места вроде там вполне достаточно



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 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) прописаный по какому либо адресу. Желательно побитово, чтоб при записи я мог еще кое-что поменять. Чет поискал и ничего доходчивого не нашел.



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

Создано: 06 марта 2006 23:24
· Личное сообщение · #10

Обрати внимание, что стек растет снизу вверх. Выделив место в стеке ты его не заюзал. Для корректной проверки значений из стека рекомендую предварительно отчищать выделенную область.

Gydvin пишет:
Желательно побитово

Не путай термины.

Gydvin пишет:
004F8753 mov dword ptr ss:[esp], eax

Затреш нах. В eax не адрес.

Пофиксь адреса на стек.
В файл записать - через WriteFile и т.д., т.е. смотри WinAPI.



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 марта 2006 07:06
· Личное сообщение · #11

Обрати внимание, что стек растет снизу вверх. Выделив место в стеке ты его не заюзал.
004F872E mov esi, dword ptr ss:[esp-10]
004F8775 mov dword ptr ss:[esp-4] и т.д
Затреш нах.

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

Для корректной проверки значений из стека рекомендую предварительно отчищать выделенную область.
вычищать в цикле?



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 марта 2006 07:36
· Личное сообщение · #12

Пофиксь адреса на стек
это как? Можно образец?



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

Создано: 07 марта 2006 13:02
· Личное сообщение · #13

Gydvin пишет:
Пофиксь адреса на стек
это как? Можно образец?

;) я имел ввиду правилное обращение к стеку, ну ты вроде понял.

Gydvin пишет:
Для корректной проверки значений из стека рекомендую предварительно отчищать выделенную область.
вычищать в цикле?


да, можно сделать так:

mov ebp,esp ;сохраняем указатель на стек
mov esi,esp ;используем для перемещения по стеку
sub esp,somevalue ;выделяем необходимое место
push esi ;сохраняем для перемещения в стеке снизу вверх

;настраиваем счетчик для цикла в соответствии с необходимым количеством шагов, так, при dword:
;mov ecx,somevalue
;shr ecx,2

mov ecx,somevalue ;заполняем байтами

some_label_here:

dec esi
mov byte [esi],0

loop some_label_here

;после цикла esi - указатель на вершину выделенной области

pop esi

;теперь esi - указатель на стек ниже выделенной области


Это просто пример, делай как тебе удобно.

Gydvin пишет:
я распологаю данные ниже выделенной области

НЕ ПУТАЙ, стек растет снизу вверх, т.о. dec, sub - перемещение вверх, inc, add - вниз



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 08 марта 2006 00:20
· Личное сообщение · #14

btCode
НЕ ПУТАЙ, стек растет снизу вверх...
Он как раз таки наоборот растёт



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

Создано: 08 марта 2006 08:14
· Личное сообщение · #15

Да ошибся, стек растет от больших адресов к меньшим - движение сверху вниз, на самом деле.



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 марта 2006 16:05
· Личное сообщение · #16

Ребята, вы меня совсем заблудили , так я правильно работал со стеком или нет



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

Создано: 08 марта 2006 16:40
· Личное сообщение · #17

проверь, правильно ли обращаешся к стеку, видимо ты не понял последнее сообщение.


 eXeL@B —› Вопросы новичков —› Глобальный адрес
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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