美文网首页逆向工程入门
九、小白逆向之路之用汇编写字符串比较函数

九、小白逆向之路之用汇编写字符串比较函数

作者: stone2333 | 来源:发表于2019-09-28 20:02 被阅读0次

本文目的
利用REPNZ SCASB指令 以及 REPE CMPSB指令来写一个字符串比较函数
本文概要
1.REPNZ SCASB指令介绍
2.REPE CMPSB指令介绍
3.字符串比较函数编写

一、REPNZ SCASB指令介绍

image.png

这两个指令组合起来就是用来寻找字符串中的字符的
值得一说的是 SCASB SCASW SCASD是一个系列的指令,只是操作数的字节数变了

二、REPE CMPSB指令介绍

image.png

简而言之这两个指令就是用 edi 和 esi 指向两个字符串,然后一个字节一个字节的比较,如果不相同(ZF = 0)则跳出

三、字符串比较函数编写

#include<cstdio>

__declspec(naked) int asm_strcmpA(char* s1,char* s2)  // 告诉编译器不用帮忙做堆栈平衡,因为我们要传递参数出去,所以自己来做
{
    __asm{
            /*1、先用ecx算出字符串s1的长度
            2、再来进行比较*/
            push ebp
            mov ebp,esp
            push ecx
            push esi
            push edi

        
            xor al,al                        ;al = 0,字符串结束就是0
            mov ecx,-1                   ;ecx = FFFFFFFF
            mov edi,s1                   ;edi = s1
            repne scasb                 ;[edi]与 al相比较 不等就重复比较 ecx--  edi++
            not ecx                        ;ecx = s1的长度加1

            mov edi,s1;edi = s1
            mov esi,s2;esi = s2
            repe cmpsb                 ;[edi]与[esi]相比较 不等就跳出 相等就重复比较 ecx--  edi/esi++
            xor al,al
            mov al,[edi-1]
            sub al,[esi-1]                ;取最后一个不同的字符相比较,结果存在al中,作为返回值
            
            pop edi
            pop esi
            pop ecx
            pop ebp 
            retn
          }
}

int main()
{
    printf("asm_strcmpA\n");
    printf("%d\n",asm_strcmpA("abcd","abcd"));
    getchar();
    return 0;
}

相关文章

网友评论

    本文标题:九、小白逆向之路之用汇编写字符串比较函数

    本文链接:https://www.haomeiwen.com/subject/bhnhuctx.html