Подскажите в чем проблема: имеется такая 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, reasonWORD , reserved1WORD 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 (если просто запускаешь прогр-му, то ошибку выдает И еще вопрос : Когда в OllyDbg показывает /LastErr ERROR_SUCCESS (00000000)/ это значит ошибок нет или я ошибаюсь ?
Это значит не было ошибок после вызовов Win32 функций. Когда отлаживаешь, смотри внимательно за стеком. Сам увидишь, в чём проблема.
Да за стеком следил, вроде все в порядке, а в чем может быть проблема со стеком ? После выполнения команды \pop ebp\ в вершине стека находится адрес возврата ...
Проблему решил jmp'ом на адрес возврата. Не пойму теперь, что получается моя DLL находится в том же сегменте кода что и вызывающая программа ? У меня Call не записывает в стек значение CS, и наверное из-за этого RETF не хочет возвращаться из DLL . Так как же сделать через \ret\ ?
Nigger останавливается на \ret \ когда трассируешь в OllyDbg Что в этот момент написно в строке статуса Olly? Проблему решил jmp'ом на адрес возврата. Imho это не решение, а подпорка. Call не записывает в стек значение CS И не должен. RETF не хочет возвращаться А где у тебя retf? Должен быть retn который 0C3h или retn XXXX, который 0C2h XXXX.
Nigger Ты же сам пишешь: Код (Text): .model flat,stdcall А это подразумевает сплошную модель памяти. Здесь cs для всего кода программы (ring3) будет один. Мало того, ds будет указывать на те же адреса (только атрибуты другие и всё). Это Win32 – привыкай =) Это с чего ты так уверен ? =) То есть если бы ты не поставил "add esp,8", то всё и так было бы нормально? Ну а это вообще бред. retf как сказал q_q здесь вообще не должно быть! И если ты кодишь в ring3 – забудь про селекторы, зачем они тебе сдались. Короче, где-то здесь: Код (Text): ........... ........... У тебя стек сбивается.
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) ???
Nigger Читай уроки под винды. Хотя бы мои: bitfry.narod.ru Не забивай голову программированием в реальном режиме. И даже защищёнку пока не трогай! Поверь – так будет в 100 раз быстрее для освоения материала. Если основы знаешь хорошо (что мало вероятно =), читай Айсилона (здесь лежит в схеме). ЗЫ ну нету в форточных приложениях далёких возвратов =)
Nigger почему retf не должно быть, если процедура объявлена как дальняя (far) Извини, не обратил внимания, привык к его отсутствию. что-то типа нарушение доступа Во-первых far надо убрать, во-вторых, вначале ты пишеш, stdcall, а это значит обязан почистить стек от переданых параметров, т.е. либо ооформляй подпрограмму как MyProc proc p1:dword, p2:dword, либо явно укажи ret 8.