Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
String 获取寄存器长度/大小?_String_Assembly_Size_Ollydbg - Fatal编程技术网

String 获取寄存器长度/大小?

String 获取寄存器长度/大小?,string,assembly,size,ollydbg,String,Assembly,Size,Ollydbg,我需要你的帮助:/ 我有一个指向一个内存地址的寄存器,如下所示: MOV ESI,DWORD PTR SS:[00123456] 这个地址(00123456)包含一个随机字符串,比如:“你好,这是一个字符串” 我需要得到字符串的长度/大小并进行比较,如果字符串长度超过10,则需要清洁字符串 有人能帮我吗 注意:我正在使用OllyDbg直接在可执行文件中编写此asm代码,因此,MASM、TASM、NASM等中的过程将不起作用。您可以使用REPNE SCAS,这就是内在strlen所使用的。否则,

我需要你的帮助:/

我有一个指向一个内存地址的寄存器,如下所示:

MOV ESI,DWORD PTR SS:[00123456]
这个地址(00123456)包含一个随机字符串,比如:“你好,这是一个字符串”

我需要得到字符串的长度/大小并进行比较,如果字符串长度超过10,则需要清洁字符串

有人能帮我吗


注意:我正在使用OllyDbg直接在可执行文件中编写此asm代码,因此,MASM、TASM、NASM等中的过程将不起作用。

您可以使用
REPNE SCAS
,这就是内在
strlen
所使用的。否则,您可以使用这样一个简单的函数(假设输入位于
EAX
):

但最好检查您正在修改的二进制文件是否还没有strlen函数

完成后,您可以进行尺寸检查和可能的归零,因此您可能会以如下方式结束:

PUSHAD ;save all registers
MOV EAX,ESI ;setup the call for strlen (as defined above)
CALL strlen ;get the length of the string, strlen would be the address of the func above
MOV ECX,EAX 
CMP ECX,0A ;check if the string needs to be cleared
JL L1
MOV EDI,ESI ;set the dest register to the string
REP STOS BYTE PTR [EDI] ;clear the string, alternatively MOV BYTE PTR [ESI],0
L1:
POPAD ;restore all registers
 //continue

(根据您的挂钩位置,您可能还需要保留
EFLAGS

您可以使用
REPNE SCAS
,这是In固有
strlen
使用的。否则,您可以使用这样一个简单的函数(假设输入位于
EAX
):

但最好检查您正在修改的二进制文件是否还没有strlen函数

完成后,您可以进行尺寸检查和可能的归零,因此您可能会以如下方式结束:

PUSHAD ;save all registers
MOV EAX,ESI ;setup the call for strlen (as defined above)
CALL strlen ;get the length of the string, strlen would be the address of the func above
MOV ECX,EAX 
CMP ECX,0A ;check if the string needs to be cleared
JL L1
MOV EDI,ESI ;set the dest register to the string
REP STOS BYTE PTR [EDI] ;clear the string, alternatively MOV BYTE PTR [ESI],0
L1:
POPAD ;restore all registers
 //continue

(根据您的挂钩位置,您可能还需要保留
EFLAGS

您好,请解释一下您的代码行好吗<代码>代码PUSHAD MOV EAX,ESI呼叫strlen MOV ECX,EAX CMP ECX,0A JL L1 MOV EDI,ESI代表STOS字节PTR[EDI]L1:POPAD@paulohr:添加了一些注释来解释I@Necrolis,我现在在工作,但在家里我会测试它。你能给我发电子邮件询问更多问题吗?非常感谢你!嗨,Necrolist,你能解释一下你的代码吗<代码>代码PUSHAD MOV EAX,ESI呼叫strlen MOV ECX,EAX CMP ECX,0A JL L1 MOV EDI,ESI代表STOS字节PTR[EDI]L1:POPAD@paulohr:添加了一些注释来解释I@Necrolis,我现在在工作,但在家里我会测试它。你能给我发电子邮件询问更多问题吗?非常感谢你!