вы можете использовать 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
function.
Когда это будет сделано, вы можете выполнить проверку размера и возможное обнуление, так что вы, вероятно, закончите чем-то, похожим на:
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
)