Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- some_var dd ?
- ... // код
- // здесь мы имеем в регистре eax, к примеру, адрес переменной some_var
- call $+5
- label:
- lea eax, [label]
- sub [esp], eax
- lea eax, [var]
- add [esp], eax
- pop eax
- format PE console
- include 'win32ax.inc'
- entry start
- section '.data' data readable writeable
- rb 7 ; Отступаем от начала секции на 7 байт, просто чтобы адрес переменной не был "ровным"
- some_var dd ?
- _fmt db '%p',13,10,0
- section '.code' code readable executable
- start:
- mov eax, some_var
- cinvoke printf, _fmt, eax ; Эталонный адрес, в моем случае 00401007
- call label1 ; Переход на следующую команду, в стек кладется адрес возврата, равный адресу label1
- label1:
- pop eax ; Получаем адрес возврата из стека
- sub eax, label1 - some_var ; Уменьшаем адрес на разницу адресов переменной и метки label1
- ; Разница label1 - some_var вычисляется в момент компиляции
- cinvoke printf, _fmt, eax ; Вычисленный адрес: 00401007
- invoke ExitProcess, 0
- section '.idata' import data readable
- library kernel, 'kernel32.dll',
- msvcrt,'msvcrt.dll'
- import kernel,
- ExitProcess, 'ExitProcess'
- import msvcrt,
- printf,'printf'
- section '.idata' import data readable
- library kernel, 'kernel32.dll',
- msvcrt,'msvcrt.dll'
- import kernel,
- ExitProcess, 'ExitProcess'
- import msvcrt,
- printf,'printf'
- macro get_addr var
- {
- call ..label1
- ..label1:
- pop eax
- sub eax, ..label1 - var
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement