Как привязаться к адресу текущей инструкции?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 21 ноя 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Скажи мне. как в OllyDbg (не в файле fail.asm, а в отладчике), написать вот это

    db 'GetProcAddress',0

    И я уйду.
    И ещё:
    "Мда... Везде оно выполнится, если func - метка в пределах цельного куска Вашего базонезависимого кода. Для того, чтобы это понять, читаем про формат call в x86. А просил же сначала думать, потом строчить ответ."

    Вот будет у меня написано call 12345678
    Я запускаю это на другой системе. Не выполняется. А почему? А потому, что код загружен нестандартным образом (не загрузчиком) и следовательно, указывать может куда угодно.
    Вот это вот 12345678
    Должно вычисляться непосредствено в коде, ибо это прыжок не в таблицу импрота, а сразу на точку входа API-функции.
     
  2. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    ну можно например так:
    Код (Text):
    1. MOV EAX, DWORD PTR FS:[30h]
    2. MOV EAX, DWORD PTR [EAX+0Ch]
    3. MOV ESI, DWORD PTR [EAX+1Ch]
    4. LODSD
    5. MOV EAX, DWORD PTR [EAX+08h] // eax = kernel base
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Хватит слова говорить уже а?
    Относительно чего, можно тебя спросить? ОТноситеьльно текущего НЕИЗВЕСТНОГО адреса!
     
  4. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    как вариант воспользоваться каким-нибудь плагином, например MUltimate Assembler
    и написать в нём
    Код (Text):
    1. <00401000>
    2. call @zzz
    3. "GetProcAddress/0"
    4. @zzz:
    5. nop
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Я, как отвечающий, не заинтересован в Вашем уходе. Я заинтересован в Вашем понимании. Как написать:

    Выделяем мышкой ближайшие от текущего адреса (включая инструкцию на текущем адресе) 15 байт, жмём Ctrl+E, клацаем на первый символ текстового поля "ASCII", набираем: "GetProcAddress", ставим курсор на первый полубайт байта +0E в текстовом поле HEX (т.е. слева должно быть написано HEX+0E), набираем : "00", жмём Enter. Соответственно перед этой строкой в коде должна быть инструкция "call zzz", являющаяся пятью байтами: E8 0F 00 00 00 . После выполнения этой инструкции в стек будет положен адрес строки "GetProcAddress".
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Код (Text):
    1.  jmp $load
    2. name DB 'GetProcAddress'
    3. $load:
    4.  lea EAX,name
    5.  push EAX
    чем тебе не нравиться ???
     
  7. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Точно!
    Туда ведь кладётся АДРЕС ВОЗВРАТА!
    О, вот это трюк! Я бы сам в жизни не додумался! Вот видите, уменя опыта нет нисколько!
    Cпасибо!
    Здорово!
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    еще нетривиальный вариантик
    Код (Text):
    1.  lea EAX,$load
    2.  jmp EAX
    3. DB 'GetProcAddress',0; <--- n1= число байт в строке включая 0 посчитаешь сам
    4. $load:
    5.  call $get
    6. $get:
    7.  pop EAX
    8.  sub EAX,n1+n2; <---- n2 - длина инструкции call в байтах в данном случае 5 если не путаю
    9.  push EAX
    теперь
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    Этот "трюк" описан первым кусочком кода в разделе "Дельта-смещение" статьи "От зелёного к красному". Остальные тамошние приёмы с lea — это, конечно, базозависимый бред.
     
  10. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    l_inc
    О!!!!! я прозрел еще одним вариантиком благодаря вам

    Код (Text):
    1. call $load
    2. DB 'GetProcAddress',0
    3. $load:
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Мда... тему срочно отметить в разделе "Улыбнитесь"... Особенно хорошо представляю себе взрыв смеха Black_mirror...
     
  12. cornolio

    cornolio New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2009
    Сообщения:
    50
    жесть
     
  13. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    l_inc
    чего смешного то ????
     
  14. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
     
  15. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    AntiB
    однако труды с сайта товарища клерка
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а зачем его знать?
    "call $+5" например вполне допустимая инструкция.
     
  17. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Ну щас-то ясно уже, спасибо за разъяснение. Я просто не рассатривал call отдельно от ret. Думал: напишу call и надо будет ОБЯЗАТЕЛЬНО написать ret (Ибо зачем call без ret, когда есть jmp)

    ...А что писать в ret? Какие операнды я даже и не спрашивал никого, ибо мне не надо было никуда возвращаться! То есть получается: ret не нужен (не нужно мне возвращаться по адресу, положеннному в стек!), но написать я его обязан.
    Оказывается, ни хрена не обязан.
    ...Если бы я это понял, может бы допёр сам до того, что call очень даже использует смещение относительно текущего адреса, а может и нет. Щас уж нечего гадать.

    ...Ещё меня такая инструкция вводила в ступор:
    Код (Text):
    1. db 'GetProcAddress', 0
    То есть я знал, что компилятор выделит адрес для такой строки и положит её по этому адресу. Но я в страшном сне не предполагал, что он сделает это ТУТ ЖЕ, В КОДЕ, А НЕ В rdata, например! Я и писал об этом.

    ...Я и не пробовал так сделать потому, что зачем пробовать ЗАВЕДОМО ошибочное?
    Оказывается, всяко может быть... Потом уже по пунктам расписали мне, что надо сделать... А потом я эту строку вставил в исходник- работает...
    Вот так одно да другое наложилось и получилось то, что получилось.
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    И как написал Mika0x65 в #8 компилятор может выделить адрес для такой строки и положит её по этому адресу ТУТ ЖЕ, В СТЕКЕ читайте внимательно, то что вам пишут :)
     
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    amvoz
    Посмотри еще вот здесь
     
  20. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Mikl___
    Но вот с call $+5 pop eax явно перемудрили,
    т.к. только mov EAX,$ грузит текущий EIP, а call - нет :)