1

我需要你的帮助 :/

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

MOV ESI,DWORD PTR SS:[00123456]

而且,这个地址(00123456)包含一个随机字符串,例如:“你好,这是一个字符串”。

我需要获取字符串的长度/大小并进行比较,如果字符串长度大于 10,则需要清理字符串。

谁能帮我?

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

4

1 回答 1

1

你可以使用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

于 2012-02-27T13:02:42.660 回答