Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 我可以在不使用寄存器的情况下在.text区域实现计数器吗?_Windows_Assembly - Fatal编程技术网

Windows 我可以在不使用寄存器的情况下在.text区域实现计数器吗?

Windows 我可以在不使用寄存器的情况下在.text区域实现计数器吗?,windows,assembly,Windows,Assembly,我在.text段中有这个汇编代码,有没有可能我不能在.text区域中包含一个dword。如果我在.data部分放置一些dword,它可以正常工作,我的意思是当我切换线路时: 01004A72>813D 664A0001>CMP DWORD PTR DS:[1004A66],3E7 排队 01004A72 > 813D 664A0001 >CMP DWORD PTR DS:[.data:0100579C],3E7 01004A66 0000 AD

我在.text段中有这个汇编代码,有没有可能我不能在.text区域中包含一个dword。如果我在.data部分放置一些dword,它可以正常工作,我的意思是当我切换线路时:

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

.text
段是只读部分。对于可修改的变量,应使用
.bss
.data或
堆栈


文本部分是只读部分。对于可修改的变量,应使用
.bss
.data或
堆栈


文本区域通常是只读的,因此不能将结果写入。您可以使用
.data
,或者如果您确实需要,甚至可以使用堆栈。

.text
区域通常是只读的,因此您无法将结果写入其中。您可以使用
.data
,或者如果您确实需要,甚至可以使用堆栈。

您可以使用
VirtualProtect
函数使
.text
部分可写


Upd:关于安全风险:
正如@RaymondChen所写,读写执行页面是不安全的

攻击者可以利用缓冲区溢出进行攻击,从而覆盖指向另一个缓冲区的指针,并将攻击者的代码复制到读写执行(RWX)页面

但当您使用软件保护工具保护您的程序时,或者仅使用UPX打包时,代码部分就变得可写。而且,某些流行的商业保护程序不会使其不可写回。如果您的字典有一个加载到每个进程中的DLL,并且它有RWX节,那就很有趣了

我不想说,如果有很多“受保护”的程序不关心RWX内存,那么你也不应该关心。我只想指出,像DEP这样的保护机制被高估了

关于OP问题。

我不认为在汇编中编写真正的应用程序是个好主意,尤其是在windows中,在用户模式下。但出于教育目的,可以在汇编中编写代码。用可写代码段编写100行长的汇编程序没有什么错。

您可以使用
VirtualProtect
函数使
.text
段可写


Upd:关于安全风险:
正如@RaymondChen所写,读写执行页面是不安全的

攻击者可以利用缓冲区溢出进行攻击,从而覆盖指向另一个缓冲区的指针,并将攻击者的代码复制到读写执行(RWX)页面

但当您使用软件保护工具保护您的程序时,或者仅使用UPX打包时,代码部分就变得可写。而且,某些流行的商业保护程序不会使其不可写回。如果您的字典有一个加载到每个进程中的DLL,并且它有RWX节,那就很有趣了

我不想说,如果有很多“受保护”的程序不关心RWX内存,那么你也不应该关心。我只想指出,像DEP这样的保护机制被高估了

关于OP问题。

我不认为在汇编中编写真正的应用程序是个好主意,尤其是在windows中,在用户模式下。但出于教育目的,可以在汇编中编写代码。用可写代码段编写100行长的汇编程序也没什么错。

但你真的不应该这样做。拥有一个可写的
.text
部分将完全否定ASLR和DEP阻止成功利用漏洞的能力。@polymone,
ASLR
?请写出什么是ASLR以及它与内存页保护标志的关系。与
DEP
-“数据执行预防”相同-它与“代码修改预防”不同,对吗?DEP使攻击者更难,因为它意味着默认情况下系统中没有读写执行页面。如果您对代码段启用写操作,那么您就在系统中创建了一个读写执行页面:您所做的正是DEP试图阻止的事情!您创建的代码(可执行内存)也是数据(可写内存)。大多数人担心防止数据变成代码,但您所做的是让代码变成数据。(还请注意,使代码可写还可以防止进程之间的代码共享,因为每个进程现在都有不同的代码副本。)Raymond绝对正确。任何堆溢出、堆栈缓冲区溢出、SEH指针攻击或其他任意漏洞都会允许攻击者在进程内存中的任何位置(甚至在内存中)写入有效负载并执行它。text@RaymondChen,仅供参考-但你真的不应该。拥有一个可写的
.text
部分将完全否定ASLR和DEP阻止成功利用漏洞的能力。@polymone,
ASLR
?请写出什么是ASLR以及它与内存页保护标志的关系。与
DEP
-“数据执行预防”相同-它与“代码修改预防”不同,对吗?DEP使攻击者更难,因为它意味着默认情况下系统中没有读写执行页面。如果您对代码段启用写操作,那么您就在系统中创建了一个读写执行页面:您所做的正是DEP试图阻止的事情!您创建的代码(可执行内存)也是数据(可写内存)。大多数人担心防止数据变成代码,但您所做的是让代码变成数据。(还请注意,使代码可写还可以防止进程之间的代码共享,因为每个进程现在都有不同的代码副本。)Raymond绝对正确。任何堆溢出、堆栈缓冲区溢出、SEH指针攻击或其他任意漏洞都会允许攻击者写入有效负载并在进程中的任何位置执行