А кто подскажет мне?У меня есть строка 00450281-89 8e 08 0b 00 00 -mov [esi+00000b08],ecx, где 00450281 - адрес, 89 8e 08 0b 00 00-маш.команды,mov [esi+00000b08],ecx команды asm.Как мне изменить 89 8e 08 0b 00 00 вот эту команду на 9b 00 00 00 00 90 по средставм asm.Не могу понять(
MTV, самый простой метод - файловый меппинг. WinAPI - CreateFileMapping, MapViewOfFile. Проецируем в оперативку нужную программу. По адресу 00450281 банальным movsb перезаписываем 6 байт на "9b 00 00 00 00 90". Это довольно таки сложно будет освоить, т.к. по файловому меппингу я вообще инфы в и-нете не видел, да и к тому же нужно понимать что такое плоская модель, и как загрузчик размещает программу в ОЗУ. Можно конечно и другим методом - CreateFile, SetFilePointer, WriteFile. Но тогда придется вычислить физический адрес, т.к. 00450281 - это виртуальный.
Тут вот такая трабла.Написал я ренэймер,все нормально скомпилился.Но при запуске пишет "Ошибка приложения память не может быть read... и т.д."(Вот собственно исходник: .386 .model flat, stdcall option casemap :none ; case sensitive ;######################################################################### include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib ;######################################################################### .data names db "Element Client" FW dd ? MT db "Multi CLient" .code start: invoke FindWindow,0,names push eax pop [FW] invoke SendMessage,FW,WM_SETTEXT,0,MT invoke ExitProcess,0 end start В чем проблема?Заранее благодарен.
а вообще лучше сделай так Code: .386 .model flat, stdcall option casemap:none include include\windows.inc include include\kernel32.inc include include\user32.inc includelib lib\user32.lib includelib lib\kernel32.lib .data name1 db 'Диспетчер задач Windows',0 name2 db 'UHAHAHA!',0 .code start: invoke FindWindow,0,addr name1 invoke SetWindowText, eax,addr name2 invoke ExitProcess,0 end start
Простой (и глупый?) вопрос. Можно ли как-нибудь задать строковую константу / переменную в сегменте кода и вывести ее (но не посимвольно, а через функцию 09h) ?
.model tiny .code org 100h start: mov ah,09 ; 9 функция вывод строк на экран mov dx,offset msg ;строка можно так lea dx,msg int 21h ; прерывание 21 ret msg db "hello world!",0dh,0ah,'$' end start
1. Ничем оно не легче. 2. mov eax,offset metka на 1 байт меньше, чем lea eax,[metka]. От сюда получаем локальную оптимизацию кода. Ну это так, к слову. В основном, да и вообще, других ситуаций в практике не встречал, команду lea используют при написании шелл-кода, дабы вычислять смещения и адреса. Так что если код не является базонезависимым, то лучше писать через offset.
DooD, Не совсем то - я неправильно вопрос поставил. Меня интересует некий самописный аналог printf("hello") (т.е. в итоге - некая реализация на макросах). Для меня проблема в том, что в Асме нельзя вывести константу, не задав ее перед этим как переменную. Во всех примерах, которые я видел, переменные идут либо в сегменте данных, либо в самом начале / конце сегмента кода (иначе не компилируется / выводит мусор и т.д.). Есть ли способ задавать переменную в произвольном месте сегмента кода? И сразу же в догонку "кривой" пример:
если я не ошибаюсь могут быть глобальные переменные в начале или конце кода и локальные в процедурах,по-другому вроде нет.а зачем так делать как ты хочешь?
Похоже, так и есть... Задание у меня такое. Ну, вернее, создание макроса для вывода строки через функцию 09, т.е. что-то вроде printstr <sometext>, но т.к. в произвольном месте объявлять переменную нельзя, то у меня нет идеи нормальной реализации. Я вначале хотел использовать локальные метки в макросах. Т.е. в середине кода вызывается printstr <sometext>, на этапе компиляции "прыгаем" в сегмент данных, там прописываем str1 DB 'sometext', и далее выводим эту строчку. Как-то так. Но как я понял, "прыгать" можно только в прeделах данного макроса, т.е. в сегмент данных я никак не попаду. Поправьте, если не прав.
а ясно,смотри составляешь файл printstr.asm printstr macro strn push ax mov ah,09 mov dx,offset strn int 21h pop ax endm сохраняешь как printstr.asm теперь прога выглядит так .model tiny .code org 100h include printstr.asm start: printstr msg ret msg db "hello world!",0dh,0ah,'$' end start все вот те и макрос или не так ты хотел?
в чём различие между jg и ja ? я понял что jg сравнивает числа со знаком,а ja для сравнения чисел без знака.. а в чём различие этого сравнения?
ну это понятно, что оба сравнивают если больше.... но один сравнивает число со знаком а другой нет... вот когда я сравниваю 6000 со значениями в таблице, по команде ja и jg всё работает, а когда сравниваю 26000 с той же таблицой, команда jg не рабоатет...а ja работает
ja сравнивает числа как есть, т.е. все биты считаются разрядами числа jg сравнивает числа с учетом того, что старший бит - это знак (если он единица, то число отрицательное) Пример для 8-битных чисел: ja: 11010101 > 00001010 (213 > 10) jg: 11010101 < 00001010 (-43 < 10) Можешь почитать про дополнительный код.
felix_v26, посмотри(запомни) какие флаги проверяются.Желательно ещё знать что эти самые флаги означают. Касательно твоего вопроса - CF(carry flag) http://faydoc.tripod.com/cpu/ja.htm