вопрос по MS VC 6.0

Тема в разделе "WASM.BEGINNERS", создана пользователем Koshak, 3 мар 2006.

Статус темы:
Закрыта.
  1. Koshak

    Koshak New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2006
    Сообщения:
    31
    Адрес:
    Russia
    Доброго времени суток всем.



    Есть несколько вопросов по MSVC 6.



    1. Создаю проект приложения с GUI, в котором используется компилирую, Трассирую с использованием отображения ассемблерных команд.

    Теперь сам вопрос: как избавиться от мусора вставляемого компилятором в начале функции, а именно:



    00401080 push ebp

    00401081 mov ebp,esp

    00401083 sub esp,40h

    00401086 push ebx

    00401087 push esi

    00401088 push edi

    00401089 lea edi,[ebp-40h]

    0040108C mov ecx,10h

    00401091 mov eax,0CCCCCCCCh

    00401096 rep stos dword ptr [edi]



    и компенсирующего кода в конце:



    0040109A pop edi

    0040109B pop esi

    0040109C pop ebx

    0040109D mov esp,ebp

    0040109F pop ebp

    004010A0 ret 2Ch







    2. Если я устанавливаю "Ignore all defalt libraries" и указываю точку входа, то получаю ошибку линкера:

    error LNK2001: unresolved external symbol __chkesp,

    а всё потому, что линкер вставляет

    00401068 call __chkesp (00401110)

    после процедуры Main(это точка входа). Что сделать, чтобы он этого не делал?







    3. почему после "ret" из 1го вопроса стоит 2Ch - что это?





    4. Во встроенном в VC асме нельзя обратиться к регистру EIP. Например, на конструкию

    _asm{

    push EIP

    pop EAX

    }

    компилятор выдаёт

    error C2094: label 'EIP' was undefined.

    Как можно получить адрес текущей команды?



    Заранее спасибо всем комрадам, которые осчастливят меня ответами :)
     
  2. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165


    1) Не нравиться - пиши на асме ;).

    2) Если уж сильно припрёт то пользуйся NAKED функциями.

    3) Перейди в режим релиза, чтобы избавиться от __chkesp.

    4) Можно и стартап-функцию покорёжить...

    Смотря какая у тебя задача.



    P.S. У Крисса Касперского довольно хорошо описано то о чём ты спрашиваешь.
     
  3. Koshak

    Koshak New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2006
    Сообщения:
    31
    Адрес:
    Russia
    DelExe, спасибо, посмотрю у Касперского. Если помнишь скажи в какой книжке - у него их много.....

    за идею про NAKED ваще отдельное спасибо. Не знал.
     
  4. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    "Фундаментальные основы хакерства" Крис Касперски.
     
  5. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    а когда добавили такую команду ? (и прямое обращение к eip вообще) ?
     
  6. Koshak

    Koshak New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2006
    Сообщения:
    31
    Адрес:
    Russia
    infern0, push EIP я использовал ещё в детстве в DOS'овском tasm'е от Borland'а для определения текущего местоположения (если мне склероз не изменяет - это было 7 лет назад), а вот, например, mov eax,eip я сделать не мог...
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    0CCCCCCCCh - признак _DEBUG версии, поэтому начать надо с выключения этого режима. После этого не будет возможности остановки в дебаггере, но этому легко помочь - ставь INT 3 где надо:
    Код (Text):
    1.  
    2. void foo ()
    3. {
    4.   _asm int 3
    5.  
    6.   // ... your code here ...
    7. }
    8.  


    Далее, надо начинать перебирать опции компилятора - в общем поэкспериментировать. Я получил очень неплохой код от этого компилятора. Следующия версия (VS .NET 2003), надо сказать, получше будет - здорово код генерирует, функция вот так выглядит:
    Код (Text):
    1.  
    2. ; function entry point
    3. SUB ESP, local_variables_room
    4.  
    5. ... all parameters and locals with [ESP + ofs]
    6.  
    7. ADD ESP, local_variables_room
    8. RET
    9.  
     
  8. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615


    Отладчик замечально работает и в Release Build.



    Это делает и VC6, если включить /Oy (enable frame pointer omission). По умолчанию включено в Release Build.



    А вместо push eip надо использовать такой код:
    Код (Text):
    1.  
    2. call dummy
    3. :dummy
    4. pop eax
    5.  


    Регистр eip напрямую недоступен никаким образом, а только косвенно через команды передачи управления (jmp, call, (i)ret, int).
     
  9. Koshak

    Koshak New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2006
    Сообщения:
    31
    Адрес:
    Russia
    AsmGuru62,reverser

    спасибо за консультацию. Помогло.
     
Статус темы:
Закрыта.