как получить eip?

Тема в разделе "WASM.BEGINNERS", создана пользователем someone, 28 июн 2007.

  1. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    забыл я :dntknw:
    года два назад мне это надо было сделать (сделал на TASM вроде бы...), уже не помню как именно это делается, и литература вся ушла в *опу
    сейчас пишу процедуру, в определенном месте которой мне нужно сделать переход на определенный адрес программы, причем этот адрес находится вне моей процедуры., адрес относительно начала процедуры знаю точно
    я предполагал сделать это так:
    получить eip;
    вычесть из него определенное число;
    jmp на полученный адрес...

    возникла проблема: не помню как можно получить этот eip.

    голове крутится "через стек"
    а как хз.

    пишу на MSVC 2005 ассемблерную вставку.
    push eip
    оно мне выдает андекларед идентифаер :dntknw:

    помогите пожалуйста
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    call a1
    a1:
    pop eax // в eax - eip метки а1
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    someone
    И зачем тогда нужен eip ? Грузи offset MyProc, вычитай\прибавляй дельту и прыгай
     
  4. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    собственно говоря боюсь это не подойдет.
    компилятор вставляет вместо метки относительный адресс если я не ошибаюсь
    а мне нужен полностью базонезависимый код,
    т.е. мне нужен переход скажем на 100 байтов назад, вот таким образом
    как получить адресс на 100 байтов назад не подскажите? :)
    вот к примеру процедурка:

    Код (Text):
    1. ..... some code
    2. ......
    3.                 //в EBX нао поместить адрес начала этого кода. т.е. адрес текущей команды
    4.                 push ebx;                                      //он сохраняется, дальше надо еще раз его использовать
    5.         mov eax,0xffffffff;    
    6.         mov edx,0xffffffff;    
    7.         mov ecx,eax;           
    8.         sub ebx,eax;
    9. M1:                             //вот здесь аналогичная проблема. переход нужен относительный
    10.                                                                   // а я не знаю шо подставит сюда компиллер
    11.         mov eax,[ebx];
    12.         xor eax,edx;
    13.         mov [ebx],eax;
    14.         add ebx,1;
    15.         dec ecx;
    16.         jnz M1;                                        //вернее компиллер подставит это сюда
    17.                                
    18.         pop ebx;               
    19.         mov eax,0xffffffff;                      
    20.         sub ebx,eax;                       //вычисляем адрес перехода
    21.         jmp ebx;                                     //переходим (переход осуществляется за пределы процедуры - назад до ее начала в мое частном случае)
    22.         ret;
    помогите пожалуйста.
    боюсь гуглить я это буду намного дольше чем у меня есть времени
     
  5. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    в том то и дело что я не знаю где этот код будет размещен.
    и offset MyProc никак нельзя получить :dntknw:
    с этим бы я справился
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    someone

    Смотрим описание команд, дисасм листинг и т.д. А так же разберись что такое относительный и абсолютный переходы.

    Ищем на сайте про дельта смещение.
     
  7. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    с дельта смещением и так все понятно.
    нужно получить текущий адрес, и отнять/прибавить от него дельту
    проблема в том как его получить (текущий адрес).
    я вообщето допустил возможность существования относительной команды перехода (или команды относительного перехода?) на Х байт назад/вперед

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


    гм.
    мне как раз нужен относительный переход (я это так понимаю: переход относительно текущей позиции)

    абсолютный переход: переход на конкретный адрес.

    я хочу получить абсолютный адрес путем получения текущего адреса и арифметических операций с дельтой.

    PS: просто с ассемблером работаю мало, в основном СИ, а тут ну не вижу я других вариантов решения проблемы кроме как накодить на ассемблере потому сейчас и занялся быстрым вспоминанием ассемблера, и т.д.
     
  8. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    вообще в этом случае можно сделать без проще.
    mov eax, a1;

    если я не ошибаюсь будет то же самое.
    хотя может я всетаки ошибаюсь?

    в общем мне кажется что это не подходит.
     
  9. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    someone
    Такая команда - jmp.

    странный способ какой-то для какой-то странной задачи ищешь.
     
  10. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    someone
    mov eax, offset a1 даст тот же результат, если кто-нибудь(система в большинстве случаев) позаботится о том, чтобы эта команда дала правильный результат. В то время как call/pop ни от кого не зависит
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    someone
    Конечно ошибаешься, т.к. mov eax,offset a1 загрузит в eax адрес метки a1 в твоем исходном скомпилированном коде, но если ты в рантайме переместишь это кусок кода по другому адресу, то адрес метки a1 изменится и значение в eax будет неверным. А вот call выполняется процессором именно в рантайме и помещает в стек всегда текущее значение адреса возврата независимо от базы или чего то еще ;)

    Если кажется - креститься надо ;)
    Код, приведенный asd это классика. Из других способов - только модификация кода, т.е. ручная замена всех абсолютных адресов в куске кода (коррекция релоков)
     
  12. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    Код (Text):
    1. ..... some code
    2. ......
    3.                 call a1
    4. a1:
    5.                 pop ebx;
    6.                 //в EBX нао поместить адрес начала этого кода. т.е. адрес текущей команды
    7.                 push ebx;                                      //он сохраняется, дальше надо еще раз его использовать
    8.         mov eax,0xffffffff;    
    9.         mov edx,0xffffffff;    
    10.         mov ecx,eax;           
    11.         sub ebx,eax;
    12. M1:                             //вот здесь аналогичная проблема. переход нужен относительный
    13.                                                                   // а я не знаю шо подставит сюда компиллер
    14.         mov eax,[ebx];
    15.         xor eax,edx;
    16.         mov [ebx],eax;
    17.         add ebx,1;
    18.         dec ecx;
    19.         jnz M1;                                        //вернее компиллер подставит это сюда
    20.                                
    21.         pop ebx;               
    22.         mov eax,0xffffffff;                      
    23.         sub ebx,eax;                       //вычисляем адрес перехода
    24.         jmp ebx;                                     //переходим (переход осуществляется за пределы процедуры - назад до ее начала в мое частном случае)
    25.         ret;
    то есть, если данный код будет располагаться в случайном месте памяти,
    оно будет работать правильно?
    может я просто пересидел на си?
    дело в том что я пока еще не могу проверить его работоспособность :dntknw:
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Вот уж не знаю. То, что после pop ebx в ebx будет текущий адрес метки а1 это 100%, а разбираться в твоих хитрых махинациях с 0xffffffff и sub ebx,eax как-то желания нет. Надеюсь ты учтешь добавление команд call+pop в расчетах дельты
     
  14. y4eNick

    y4eNick New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2007
    Сообщения:
    37
    EIP можно получить так:
    Код (Text):
    1.   push 00900008h
    2.   push 0c224048bh
    3.   call esp
    4.   nop                  ;теперь в eax адрес команды nop
    Надеюсь поможет
     
  15. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    someone
    Джамп из процедуры в другое место есть плохой стиль (если только не дает очень сильных плюсов). Почему бы вам не подумать, как переделать алгоритм, чтобы этого не требовалось? А задачку решать просто для развития.
     
  16. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    На C кстати тоже можно писать базонезависимый код. См. статью от Cr4sh http://hellknights.void.ru/research.php там пример есть.
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    y4eNick
    И что ? Тот же call, только еще придется VirtualProtect для натеги вызвать, т.к. с современными компами с их хардварными DEP-ами лучше не шутить ;))
     
  18. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    someone
    Поиск по форуму рулит, есть еще метод получения EIP через fsave.
     
  19. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    PaCHER
    Кстати дайте плиз код, который получит EIP через fsave.
     
  20. y4eNick

    y4eNick New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2007
    Сообщения:
    37
    leo
    разве это не вопрос топика:
    не очень понял про что:
    можно пояснить?