div.main {margin-left: 20pt; margin-right: 20pt}БРОУЗЕРЫ И ОПЕРАЦИОНКИ СТУЧАТ НА НАС...
Скачать
патч
О том, что многие программы, которыми мы
пользуемся, имеют обыкновение идентифицировать нашу систему в сети
знают многие, но не многие не знают как это происходит. В этой
статье я постараюсь рассказать, какие программы могут выдавать на
запросы WEB серверов версию вашей операционки, вашего броузера и
версии так называемой мозиллы(Mozilla). И объясню, как избавится от
столь бесцеремонного поведения вашей ОС или программы и напишем
программу, которая для этого будет модифицировать необходимые
библиотеки. Сначала я расскажу о самой проблеме в общем, а затем от
Unix/Linux перейдем к Windows. И так о самой проблеме. Собственно
она возникает в большенстве случаев при WEB серфинге, когда сервер
запрашивает у броузера описание сервиса сделавшего запрос на этот же
сервер. Например, вводим в InternetExplorer'e ссылку
http://www.hosting.ru/, после этого наш броузер делает
соответствующий запрос на сервер www.hosting.ru, сервер
www.hosting.ru записывает сделанный нами запрос в свои лог файлы.
Например, в лог файле администратор может потом увидеть: "GET /
HTTP/1.1" - "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT
5.0)" или xxx.x.x.xx - - [28/Jun/2001:00:14:34 +0400] "GET /
HTTP/1.1" 200 1673 "-" "Mozilla/4.0 (compatible; MSIE 4.01;
Windows 98)" или xxx.x.x.xx - - [30/Jun/2001:00:25:16 +0400]
"GET / HTTP/1.1" 200 1673 То, что запишется в лог файл,
определяется конфигурацией самого веб сервера и соответственно
форматом записи в лог файл(ы). Интересна часть лог файла, где
записано описание User-Agent'a пользователей. User-Agent - это
обычно название броузера плюс название операционной системы, а
иногда что-нибудь еще... Выдача User-Agent запроса в разных
операционках реализована по разному, но все же имеет место, хотя бы
просто как символ пробела, так как иногда сервера не станут отвечать
на запросы не получив ответ на собственный запрос об User- Agent.
Функция User-Agent иногда очень полезна, а иногда совсем не
желательно, как вы понимаете, все зависит от ситуации. Начнем по
порядку. В Unix/Linux на запрос о User-Agent отвечает какая-то
часть самого броузера, а не на уровне http соединения. Это значит,
что мы всегда можем в исходном коде программы найти фрагмент, где
будет описание User-Agent. Реализован фрагмент кода может быть
по-разному, например, брать данные из файлов конфигурации или из
памяти или же данные будут уже "зашиты" в исходном коде в виде
текстовой строки. Достаточно найти фрагмент GET запроса и посмотреть
как он реализован, тогда станет ясно, как будет выдаваться запрос о
User-Agent. Если же вы не располагаете исходным кодом программы, то
постарайтесь его достать. Это даст вам широкое поле для развлечения
с функцией User-Agent. Например, достаточно забавно было бы сделать
ее динамической и каждый ответ на запрос о User-Agent будет
уникальным, что-то типа фразы дня...;-) Уже скомпилированная
программа легко модифицируется редактором двоичных файлов, самая
распространенная под Unix/Linux это hexedit. Чтобы узнать какую
строку отредактировать, достаточно запустить Apache со строками в
httpd.conf: LogFormat "%h %l %u %t "%r" %>s %b
"%{Referer}i" "%{User-Agent}i"" combined CustomLog
logs/strings_search.log combined Затем зайти по локальному адресу
на ваш сервер с того броузера, который вы хотите модифицировать.
Затем посмотрите strings_search.log и там будет видно, что именно
придется поискать в бинарниках программы. После редактирования вновь
зайдите на свой локальный веб сервер и посмотрите, то, что вы
оставили в лог файле. Если результат вас удовлетворил, то можете
быть уверены, что на других веб серверах будет тот же результат.
Однако будьте внимательны при редактировании двоичных файлов, ваша
новая строка должна по количеству символов быть равна той, что была
до нее, иначе вы испортите сегмент данных и программа будет работать
не корректно или вообще зависнет. User-Agent может быть полезен для
идентификации в сети, где IP адрес сменить проще, чем внести
изменения в код программы, тем сам можно четко идентифицировать
компьютер посетивший ваш веб сервер. Достаточно придать User-Agent
уникальное значение. Все эти манипуляции с изменением кода броузера
нужны только для враждебно настроенных программ, в системах типа
Unix/Linux чаще всего в броузерах есть опция позволяющая менять
значение поля User-Agent. Один из таких броузеров это LYNX, каждый
пользователь может настроить его по своему желанию. Теперь
перейдем системам на базе MS Windows. Тут как обычно все значительно
сложнее, но дело поправимо.;*P Во всех версиях Windows при установке
Internet Exlorer устанавливается библиотека, отвечающая за функцию
User-Agent. Называется она URLMON.DLL и в Windows 9x/ME находится в
системной директории windows/system, а в Windows NT/2000 в системной
директории windows/system32. В принципе не составляет труда найти
эту dll, используя поиск. К этой библиотеке обращается не только IE,
но и другие программы использующие http запросы. Это как раз тот
случай, когда функция User-Agent оказывается системной. Эта dll
подгружается вместе с другими системными библиотеками и как вы
понимаете отредактировать вы ее напрямую не сможете, так как файл
будет занят. Однако мы может посмотреть ее содержимое, там сразу
будет видны строки User-Agent. Чем старше версия MSInternetExplorer,
тем сложнее функция User-Agent и в ручную редактировать файл может
быть очень не удобным. К тому же urlmon.dll от версии к версии MSIE
может меняться. Поэтому я решил написать программу, которая
автоматически будет убирать все сообщения из User-Agent для любой
версии urlmon.dll. Программа написана на tasm3.0 исходный код
занимает 11658 байт, а готовый исполняемый код 2675 байт. Именно
поэтому я и отдал предпочтение tasm'у. Если несколько способов
обхитрить "глупую" windows и внести изменения в urlmon.dll. Первый
способ подходит для Windows 95, Windows 98, Windows ME. Нужно
скопировать patcher.exe в туже директорию что urlmon.dll и
загрузиться с системной дискеты и перейдя в директорию с urlmon.dll
запустить patcher.exe. Способ может подойти к NT4.0, если только NT
стоит на FAT16, а не на NTFS, и грузиться надо будет с системной
дискеты от windows 95, 98 или ME, потом дальше по намечаному плану.
Для NT4.0 на NTFS, если элегантный способ заменить urlmon.dll на
модифицированную копию. Для этого скопируйте оригинальную копию
urlmon.dll в корень диска C, затем запустите patcher.exe в том же
каталоге. Затем в системной директории(обычно WINNT) в каталоге
SYSTEM32 создайте файл autoexec.nt и запишите в него следующую
строку: copy c:urlmon.dll
c:winntsystem32urlmon.dll Конечно, вы могли установить Windows
NT в другой каталог отличный от C:WINNT, тогда вам нужно заменить
c:winnt на свой каталог. Однако Windows NT может кэшировать свои
файлы и при их изменении заменять их резервной копией. Поэтому вам
нужно будет найти путь, по которому находятся закэшированные файлы и
добавить перед нашей строкой в autoexec.nt эту строку: copy
c:urlmon.dll <адрес кешированных файлов>urlmon.dll Вообще
адрес кэшированных файлов обычно находится в
c:winntsystem32DllCache. После чего смело перезагружайтесь и все
должно получиться. С Windows 2000 вам предстоит то же самое, если
она стоит на NTFS, если же на Win2k разместилась на FAT32, то
действует по принципу Win9x/ME. После перезагрузки Windows станет
упорно сопротивляться новым изменениями и попросит заменить новый
файл файлом с установочного диска. Windows 2000 имеет на вооружении
систему аварийного консольного восстановления. Для этого нужно из
установочного каталога I386 запустить следующую
команду: winnt32.exe /cmdcons Windows2000 создаст аварийную
копию загрузчика, после чего перезагрузит компьютер. Загрузившись в
новом режиме, вы попадете в консольный режим и сможете внести
интересующие вас изменения. Чтобы удалить новый режим загрузки,
загрузитесь в обычном режиме, затем удалите директорию Cmdcons, и
файл Cmldr из корня диска и в Boot.ini удалите строку аварийной
загрузки. После перезагрузки попробуйте найти в вашем urlmon.dll
строку Mozilla, если ее нет, то все прошло удачно. Есть еще более
изощренные способы модифицировать занятые приложениями библиотеки,
но они, как правило, еще более сложные. Теперь мне хотелось бы
рассказать о том, что делает моя программа c urlmon.dll. Программа
открывает файл для записи и чтения, после чего сверху вниз делает
поиск фраз "Mozi","Win3","Windows ","MSIE ". Как видите это только
части фраз, искать фразы до конца нет смысла, так как данного набора
символов достаточно для того чтобы найти уникальную фразу целиком.
После того как первая фраза найдена программа сообщает смещение, по
которому находится эта фраза, затем осуществляется забивание
найденной фразы пробелами. Так как фраза может повторяться, то поиск
каждой фразы осуществляется до конца файла, затем идет переход на
поиск следующей фразы и так далее... Заранее прошу прощения за
довольно трудно читаемый и совершенно не оптимизированный код.
Однако программа работает сносно, увеличить скорость поиска можно
было бы в 4-5 раза, но так как сами все версии urlmon.dll не больше
500кб, то ожидание в несколько секунд не страшно. Теперь перейдем к
самому коду:
;-------------------------------------------------------
ideal
model small
assume cs:@code, ds:@data, ss:@stack
codeseg
P386 ;Включаем поддержку 32 битного режима.
PUBLIC OpenFile, Smeshenie, Chtenie, PutByte, SaveIni, UnSave, Zero,
Search, Poisk, Cursor, Clr, GdePut, Biting, Convert
start:
mov ax,@data ;Адресуем
mov ds,ax ;сегмент данных
call Clr ;Вызов подпрограммы отчистки экрана.
call Poist ;Вызов подпрограммы сообщений перед поиском.
call OpenFile ;Вызов подпрограммы открытия файла.
cmp al,002h ;Проверяем регистр al на наличие файла.
jne new_starе ;Если не равно 02, то файл существует,
;переход на метку new_start
mov dx,offset fnotf ;Готовим к выводу сообщение о том что файл не найден.
jmp edited ;Переходим в самый конец программы, чтобы вывести
;сообщение и выйти.
new_start:
call UnSave ;Вызов подпрограммы обнуления смещений, если поиск первых
;двух символов окончился, тем что они являлись частью
;совершенно не нужной нам фразы.
again:
mov [otschet],04200h ;Готовим подпрограмму смещения к смещению от начала
call Smeshenie ;файла. И сразу вызываем эту подпрограмму.
pushf ;Сохраняем все флаги в стеке перед наращиваниями.
push eax ;Сохраняем регистр в стеке.
mov eax,[rehex] ;Заносим текущее значение смещения в регистр eax.
inc eax ;Увеличиваем регистр на единицу.
mov [rehex],eax ;Заносим значение eax в переменную rehex.
pop eax ;Восстанавливаем значение регистра eax.
inc [naskolko] ;Наращиваем текущее значение смещения в файле.
cmp ax,0ffffh ;Проверяем не переполнится ли значение смещения,
jne @@barri ;если нет, то переходим на метку @@barri.
inc [hexcounte] ;Заодно записываем количество переполнений, чтобы
;потом суметь переместиться больше чем на FFFF.
@@barri:
popf ;Восстанавливаем флаги.
call Chtenie ;Вызов подпрограммы чтения символа из текущей позиции
;для его последующей проверки.
cmp [msie],001h ;Проверяем на флаг MSIE. Влаг равен 1, если нужно
je msiee ;осуществлять поиск фразы MSIE. Но с начала флаг равен
;0, так как не было поиска фразы "Windows ". Если флаг
;равен 1, то осуществляем переход на метку msiee
cmp [win9x],001h ;Проверяем на флаг win9x. Влаг равен 1, если нужно
je wind9x ;осуществлять поиск фразы "Windows ". Но с начала флаг
;равен 0, так как не было поиска фразы "Win3". Если флаг
;равен 1, то осуществляем переход на метку wind9x
cmp [win32],001h ;Проверяем на флаг win32. Влаг равен 1, если нужно
je wind32 ;осуществлять поиск фразы "Win3". Но с начала флаг
;равен 0, так как не было поиска фразы "Mozi". Если флаг
;равен 1, то осуществляем переход на метку wind32
cmp al,000h ;После чтения сверяем значение в регистре al, если оно
je kones ;равно нулю, то файл кончился. И будет осуществлен
;переход на метку kones.
mov ax,[byte_00] ;Заносим в регистр ax прочтенный символ из byte_00.
mov dx,[naskolko] ;Заносим в dx значение текущего смещения из naskolko.
mov cx,[hexcounte] ;Заносим в cx значение количество переполнений dx.
cmp al,'M' ;Сверяем регистр al с буквой M. Если al не = M, то
jne again ;переход на again, чтобы опять сместиться на
;следующий символ, потом считать его и опять сверить
;с буквой M.
call Search ;Вызов подпрограммы индикатора поиска '/',''.
call SaveIni ;Сохранение текущего смещения совпавшего символа в
;дополнительных переменных, так как это смещение может
;оказать началом реального смещения фразы 'Mozi'.
inc [numera] ;Увеличиваем значение переменной numera в которой будет
;хранится количество символов во фразе Mozi. Mozi это
;часть возможного длинного предложения 'Mozilla/4.0
;(MSIE 4.01; Win32; Windows 98)'. Поэтому мы включаем
;счетчик найденных символов, чтобы потом знать сколько
;символов от смещения фразы забить пробелами в подпро-
;грамме PutByte.
call Chtenie ;Вызываем подпрограмму Chtenie, чтобы прочесть
;следующий символ. Здесь мы пропускам подпрограмму
;Smeshenie так как на этом этапе это не нужно.
mov ax,[byte_00] ;Повторяем операцию пересылки нового символа из byte_00.
;В byte_00 новый символ появляется после вызова подпро-
;граммы Chtenie, так как она заносит в Byte_00 считанный
;символ.
cmp al,'o' ;Сравниваем al с буквой 'o'.
jne new_start ;А вот теперь мы не станем переходить на метку again,
;так как она не содержит программы воостановления
;смещения после не удачного поиска фразы. А на метке
;new_start есть вызов подпрограммы, которая восстанав-
;ливает значение смещения после SaveIni. В результате
;программа продолжит поиск, но уже пропустит этот
;момент с ложной фразой.
inc [numera] ;Увеличиваем кол-во символов при удачном сравнении.
call Smeshenie ;А вот теперь смещение нам необходимо чтобы прочесть
;следующий символ иначе подпрограмма Chtenie будет
;топтаться на месте.
;ДАЛЬШЕ Я ПРОПУЩЮ, ТАК КАК НЕТ СМЫСЛА ОПИСЫВАТЬ ОДНО И ТОЖЕ.
call Chtenie
mov ax,[byte_00]
cmp al,'z'
jne new_start
inc [numera]
call Smeshenie
call Chtenie
mov ax,[byte_00]
cmp al,'i'
jne new_start
inc [numera]
;И ТАК ПРОДОЛЖИМ НАШИ ИЗЫСКАНИЯ;)
@@donulla:
inc [numera] ;Заранее увеличиваем numera, так как этого требует
;будущий цикл.
call Smeshenie ;Опять смещаемся на один символ.
call Chtenie ;Читаем очередной символ.
mov ax,[byte_00] ;Заносим очередной символ в ax.
cmp al,'"' ;Сравниваем al с ковычкой '"'. Это нужно чтобы определить
;псевдо конец фразы 'Mozilla.......', так как в каждом
;urlmon.dll имеется такая фраза, но для реестра и не
;разделяется символов нуля(00h), а разделяется как вы
;наверное, уже догадались символом кавычки.
je reestr ;Это как раз переход на метку reestr, если al=".
cmp al,000h ;Сравнение al с 0. Это нужно для случая, когда фраза не
;является реестровой и будет кончаться абсолютным нулем.
jne @@donulla ;Если al не = 0, то переходим на метку @@donulla. Тем самым
;поддерживает цикл подсчета символов во вразе 'Mozi....'.
reestr:
call GdePut ;Это вызов подпрограммы, которая подсчитывает смещение начала
;100% найденной фразы. После этого конвертирует из HEX формата
;в ASCII и выводит смещение на экран.
pushf ;Сохраняем флаги перед уменьшением переменных.
dec [numera] ;Уменьшаем на еденицу значение переменных numera и hexupd.
dec [hexupd] ;Это нужно для корректировки после программы подсчета символов
;и начального смещения.
popf ;Восстанавливаем флаги.
mov ax,[hexcount] ;Переносим значение переменной hexcount посредством
mov [hexcounte],ax ;регистра ax в переменную hexcounte. Это нужно для
;предстоящего момента перед смещением начала искомой
;фразы.
mov [otschet],04200h ;Готовим подпрограмму смещения для отсчета от начала
;файла.
mov ax,[hexupd] ;Переносим значение hexupd в naskolko, для предстоящего
mov [naskolko],ax ;смещения.
call Smeshenie ;Вызов подпрограмма смещения. Переменная hexcounte будет
;присвоена cx, а naskolko dx. В cx хранится количество раз
;по FFFFh от точки отсчета, а в dx добавочное смещение после
;смещений cx. Короче общее смещение будет CX*65536+DX.
call PutByte ;Вызов подпрограммы записи символов. Тоесть мы сместились
;на CX*65536+DX, после чего записали DX символов. В
;подпрограмме в dx помещается значение numera равное
;кол-ву найденных символов.
push eax ;Сохраняем в стеке eax.
mov eax,[rehex] ;Заносим в eax значение rehex.
dec eax ;Уменьшаем значение eax на единицу.
mov [rehex],eax ;Сохраняем новое значение eax в переменную rehex.
pop eax ;Восстанавливаем из стека eax. Это кусок кода компенсирует
;возникающую погрешность при дальнейшем поиске повторений
;фразы.
jmp new_start ;Переход на метку new_start для продолжения поиска повторений
;фразы в файле urlmon.dll
kones: ;На эту метку будет осуществлен переход, когда кончится файл,
;а кончится он тогда когда поиск повторений фразы дойдет до
;конца файла.;)
mov [win32],001h ;Немедленная установка флага win32 в единицу, чтобы после
;наращивания смещения сместится на метку wind32, а не
;зациклиться на поиске уже не существующей фразы 'Mozi......'.
call Zero ;Обнуление переменных смещения и подсчетов.
jmp new_start ;Немедленный переход на метку new_start, чтобы начать поиск
;уже следующей фразы 'Win3'.
wind32:
cmp al,000h ;Проверяем, не кончился ли файл, чтобы перейти к поиску.
je wind32kones ;Если al = 0, то опускаемся до поиска новой фразы.=)
;Повторяем действия из поиска первой фразы.
mov ax,[byte_00]
mov dx,[naskolko]
mov cx,[hexcounte]
;ДАЛЕЕ ВСЕ ПРИМЕРНО ОДИНКОВО. ПОИСК, ПОДСЧЕТ, СМЕЩЕНИЕ, ЗАПИСЬ....
;ПОЭТОМУ ОБЪЯСНЯТЬ ДАЛЬШЕ БУДУ, ТОЛЬКО ПОДПРОГРАММЫ.
cmp al,'W'
jne again ;Ishim eshe, esli ne sovpadayt
call Search
call SaveIni
inc [numera]
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'i'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
call Smeshenie ;Peremeshaemsa na sledyyshii symvol
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'n'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
call Smeshenie ;Peremeshaemsa na sledyyshii symvol
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'3'
jne new_start ;Ishim eshe, esli ne sovpadayt
pushf
inc [numera]
inc [numera]
inc [numera]
popf
jmp reestr
wind32kones:
mov [win9x],001h
call Zero
jmp new_start
wind9x:
cmp al,000h
je realend
mov ax,[byte_00]
mov dx,[naskolko]
mov cx,[hexcounte]
cmp al,'W'
jne again
call Search
call SaveIni
inc [numera]
call Chtenie
mov ax,[byte_00]
cmp al,'i'
jne new_start
inc [numera]
call Smeshenie ;Peremeshaemsa na sledyyshii symvol
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'n'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
call Smeshenie ;Peremeshaemsa na sledyyshii symvol
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'d'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
call Smeshenie ;Peremeshaemsa na sledyyshii symvol
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'o'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
call Smeshenie ;Peremeshaemsa na sledyyshii symvol
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'w'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
call Smeshenie ;Peremeshaemsa na sledyyshii symvol
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'s'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
call Smeshenie ;Peremeshaemsa na sledyyshii symvol
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,' '
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
untilzero:
inc [numera]
call Smeshenie
call Chtenie
mov ax,[byte_00]
cmp al,000h
jne untilzero
jmp reestr
realend:
mov [msie],001h
call Zero
jmp new_start
msiee:
cmp al,000h
je realhalt
mov ax,[byte_00]
mov dx,[naskolko]
mov cx,[hexcounte]
cmp al,'M'
jne again ;Ishim eshe, esli ne sovpadayt
call Search
call SaveIni
inc [numera]
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'S'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'I'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
call Chtenie ;Schitivaem dva simvola
mov ax,[byte_00] ;Sopostavliaem dva simvola s iskomimi
cmp al,'E'
jne new_start ;Ishim eshe, esli ne sovpadayt
inc [numera]
jmp untilzero
realhalt:
mov ax,@data
mov ds,ax
mov [strok],15
mov [stolbsov],0
call Cursor
mov dx, offset enddead
cmp [bodyrock],001h
je edited
mov [strok],7
mov [stolbsov],0
call Cursor
mov dx, offset endloze
edited:
mov ah,009h
int 021h
mov ax,04C00h ;ВЫХОДИМ В ИЗ ПРОГРАММЫ И ЗАКРЫВАЕ ФАЙЛ.
int 021h
;---------------------------THECALLS------------------------------------
PROC OpenFile ;Открытие файла.
mov ah,3dh ;В ah заносим 3D, функция открытия файл.
mov al,2 ;В al заносим 02, открываем файл для чтения и записи.
mov dx,offset urlmon ;В dx заносим адрес названия открываемого файла.
int 21h
ret
ENDP OpenFile
PROC SaveIni ;Сохраняем смещения и готовим подпрограмму смещения к смещению
;не от конца файла, а от той точки отсчета на которой в данный
;момент находится смещение.
push eax ;Сохраняем в стеке eax
mov eax,[rehex] ;Значение rehex в eax.
dec eax ;Уменьшили на один значение eax.
mov [SavRehex],eax ;Зарезервировали значение eax в SavRehex.
pop eax ;Восстановили значение eax из стека.
mov ax,[hexcounte] ;Значение hexcounte в ax
mov [hexcount],ax ;Значение ax резервируем в hexcount
mov ax,[naskolko] ;Значение naskolko в ax
mov [hexupd],ax ;Значение ax резервируем в hexupd
mov [otschet],04201h ;Заносим в otschet 4201h, смещение от текущей позиции.
mov [naskolko],00000h ;Заносим в naskolko 0, будем смещается на 1 символ.
mov [hexcounte],00000h ;Заносим в hexcounte 0, обнулили CX для CX*0+DX
ret
ENDP SaveIni
PROC UnSave ;Восстановление значений переменных после действия SaveIni
mov ax,[hexcount] ;Заносим hexcount в ax
mov [hexcounte],ax ;Заносим ax в hexcounte
mov ax,[hexupd] ;Заносим hexupd в ax
mov [naskolko],ax ;Заносим ax в naskolko
mov [otschet],04200h ;Заносим в otschet 4200h, смещение от начала файла.
mov [numera],00000h ;Заносим в numera 0, обнулили счетчик найденных символов.
ret
ENDP UnSave
PROC Chtenie ;Читаем символ из файла.
mov ah,03Fh ;В ah 3F, функция считывания из файла.
mov bx,[FileNumber] ;В bx FileNumber - адрес файла.
mov cx,[baitov] ;В cx значение baitov, кол-во считываемых символов.
mov dx, offset byte_00 ;В адресуем считанный символ из dx в byte_00
int 021h
ret
ENDP Chtenie
PROC PutByte ;Записываем символ(ы) из файла.
mov [bodyrock],001h ;Ставим флаг bodyrock в 1, значит, файл был отредактирован.
mov ah,040h ;В ah 40h, функция записи в файл.
mov bx,[FileNumber] ;В bx FileNumber - адрес файла.
mov cx,[numera] ;В cx numera, кол-во записываемых символов.
mov dx,offset puters ;Адресуем в dx puters, символы для записи(пробелы).
int 021h
ret
ENDP PutByte
PROC GdePut ;Программа перевода смещения в ASCII и вывод его на экран.
push eax ;Здесь сохраняются все флаги и часть регистров.
push ebx
push ecx
push edx
pushf
inc [bitty] ;Наращивание позиции вывода символа.
mov ah,[bitty] ;Перенос значения в ah
mov [strok],ah ;Перенос значения ah в strok, номер строки курсора.
mov [stolbsov],9 ;9 в stolbsov, номер столбца курсора.
call Cursor ;Вызов подпрограммы позиционирования курсора.
mov ebx, offset SavRehex ;Адресация в eax 32-битного значения переменной
;SaveRehex.
;У нас в SavRehex находится 32 значение смещения, напрямую извлечь его нельзя,
;поэтому мы будет обращаться от старшей части этих значений к нижней.
;Получив байт состоящий из старшей и младшей части, мы конвертируем их
;последовательно от старшего к младшему и тут же выведем его на экран, затем
;берем следующий более младший байт и так далее, пока не кончится SaveRehex.
mov al,[ebx + 3] ;Перенос в al байта номер 4 из SaveRehex через eax.
and al,0F0h ;Оставляет в al только старшую часть байта.
call Convert ;Вызов программа конвертирования в ASCII
call Biting ;Не петинг!=)) Битинг, вывод символа на экран.
mov al,[ebx + 3] ;Перенос в al байта номер 4 из SaveRehex через eax.
and al,0Fh ;Оставляет в al только младшую часть байта.
call Convert ;Вызов программа конвертирования в ASCII
call Biting ;Вывод символа на экран.
;И ТАК ДАЛЕЕ И ТОМУ ПОДОБНОЕ ДО СКОНЧАНИЯ SAVEREHEX.
mov al,[ebx + 2]
and al,0F0h
call Convert
call Biting
mov al,[ebx + 2]
and al,00Fh
call Convert
call Biting
mov al,[ebx + 1]
and al,0F0h
call Convert
call Biting
mov al,[ebx + 1]
and al,00Fh
call Convert
call Biting
mov al,[ebx + 0]
and al,0F0h
call Convert
call Biting
mov al,[ebx + 0]
and al,00Fh
call Convert
call Biting
popf ;Восстанавливаем все флаги и часть регистров.
pop edx
pop ecx
pop ebx
pop eax
ret
ENDP GdePut
PROC Biting ;Вывод символа на экран.
mov ah,002h ;В ah 02h, функция вывода символа на экран.
int 021h
ret
ENDP Biting
PROC Smeshenie ;Программа смещения в файле.
push cx ;Сохраняем в стеке cx
mov cx,[hexcounte] ;Заносим в cx значение hexcounte, количество CX на 65536
mov [FileNumber],00005h ;Напоминаем file handle.;P
mov ax,[otschet] ;В ax otschet, отсчет от начала или с текущей позиции.
mov bx,[FileNumber] ;Напоминаем file handle
mov dx,[naskolko] ;В dx naskolko, кол-во байт для смещения.
int 021h
pop cx
ret
ENDP Smeshenie
PROC Zero ;Обнуление всех счетчиков
push eax
mov eax,000000000h
mov [rehex],eax
mov [hexcounte],00000h
mov [hexcount],00000h
mov [hexupd],00000h
mov [otschet],04200h
mov [hexsave],00000h
mov [naskolko],00000h
pop eax
ret
ENDP Zero
PROC Search ;Программа индикации поиска.
push dx ;Сохраняем dx и ax и все флаги.
push ax
pushf
mov [strok],5 ;Позиция строки номер 6
mov [stolbsov],12 ;Позиция столбца номер 13
call Cursor ;Вызов подпрограммы для позиционирования.
mov dl,'' ;В dl '', вывести вертушку.
cmp [serfing],0000h ;Если флаг serfing = 0, то оставляем ''
je serf1 ;Переход на serf1, если равны.
mov dl,'/' ;Если serfing не = 0 и не было перехода в dl '/'
mov [serfing],0000h ;Меняем флаг serfing, чтобы сменить вертушку.
jmp serf2 ;Прыгаем на вывод вертушки.
serf1:
mov [serfing],0001h ;Меняем флаг serfing, чтобы сменить вертушку.
serf2:
mov ah,002h ;Готовимся к выводу символа.
int 021h ;Выводим
popf ;Восстанавливаем все флаги и ax,dx
pop ax
pop dx
ret
ENDP Search
PROC Poisk ;Вывод уведомления о начале поиска.
push dx ;Сохраняем dx,ax и все флаги.
push ax
pushf
mov [strok],1 ;Строка номер 2.
mov [stolbsov],0 ;Столбец номер 1.
call Cursor ;Позиционируем курсор.
mov dx, offset menuz ;Адресуем menuz в dx для вывода сообщения.
mov ah,009h ;В ah 09h функция вывода сообщения.
int 021h ;Вывод сообщения.
mov dx, offset Poiski ;Адресуем Poiski в dx для вывода сообщения.
int 021h ;Выводим сообщение 'Searching:'
popf ;Восстанавливаем все флаги и ax,dx.
pop ax
pop dx
ret
ENDP Poisk
PROC Cursor ;Программа позиционирования курсора.
push ax ;Сохранка регистров и всех флагов.
push bx
push dx
pushf
xor bh,bh ;Обнуляем bx, страница номер 0.
mov ah,2 ;В ah 02h, функция позиционирования курсора.
mov dh,[strok] ;В dh strok, номер строки.
mov dl,[stolbsov] ;В dl stolbsov, номер столбца.
int 010h ;10 прерывание, работа с видео режимом.
popf ;Восстановление всех флагов и регистров.
pop dx
pop bx
pop ax
ret
ENDP Cursor
PROC Convert ;Программа конвертирования символов.
cmp al,000h ;Если в AL 0, то в DL 30h(0)
jne @@10 ;Иначе переход на следующее сравнение
mov dl,030h ;В dl 30h в ASCII это 0.
jmp @@end ;Прыгаем в место конца для возврата из подпрограммы.
@@10: ;Метка следующего символа.
;И так далее и тому подобное.....
cmp al,010h
jne @@11
mov dl,031h
jmp @@end
@@11:
cmp al,020h
jne @@12
mov dl,032h
jmp @@end
@@12:
cmp al,030h
jne @@13
mov dl,033h
jmp @@end
@@13:
cmp al,040h
jne @@14
mov dl,034h
jmp @@end
@@14:
cmp al,050h
jne @@15
mov dl,035h
jmp @@end
@@15:
cmp al,060h
jne @@16
mov dl,036h
jmp @@end
@@16:
cmp al,070h
jne @@17
mov dl,037h
jmp @@end
@@17:
cmp al,080h
jne @@18
mov dl,038h
jmp @@end
@@18:
cmp al,090h
jne @@19
mov dl,039h
jmp @@end
@@19:
cmp al,0A0h
jne @@20
mov dl,041h
jmp @@end
@@20:
cmp al,0B0h
jne @@21
mov dl,042h
jmp @@end
@@21:
cmp al,0C0h
jne @@22
mov dl,043h
jmp @@end
@@22:
cmp al,0D0h
jne @@23
mov dl,044h
jmp @@end
@@23:
cmp al,0E0h
jne @@24
mov dl,045h
jmp @@end
@@24:
cmp al,0F0h
jne @@25
mov dl,046h
jmp @@end
@@25:
cmp al,009h
jg @@26
or al,030h
mov dl,al
jmp @@end
@@26:
cmp al,00Ah
jne @@27
mov dl,041h
jmp @@end
@@27:
cmp al,00Bh
jne @@28
mov dl,042h
jmp @@end
@@28:
cmp al,00Ch
jne @@29
mov dl,043h
jmp @@end
@@29:
cmp al,00Dh
jne @@30
mov dl,044h
jmp @@end
@@30:
cmp al,00Eh
jne @@31
mov dl,045h
jmp @@end
@@31:
cmp al,00Fh
jne @@32
mov dl,046h
jmp @@end
@@32:
@@end:
ret
ENDP Convert
PROC Clr ;Программа отчистки экрана.
push ax ;Сохранение регистров ax,dx и всех флагов.
push dx
pushf
mov [strok],0 ;Начальное значение строки 0.
mov [stolbsov],0 ;Начальное значение столбца 0.
@@chistim:
cmp [strok],24 ;Сравниваем strok с 24
jne @@chistimdalee ;Если не равно, то переход на @@chistimdalee.
;А если нет, то идем далее.
inc [stolbsov] ;Увеличиваем stolbsov на один
mov [strok],000h ;Заносим в strok ноль.
cmp [stolbsov],79 ;Сравниваем stolbsov с 79
je @@ochistili ;Если равно, то переход на @@ochistili.
@@chistimdalee:
Call Cursor ;Позиционируем курсор.
inc [strok] ;Увеличиваем strok
mov dl,' ' ;Заносим в dl символ пробела.
mov ah,002h ;Готовим ah к выводу пробела.
int 021h ;Выводим пробел.
jmp @@chistim ;Прыгаем на метку @@chistim
@@ochistili:
popf
pop dx
pop ax
ret
ENDP Clr
dataseg
bitty db 005h
rehex dd 000000000h
SavRehex dd 000000000h
strok db 000h
stolbsov db 000h
serfing dw 00000h
bodyrock db 000h
endloze db "Searching is finished, but nothing was finded!",0dh,0ah
db "May be file already patched or has not needed strings...",0dh,0ah,"$"
enddead db "Searching is finished! ",0dh,0ah
db "Your System was sucessfull patched! ;)",0dh,0ah,"$"
Poiski db "Searching: ",0dh,0ah,"Offsets: ????????",0dh,0ah,"$"
fnotf db "OOPS... File URLMON.DLL not found!",0dh,0ah
db "Patcher must be in one directory with URLMON.DLL",0dh,0ah,"$"
msie db 000h
win9x db 000h
win32 db 000h
baitov dw 00001h
naskolko dw 00000h
otschet dw 00000h
hexsave dw 00000h
hexupd dw 00000h
hexcount dw 00000h
hexcounte dw 00000h
puters db 100 DUP (' ')
numera dw 00001h
byte_00 dw 00000h
urlmon db "urlmon.dll",0
menuz db "GiN Group (c) 2001. Shaitan@gin.sh",0dh,0ah
db "Th|s |s PaT(H f0R aNy versions 0f URLMON.DLL !!!",0dh,0ah
db "After patching your system will free from USER-AGENT request!",0dh,0ah
db "And Adminz will never seen your version of Explorer, Windows or Mozzila",
0dh,0ah,"$"
FileNumber dw ?
STACK 200h
END Start
;-----------------------------------------------------------------------------
Как вы заметили данная, программа имеет много
мест, где можно сократить время поиска, конвертирования или вывода
символов. Посимвольный поиск символов, можно заменить увеличить в
3-4 раза за счет использования 32 битных регистров. Кроме того,
проскакивают лишние команды, и даже переменные;PP Честно говоря, я
ставился целью написать самый быстрый и компактный код года, все это
я компенсировал мощью ассемблера. Как только доберусь до ассемблера
под windows, то, скорее всего, стану уделять больше внимания при
написании программ. В прикрепленном архиве имеется рабочий исходник
и готовый exe файл. Кстати говоря, так как программе лучше
живется из-под DOS'a, то перед запуском ее из windows лучше создайте
*.PIF файл(Создать ярлык) и свойствах ярлыка уберите галочку с
"Закрывать окно после завершения сеанса MS-DOS". Удачи всех и
творческих успехов.
Shaitan [GiN]//
2001
|