Могу ли я реализовать счетчик в области .text без использования регистров? - PullRequest
1 голос
/ 09 декабря 2011

У меня есть этот ассемблерный код в сегменте .text, возможно ли, что я не могу включить меч, который находится в области .text. если я помещаю меч в место .data, он работает нормально, я имею в виду, когда я переключаю строку:

01004A72 > 813D 664A0001 >CMP DWORD PTR DS:[1004A66],3E7

с линией

 01004A72   > 813D 664A0001 >CMP DWORD PTR DS:[.data:0100579C],3E7



01004A66     0000           ADD BYTE PTR DS:[EAX],AL
01004A68     0000           ADD BYTE PTR DS:[EAX],AL
01004A6A     00             DB 00
01004A6B     00             DB 00
01004A6C     00             DB 00
01004A6D     00             DB 00
01004A6E     00             DB 00
01004A6F     00             DB 00
01004A70     00             DB 00
01004A71     00             DB 00
01004A72   > 813D 664A0001 >CMP DWORD PTR DS:[1004A66],3E7
01004A7C   . 74 06          JE SHORT winmine3.01004A84
01004A7E     FF05 9C570001  INC DWORD PTR DS:[1004A66]
01004A84    ^E9 CDD5FFFF    JMP winmine3.01002056
01004A89     0000           ADD BYTE PTR DS:[EAX],AL
01004A8B     0000           ADD BYTE PTR DS:[EAX],AL
01004A8D     0000           ADD BYTE PTR DS:[EAX],AL
01004A8F     00             DB 00
01004A90     00             DB 00

Ответы [ 3 ]

3 голосов
/ 09 декабря 2011

Сегмент .text предназначен только для чтения. Вы должны использовать .bss .data или stack для изменяемых переменных.

http://en.wikipedia.org/wiki/Code_segment

2 голосов
/ 09 декабря 2011

Область .text обычно доступна только для чтения, поэтому вы не можете записать в нее результаты. Вместо этого вы можете использовать .data или даже стек, если действительно хотите.

0 голосов
/ 09 декабря 2011

Вы можете использовать функцию VirtualProtect, чтобы сделать .text раздел доступным для записи.


Обновление: в отношении угроз безопасности:
Как @Раймонд Чен написал, что страница чтения-записи-выполнения небезопасна.

Злоумышленник может использовать переполнение буфера таким образом, что он перезапишет указатель на другой буфер, а код злоумышленника будет скопирован на страницу чтения-записи-выполнения (RWX).

Но когда вы защищаете свою программу с помощью средства защиты программного обеспечения или просто упаковываете ее с помощью UPX, раздел кода становится доступным для записи.И некоторые популярные коммерческие защитники не делают его обратно без записи.Забавно, если в вашем словаре есть DLL, которая загружается в каждый процесс, и в нем есть разделы RWX.

Я не хочу сказать, что если существует много «защищенных» программ, которым все равнонасчет памяти RWX, так что тебя тоже не волнует.Я просто хочу отметить, что механизмы защиты, такие как DEP, несколько переоценены.

Относительно вопроса OP.
Я не думаю, что это хорошая идея - писать реальные приложения на ассемблере, особенно в Windows, вРежим.Но нормально писать на ассемблере в образовательных целях.И нет ничего плохого в написании программы сборки длиной 100 строк с записываемым фрагментом кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...