Получить регистр длина / размер? - PullRequest
1 голос
/ 27 февраля 2012

Мне нужна ваша помощь: /

У меня есть регистр, который указывает на один адрес памяти, например:

MOV ESI,DWORD PTR SS:[00123456]

И этот адрес (00123456) содержит строку RANDOM, например: «Здравствуйте, это строка».

Мне нужно получить длину / размер строки и сравнить, если длина строки больше 10, строку необходимо очистить.

Кто-нибудь может мне помочь?

ПРИМЕЧАНИЕ. Я пишу этот код asm непосредственно в исполняемый файл с использованием OllyDbg, поэтому процедуры в MASM, TASM, NASM и т. Д. Не будут работать.

1 Ответ

1 голос
/ 27 февраля 2012

вы можете использовать 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)

...