Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.95.38] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
У меня температура, может поэтому башка плохо варит и глюки следуют
одним за другим. При сохранении оригинального обработчика прерывания mov ds,dx mov ax,ds:[21h*4] mov word ptr cs:[OrigInt_21],ax ............................... .............и т.д. Третья строчка в отладчике (AFD) выглядит так: 0123 2EA30301 MOV CS:[0103],AX Обработчик не сохраняется, и в самом отладчике АДРЕСА 0103 Я НЕ ВИЖУ Метка обработчика в тексте программы: OrigInt_21: dd 0 Ну конечно другой на моём месте давно бы разобрался, но я есть я. Башка болит, если кто-нибудь знает в чём может быть проблема, буду просто счастлив. |
Сообщ.
#2
,
|
|
|
Да, чуть не забыл. Должен признаться к своему стыду, что так и не
умею правильно работать в отладчике ( в данном случае afdpro ). Что писать и для чего в командной строке " CMD > " ? |
Сообщ.
#3
,
|
|
|
> Ну конечно другой на моём месте давно бы
> разобрался, но я есть я. > Башка болит, если кто-нибудь знает в чём > может быть проблема, > буду просто счастлив. Ilyia, не расстраивайся! Не проходит дня, чтобы я себя в каком-то вопросе не считал идиотом. Диалектика жизни! Пойми это не глупость или нечто другое, к новому надо привыкнуть, а после этого и наступит осмысление - факт! > mov ds,dx > mov ax,ds:[21h*4] > mov word ptr cs:[OrigInt_21],ax > ............................... > .............и т.д. > Третья строчка в отладчике (AFD) выглядит > так: > 0123 2EA30301 MOV CS:[0103],AX > Обработчик не сохраняется, и в самом > отладчике АДРЕСА 0103 Я НЕ ВИЖУ > Метка обработчика в тексте программы: > OrigInt_21: dd 0 Логично, но смущает отсутствие факта обнуления dx. Адрес 103h - абсолютно адекватен, потому что подозреваю, что код у тебя такой: Start: cs:0100h jmp xx cs:0102h nop cs:0103h OrigInt_21: dd 0 nop появляется потому, что компилишь без ключа "/m" |
Сообщ.
#4
,
|
|
|
Кстати, рекомендую поместить OrigInt_21 прямо в код:
pushf DB 9Ah ;call xxxx:xxxx OrigInt_21 DD 0 iret |
Сообщ.
#5
,
|
|
|
На всякий случай:
mov ax,ds:[21h*4] mov word ptr cs:[OrigInt_21],ax mov ax,ds:[21h*4+2] mov word ptr cs:[OrigInt_21+2],ax |
Сообщ.
#6
,
|
|
|
Всем спасибо за поддержку !
Глюк я выловил, но не понял почему он возник. Сейчас обьясню. Выполняю программу по шагам в отладчике. Первая строка: (не считая, разумеется, title, assume ) 0100 EB18 JMP 011A При этом я ЯСНО ВИЖУ третью строчку: 0103 0000 ADD [BX+SI],AL (именно на 0103 должен впоследствие указывать стандартный сохраняемый обработчик ) Теперь я выполняю первую строчку клавишей F1, прыгаю, то бишь джампую на 011A. Доходя до строки сохранения обработчика 0121 2EA30301 MOV CS:[0103],AX мне кажется, что эта строка указывает в никуда, т.к. поднимаясь вверх по командам я НЕ НАХОЖУ строку 0103 0000 ADD [BX+SI],AL Вместо неё я почему-то вижу следующую хренотень: 0101 18900000 SBB [0000+BX+SI],DL ....................................................... 0105 0000 ADD [BX+SI],AL То есть куда-то пропал адрес 0103, по которому должен сохраняться обработчик. В этом и был глюк. Но я так и не понял ПОЧЕМУ это происходит. Может мне стоит поменять отладчик ? > Логично, но смущает отсутствие факта обнуления dx. dx первоначально имеет значение нуль, по крайней мере так говорит отладчик. > На всякий случай: > mov ax,ds:[21h*4] > mov word ptr cs:[OrigInt_21],ax > mov ax,ds:[21h*4+2] > mov word ptr cs:[OrigInt_21+2],ax Я конечно-то признаю себя чайником в асме, но не до такой же степени:) Всё равно спасибо, приятель:) |
Сообщ.
#7
,
|
|
|
Ilyia, ты упорный человек!
Я ж тебе сказал, что все нормально! Только... Твоя программа работает в другой программе, именуемой DOS (или эмуляцией DOS), какие значения будут в регистрах, еще бабушка надвое сказала. Поэтому следует обнулять - это хороший стиль. Кстати, отладчик обнуляет все регистры в начале работы... Во-вторых, отладчик - глупая программа. Она не знает, где у тебя код, а где данные, тем более, если они перемешаны с кодом. Поэтому 00 00 и заменяет мнемоникой, которая соответствует этому коду. По этой же причине отладчик пытается код представить и по-другому... Короче, это не глюк, но работать надо дальше |
Сообщ.
#8
,
|
|
|
Если тебе интересно, что на самом деле в регистрах при запуске, то гляди:
AX = чаще всего 0000, BX = 0000, CX = 00FF, DX = PSP, SI = 0100, DI = FFFE BP = 0912, SP = FFFE IP = 0100 DS = PSP, ES = PSP SS = PSP, CS = PSP Но это ещё не факт, т.к. если ты, например, упакуешь свою программу каким-нибудь UPX-ом, то после распаковки (перед передачей управления твоей проге) регистры наверняка будут изменены. Или если заразишь прогу вирусом каким-нибудь... Это был пункт 1. Теперь "пункт 2": 0101 18900000 SBB [0000+BX+SI],DL у тебя появляется из-за того, что когда ты поднимаешься вверх, твой отладчик пытается определить начало инструкции и по своей природной тупости (или даже скорее по ....... его АВТОРА) делает это неверно. А теперь вот ты подумай: логично, что если по адресу 0101 18900000, то по адресу 0102 900000, а по 0103 0000? По-моему вполне логично! Пункт 3. Выложи сюда свой исходник полностью или хотя бы пришли на мыло... |
Сообщ.
#9
,
|
|
|
Re : Пункт 3
Я конечно извиняюсь, но если ты достаточно долго знаешь Ассемблер (а судя по всему это именно так), то этот черновик ( а вовсе не исходник) тебе просто НАФИГ не нужен:) К тому же вроде вопросов у меня по нему нет (может пока). Несколько строк примитивного кода могут быть полезны таким как я, но не тем, кто хорошо владеет Ассемблером. Ну.. если тебе сильно надо (мало ли), я вышлю:) Re : Пункт 2 Ну конечно же ты давно написал свой отладчик, который лучше AFD в сто раз )) А если серъёзно, я пользовался первой версией, кто же не делает ошибок в первых версиях. Вспомнить ту же windows, а в MS люди работают отнюдь не тупые. С проблемой отладчика я разобрался, спасибо всем участникам топика. Re : Пункт 1 Интересно мне всё и насчёт регистров тоже, приму к сведению, спасибо. Кстати о вирусах... Не помешали бы исходники и(или) документации про вирусы и анти-вирусы, буду рад любым ссылкам. Так, для общего развития |
Сообщ.
#10
,
|
|
|
Примерный текст резидента, который мне приходит в голову, от него и пляши:
AntiDel.txt ----Begin----------------------------------- LOCALS .MODEL TINY .CODE ORG 100h Start: jmp Init ;Здесь могут располагаться данные резидентной части Int21Handler PROC FAR cmp ah,41h jne @@DoOldInt21 ; ... @@Exit: iret @@DoOldInt21: ;Запуск старого обработчика прерывания DB 0EAh ;jmp xxxx:xxxx fpOldInt21 DD ? Int21Handler ENDP Init: ;Сохранение старого обработчика и установка нового xor ax,ax mov es,ax cli mov ax,OFFSET Int21Handler xchg ax,es:[21h*4] mov WORD PTR [fpOldInt21],ax mov ax,cs xchg ax,es:[21h*4+2] mov WORD PTR [fpOldInt21+2],ax sti ;Освобождение сегмента среды mov es,ds:[2Ch] mov ah,49h int 21h ;Завершение программы и сохранение ее резидентной mov dx,OFFSET Init int 27h END Start ----End------------------------------------- Компиляция tasm /m antidel.asm tlink /t /x antidel.obj После компиляции получишь 53-байтную программку, которая, например, в Volcov Commander'е не будет давать удалять файлы. Ilyia, нам твой исходник не нужен, просто хотели помочь... Успехов! |
Сообщ.
#11
,
|
|
|
PS:
Могу еще предложить изменить обработчик прерывания на следующий для отлова всех случаев удаления файла/каталога Int21Handler PROC FAR cmp ah,13h je @@Del cmp ah,41h je @@Del cmp ax,7141h je @@Del cmp ah,3Ah je @@Del cmp ax,713Ah je @@Del @@DoOldInt21: ;Запуск старого обработчика прерывания DB 0EAh ;jmp xxxx:xxxx fpOldInt21 DD ? @@Del: ; ... @@Exit: iret Int21Handler ENDP |
Сообщ.
#12
,
|
|
|
Благодарю ! Буду колдовать над исходником !
Всё хорошо !!! ....за исключеньем пустяка... (далее идут мои вопросы, НО при этом предполагается, что исходник написан без ошибок) 1).обязательно ли освобождать сегмент среды (49h), что может случиться, если не освобождать; 2).не совсем понятно назначение строчки MOV AX,CS (...или я что-то совсем не понимаю ?) 3).(и наконец самый глупый вопрос) оболочки VolCom у меня нет, а вот из командной строки dos и из NorCom исходник не работает, хотя, как я понял, если в AH значение 41, то происходит немедленный выход IRET, так нет же... ( у меня сложилось ужасное предположение, что разные оболочки по-разному обрабатывают 41h. Я надеюсь, что это всё-же не так ??? ....хотя может я что-то не заметил. |
Сообщ.
#13
,
|
|
|
1) Не обязательно...
Если не удалишь, просто объем программы в памяти будет занимать байт на 300 больше. 2) Просто совместил для сокращения кода сохранение старого и установку нового обработчика: mov ax,cs ;AX = CS (сегмент нового обработчика) xchg ax,es:[21h*4+2] ;AX <- сегмент старого обработчика ;es:[21h*4+2] <- CS (сегмент нового обработчика) mov WORD PTR [fpOldInt21+2],ax 3) Если изменишь на обработчик, который я потом добавил, из ком. строки тоже не будет удалять. > если в AH значение 41, то происходит немедленный выход IRET В этом случае прерывание просто не обрабатывается. Код я тебе послал в качестве полуфабриката. Я не знаю, что ты хочешь делать при удалении, поэтому и написал ... > у меня сложилось ужасное > предположение, что разные оболочки по- > разному обрабатывают > 41h. Я надеюсь, что это всё-же не так ??? Это не так. Просто команда "del" использует функции ax=7341h и ax=733ah при работе под Windows. Опять же смотри текст последнего обработчика PS: Код я проверил, у меня все работает |
Сообщ.
#14
,
|
|
|
пардон, опечатался:
функции ax=7141h и 713Ah |
Сообщ.
#15
,
|
|
|
Спасибо, я всё понял.
А тупил я из-за того, что до сих пор плохо представлял себе разницу между DOSом в окне и DOSом в реальном режиме. |