我需要你的帮助 :/
我有一个指向一个内存地址的寄存器,如下所示:
MOV ESI,DWORD PTR SS:[00123456]
而且,这个地址(00123456)包含一个随机字符串,例如:“你好,这是一个字符串”。
我需要获取字符串的长度/大小并进行比较,如果字符串长度大于 10,则需要清理字符串。
谁能帮我?
注意:我正在使用 OllyDbg 直接在可执行文件中编写这个 asm 代码,因此 MASM、TASM、NASM 等中的程序将不起作用。
你可以使用REPNE SCAS
,这就是内在的strlen
用途。否则,您可以使用这样的简单函数(假设输入在 中EAX
):
strlen: /$LEA EDX,DWORD PTR DS:[EAX+1]
loop: |/>MOV CL,BYTE PTR DS:[EAX]
||INC EAX
||TEST CL,CL
|\JNZ SHORT loop
|SUB EAX,EDX
\RETN
但是检查您正在修改的二进制文件是否还没有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
)