Advertisement
Guest User

Untitled

a guest
Jul 30th, 2016
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.72 KB | None | 0 0
  1. some_var dd ?
  2. ... // код
  3. // здесь мы имеем в регистре eax, к примеру, адрес переменной some_var
  4.  
  5. call $+5
  6. label:
  7. lea eax, [label]
  8. sub [esp], eax
  9. lea eax, [var]
  10. add [esp], eax
  11. pop eax
  12.  
  13. format PE console
  14. include 'win32ax.inc'
  15.  
  16. entry start
  17.  
  18. section '.data' data readable writeable
  19. rb 7 ; Отступаем от начала секции на 7 байт, просто чтобы адрес переменной не был "ровным"
  20. some_var dd ?
  21. _fmt db '%p',13,10,0
  22.  
  23. section '.code' code readable executable
  24. start:
  25. mov eax, some_var
  26. cinvoke printf, _fmt, eax ; Эталонный адрес, в моем случае 00401007
  27.  
  28. call label1 ; Переход на следующую команду, в стек кладется адрес возврата, равный адресу label1
  29. label1:
  30. pop eax ; Получаем адрес возврата из стека
  31. sub eax, label1 - some_var ; Уменьшаем адрес на разницу адресов переменной и метки label1
  32. ; Разница label1 - some_var вычисляется в момент компиляции
  33. cinvoke printf, _fmt, eax ; Вычисленный адрес: 00401007
  34.  
  35. invoke ExitProcess, 0
  36.  
  37. section '.idata' import data readable
  38.  
  39. library kernel, 'kernel32.dll',
  40. msvcrt,'msvcrt.dll'
  41.  
  42. import kernel,
  43. ExitProcess, 'ExitProcess'
  44.  
  45. import msvcrt,
  46. printf,'printf'
  47.  
  48.  
  49.  
  50. section '.idata' import data readable
  51.  
  52. library kernel, 'kernel32.dll',
  53. msvcrt,'msvcrt.dll'
  54.  
  55. import kernel,
  56. ExitProcess, 'ExitProcess'
  57.  
  58. import msvcrt,
  59. printf,'printf'
  60.  
  61. macro get_addr var
  62. {
  63. call ..label1
  64. ..label1:
  65. pop eax
  66. sub eax, ..label1 - var
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement