Ув. Эксперты! Такой вопрос:
каким образом на этапе ассемблирования или линкования под винду
можно сделать секцию кода с доступом для изменения?
(Скажем если моя прога сама себя расшифровывает или распаковывает.)
Пользуюсь масмом32.
Заранее спасибо!
Отправлен: 14.02.2005, 14:50
Вопрос задал: Василевский Александр (статус: 10-ый класс)
Всего ответов отправлено: 2
Отвечает: Вiктор
Здравствуйте, Василевский Александр!
я не спец по этому вопросу. Но вот что я думаю: если прога сама себя изменяет,
то она работает
спамятью, где она записана (или с файлом). т.е. разрешения спрашивать не надо.
тут главное - хорошо всё продумать чтобы не напортачить и прога не зависла, и
изменение своего кода - на вашей ответственности (и совести)
удачи!
Ответ отправил: Вiктор (статус: 2-ой класс)
Отправлен: 14.02.2005, 19:12
Отвечает: _vt
Здравствуйте, Василевский Александр! Используй fasm - он умеет задавать права доступа к секциям PE-файла по желанию пользователя :) При описании секции кода в тексте программы, указываются атрибуты секции - readable,writeable,executable. Выберешь то, что тебе нужно :) Если не ошибаюсь, существует трюк и для masm, но так как я не помню его, то тебе придется потом вручную править exe-заголовок.
* EMan 2 beta: back in Black :)
Ответ отправил: _vt (статус: Академик)
Отправлен: 16.02.2005, 13:47
Вопрос № 16993
Друг попросил написать прогу, которая будет при изменениях в одной конкретной папке (расположеной на сервере)
(у него Win98 (протоколы IPX и TCP/IP) и сеть NetWare 3.12) сообщала ему об этом.
Написал через : FindFirstChangeNotification (Next), по таймеру проверяю WaitForMultipleObjects.
Та вот и на моем и на его локальном компе все работает идеально. Но на удаленной папке (на сервере) изменений прога не видит.
(По утверждению друга). Сам проверить не имею возможности, нет сетки.
Что это может быть, как исправить?
Отправлен: 14.02.2005, 15:32
Вопрос задал: Стас (статус: Практикант)
Всего ответов отправлено: 1
Отвечает: Artemy
Здравствуйте, Стас!
Посоветуй другу подключить сетевой диск к этой папке.
Ответ отправил: Artemy (статус: Студент)
Отправлен: 17.02.2005, 10:33
Вопрос № 17010
Здравствуйте, Эксперты. У меня два вопроса:
1. Я при компиляции использую редактор EditPlus. У него имеется окно "Output Window",
в которое выводится инфа с результатами. Так вот, если ставить шрифт Terminal, то русские
буквы в нем отображаются нормально, а если др. шрифты - кракозябры. Хотя если выводить в дос-окне - все ОК.
(cmd.exe->Свойства-> и растровые и true-type шрифты: без разницы) Можно ли как нибудь это исправить?
2. Есть бат-файл для компиляции сом-файлов - типа "ml /AT *.asm". Если asm-файл находится в одной с ним директории
то все ОК, если нет - :(. Пишет:
"...
/z2
"Hello.obj" /t
"Hello.com"
NUL
LINK : warning LNK4044: unrecognized option "z2"; ignored
LINK : warning LNK4044: unrecognized option "t"; ignored
Hello.obj : warning LNK4033: converting object format from OMF to COFF
Hello.obj : fatal error LNK1190: invalid fixup found, type 0x0001
_
Assembly Error
..."
Хотя obj создается.
Пришлось создать др. батник:
"...
D:\Progging\ASM\Masm6.15\BIN\Ml.exe "%1.asm" /c
...
D:\Progging\ASM\Masm6.15\BIN\link.exe "%1.obj", "%1.com" /t;
..."
Может можно еще какие-нибудь параметры добавить в "ml /AT *.asm"?
Отправлен: 15.02.2005, 00:27
Вопрос задал: zxzx (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: DSota
Здравствуйте, zxzx!
1. Шрифт терминал единственный шрифт с ДОСовской кодировкой, все остальные - с Виндовсвой. (можешь посмотреть в меню блокнота: Формат->Шрифт->Набор символов)
Ответ отправил: DSota (статус: Студент)
Отправлен: 15.02.2005, 09:50
Отвечает: _vt
Здравствуйте, zxzx! 1) Это зависит от используемого текстового редактора. В cmd.exe в качестве векторных шрифтов можно использовать только некоторые, например Courier New, Lucida Console - в них есть OEM_CHARSET, т.е. они способны выводить текст в DOS кодировке. Например, редактор Bred3 работает в этом плане корректно. 2) Наверное, у тебя установлены несколько компиляторов Майкрософт, например, помимо MASM у тебя есть Visual Studio. Линкер, входящий в Visual Studio 6 и старше, не умеет собирать com-файлы,
как и dos exe-файлы. Но зато он прописан в %PATH% раньше, чем линкер, который лежит в одной директории с твоим файлом. Решение такое - прописать в батнике полный путь к нужному линкеру.
* EMan 2 beta: back in Black :)
Ответ отправил: _vt (статус: Академик)
Отправлен: 16.02.2005, 13:47
Вопрос № 17030
Здравствуйте уважаемые!
1. Подскажите где можно найти листинг прерываний BIOS, DOS.
(тот что у меня есть устарел)
2. Как я понимаю литинг прерываний BIOS не должен зависеть от операционной системы
а только от версии (марки) BIOS, т.е. в *NIX - системах листинг прерываний BIOS тотже.
3. DOS порождение MS таким образом какой листинг прерываний в *NIX, что в них заменяет DOS
или там такая же DOS.
Т.е. подводя итог листинг прерываний в *NIX другой если да то также где его достать.
Если я в чем-то неправ поправте и несудите строго,учусь на своих и стараюсь чужих ошибках,
да спасибо Вашим ответам.
Если есть возможность вышлите листинги на email.
Спасибо.
Алексадр.
Отвечает: John Freeman
Здравствуйте, Трофименко Александр Васильевич!
1) intrs.rar/zip в Internet
2) Да, но кто тебе даст в NT/никсах/bsd пользоваться прерываниями BIOS?
3) Насколько помню, например в BSD испльзуются int'ы вместо call'ов для системных функций, но п2 это не отменяет.
Ответ отправил: John Freeman (статус: Специалист)
Отправлен: 15.02.2005, 13:07
Отвечает: aaaaa
Здравствуйте, Трофименко Александр Васильевич!
выслала бы да вот проблема написать маил забыл куда же тебе слать теперь
Ответ отправила: aaaaa (статус: 4-ый класс)
Отправлен: 15.02.2005, 15:39
Отвечает: psevdo
Здравствуйте, Трофименко Александр Васильевич!
Просишь выслать, а мыло не оставил.
А справочники я видел на www.kalashnikoff.ru в разделе об ассемблере.
Ответ отправил: psevdo (статус: 1-ый класс)
Отправлен: 15.02.2005, 17:07
Отвечает: AxMAD
Здравствуйте, Трофименко Александр Васильевич!
Прерывания http://www.pobox.com/~ralf
А Прерывания BIOS зависит от семейства ПК
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 15.02.2005, 20:01
Отвечает: _vt
Здравствуйте, Трофименко Александр Васильевич! 1) "Листинг прерываний" - это список прерываний и функций этих прерываний? Тогда Ralf Brown Interrupt List. 2) В 32-разрядных системах (WinNT, *nix) доступ к прерываниям BIOS невозможен - это возможно только из DOS и Win9x. 3) Не только в *nix, но и в WinNT нет никакого доса. В WinNT(2000,XP) есть поддержка DOS-программ, но она сильно ограничена. В WinNT системные вызовы производятся вызовом системных API, а никак не прерываний, в *nix - вызовом
системного прерывания int 80h и описание его функций прилагается в заголовочных файлах ядра конкретной ОС.
* EMan 2 beta: back in Black :)
Ответ отправил: _vt (статус: Академик)
Отправлен: 16.02.2005, 13:47
Отвечает: Tigran K. Kalaidjian
Здравствуйте, Трофименко Александр Васильевич!
Описание прерыванийпортовопкодов и пр.:
http://www.pobox.com/~ralf
Ответ отправил: Tigran K. Kalaidjian (статус: Профессионал)
Отправлен: 18.02.2005, 18:50
Вопрос № 17031
Здравствуйте уважаемые эксперты. У меня к вам такой вопрос.
Вообщем я вывожу символ на прямую через видео буфер.
Когда я делаю вот так:
mov ax,0xB800
mov es,ax
mov [es:2],0x0760
Символ появляется на экране(логично).
Но когда я делаю вот так:
mov [0xB8000], 0x0760
Ничего не получается. У меня компилятор nasm. И
я не могу понять в чем причина. Я видел этот код
раньше и думаю что у других людей он работает.
И еще. После возврата и pmode в real mode
строчка:
mov [es:2],0x0760
работает, а строчка:
mov [es:2],ax
перезагружает компьютер. Может регистры надо как-то
настроить?
Заранее благодарен.
e-mail: linuxoid2003@mail.ru
Отправлен: 15.02.2005, 13:04
Вопрос задал: Filt (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Евгений Иванов
Здравствуйте, Filt!
адресация в реальном режиме идёт через сегменты и смещение, причём сегменты размером 64 Кбайт.
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 15.02.2005, 17:07
Отвечает: Bob Johnson
Здравствуйте, Filt!
Ну во-первых, команда mov [0xB8000], 0x0760 неявно использует сегментный регистр ДС, т.е. в реальности адрес выглядит 0xB8000 + ds.base, а во-вторых, в реальном режиме предел сегмента установлен на 64К, что не позволяет адресоваться таким огромным числом. Этот код будет работать если у тебя 32-х разрядный режим с базой сегмента 0 и пределом 4Г или ты загрузил в ds такой дескриптор, а потом вернулся в реальный режим.
На счет второй части сказать сложно - смотри, куда у тебя показывает es и что за число в ах.
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 15.02.2005, 18:21