821

Изменяем user_agent

Изменяем user_agent"Как ты изменяешь user_agent". Существует 2 варианта, известных мне: 1. В линуксе есть такой симпатичный браузер Konqueror, там в настройках есть такая опция, позволяющая менять user_agent на что угодно. 2. Для пользователей WINDOWS. Очень благодарен господину Shaitan, это его статья сохранена у меня на винте, и она мне очень помогла, когда я в силу некоторых причин отказался от горячо любимого Mandrake, и перешел на WINDOWS. Итак: БРОУЗЕРЫ И ОПЕРАЦИОНКИ СТУЧАТ НА НАС... О том, что многие программы, которыми мы пользуемся, имеют обыкновение идентифицировать нашу систему в сети знают многие, но не многие не знают как это происходит. В этой статье я постараюсь рассказать, какие программы могут выдавать на запросы 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 9" или 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:\winnt\system32\urlmon.dll Конечно, вы могли установить Windows NT в другой каталог отличный от C:\WINNT, тогда вам нужно заменить c:\winnt на свой каталог. Однако Windows NT может кэшировать свои файлы и при их изменении заменять их резервной копией. Поэтому вам нужно будет найти путь, по которому находятся закэшированные файлы и добавить перед нашей строкой в autoexec.nt эту строку: copy c:\urlmon.dll \urlmon.dll Вообще адрес кэшированных файлов обычно находится в c:\winnt\system32\DllCache. После чего смело перезагружайтесь и все должно получиться. С 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 9'. Поэтому мы включаем ;счетчик найденных символов, чтобы потом знать сколько ;символов от смещения фразы забить пробелами в подпро- ;грамме 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",0d
0