Не возвращается из Dll :(

Тема в разделе "WASM.WIN32", создана пользователем Nigger, 10 дек 2005.

  1. Nigger

    Nigger New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2005
    Сообщения:
    13
    Адрес:
    Russia
    Подскажите в чем проблема:

    имеется такая Dll:

    --------------------------------------

    .386

    .model flat,stdcall

    option casemap:none

    include \masm32\include\windows.inc

    include \masm32\include\kernel32.inc

    include \masm32\include\user32.inc

    includelib \masm32\lib\kernel32.lib

    includelib \masm32\lib\user32.lib

    .code

    DllEntry proc hInstDLL:HINSTANCE, reason:lol: WORD , reserved1:lol: WORD

    mov eax,TRUE

    ret

    DllEntry endp



    MyProc proc far

    pMemory equ [ebp+8]

    iMemSize equ [ebp+12]

    pMemoryOut equ [ebp-4]

    iMemOutSize equ [ebp-8]



    push ebp

    mov ebp,esp

    sub esp,8

    ...........

    ...........

    add esp,8

    pop ebp

    ret

    MyProc endp



    END DllEntry

    ------------------------------------

    Вызываю MyProc из своей программы, функция работает как положено, но останавливается на \ret \ когда трассируешь в OllyDbg (если просто запускаешь прогр-му, то ошибку выдает :dntknw:

    И еще вопрос : Когда в OllyDbg показывает /LastErr ERROR_SUCCESS (00000000)/ это значит ошибок нет или я ошибаюсь ?
     
  2. IceStudent

    IceStudent Active Member

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


    Это значит не было ошибок после вызовов Win32 функций.



    Когда отлаживаешь, смотри внимательно за стеком. Сам увидишь, в чём проблема.
     
  3. Nigger

    Nigger New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2005
    Сообщения:
    13
    Адрес:
    Russia
    Да за стеком следил, вроде все в порядке, а в чем может быть проблема со стеком ?

    После выполнения команды \pop ebp\ в вершине стека находится адрес возврата ...
     
  4. Nigger

    Nigger New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2005
    Сообщения:
    13
    Адрес:
    Russia
    Проблему решил jmp'ом на адрес возврата.

    Не пойму теперь, что получается моя DLL находится в том же сегменте кода что и вызывающая программа ?

    У меня Call не записывает в стек значение CS, и наверное из-за этого RETF не хочет возвращаться из DLL .

    Так как же сделать через \ret\ ?
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Nigger

    останавливается на \ret \ когда трассируешь в OllyDbg

    Что в этот момент написно в строке статуса Olly?



    Проблему решил jmp'ом на адрес возврата.

    Imho это не решение, а подпорка.



    Call не записывает в стек значение CS

    И не должен.



    RETF не хочет возвращаться

    А где у тебя retf? Должен быть retn который 0C3h или retn XXXX, который 0C2h XXXX.
     
  6. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Nigger





    Ты же сам пишешь:
    Код (Text):
    1. .model flat,stdcall


    А это подразумевает сплошную модель памяти.

    Здесь cs для всего кода программы (ring3) будет один.

    Мало того, ds будет указывать на те же адреса (только атрибуты другие и всё).

    Это Win32 – привыкай =)







    Это с чего ты так уверен ? =)

    То есть если бы ты не поставил "add esp,8", то всё и так было бы нормально? ;)









    Ну а это вообще бред.

    retf как сказал q_q здесь вообще не должно быть!

    И если ты кодишь в ring3 – забудь про селекторы, зачем они тебе сдались.



    Короче, где-то здесь:
    Код (Text):
    1.  ...........
    2. ...........
    3.  


    У тебя стек сбивается.
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Если не получится за кинь в аттач код длл и проги ее юзающей
     
  8. Nigger

    Nigger New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2005
    Сообщения:
    13
    Адрес:
    Russia
    2q_q:

    -Что в этот момент написно в строке статуса Olly?

    -что-то типа нарушение доступа при чтении, блин с английским проблема (Access violation when reading (FFFFFFFF) - use Shift+F7... to pass exception to program)

    все сегментные регистры в этот момент равны FFFFFFFF .



    *

    Call не записывает в стек значение CS

    И не должен. *

    -Блин, в Зубкове написано что при дальнем вызове проц. должен сохранять в стеке EIP & CS , а RETF считывать СS & EIP. Фиг поймешь ...



    я думал Dll имеет свое собственное адресное пространство, она же должна быть общая ?



    И почему retf не должно быть, если процедура объявлена как дальняя (far) ???
     
  9. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Nigger

    Читай уроки под винды.

    Хотя бы мои:

    bitfry.narod.ru



    Не забивай голову программированием в реальном режиме.

    И даже защищёнку пока не трогай!

    Поверь – так будет в 100 раз быстрее для освоения материала.



    Если основы знаешь хорошо (что мало вероятно =), читай Айсилона (здесь лежит в схеме).



    ЗЫ ну нету в форточных приложениях далёких возвратов =)
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Nigger

    почему retf не должно быть, если процедура объявлена как дальняя (far)

    Извини, не обратил внимания, привык к его отсутствию.



    что-то типа нарушение доступа

    Во-первых far надо убрать, во-вторых, вначале ты пишеш, stdcall, а это значит обязан почистить стек от переданых параметров, т.е. либо ооформляй подпрограмму как MyProc proc p1:dword, p2:dword, либо явно укажи ret 8.
     
  11. Nigger

    Nigger New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2005
    Сообщения:
    13
    Адрес:
    Russia
    Пасибо, все понятно, я просто не знал что в винде нет далеких вызовов :dntknw: