美文网首页逆向工程入门
八、小白逆向之路之对strcmp函数的反汇编分析

八、小白逆向之路之对strcmp函数的反汇编分析

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

    本文要点

    • strcmp函数是什么
    • strcmp函数的反汇编分析

    一、strcmp函数是什么

    strcmp函数是C/C++语言中的一个字符串比较函数。

    其格式为: strcmp(str1,str2)//str1/str2均为字符串指针,返回值为0 1 -1。

    其原理是:
    将两个字符串的字符一个一个字符的比较,若完全一样,则返回0
    如果遇到不一样的字符分为一下两种情况:
    1.前者大于后者:返回1
    2.前者小于后者:返回-1

    二、strcmp函数的反汇编分析

    1.PNG

    上图就是strcmp函数的反汇编代码,下面让我们来一步一步分析吧!

    图中 73F52800行 到 73F22848行就是完整的strcmp函数的反汇编代码

    第一步是将str1和str2的首地址赋值给edx和ecx(图2)

    2.PNG

    第二步是检测str1的首地址是否为4的倍数,如果不是就要跳转去另一段代码将字符串的地址比较到4的倍数再返回来(我也暂时没想通为什么要这样做,各位大佬想到了告诉小弟一下)

    3.PNG 跳转去的代码(这段代码的逻辑就是对比str1 str2 直到str1的首地址为4的倍数): 4.PNG

    第三步是将str1的首四个字节(其实是以edx开始的四个字节)赋值给eax

    5.PNG
    第四步开始正式的比较了 al存放的是第一个字节,至于为什么这里就是不再赘述了,不懂了回去看看汇编语言
    将al与str2的第一个字节相比较(地址ecx所在的字节)
    如果不等于就跳转到 73F52844 这里,待会再解释 73F52844 这里的代码是干什么用的,但是我们可以猜想一下一定是决定返回 1 还是返回 -1 的代码
    然后会判断一下字符串str1是不是结束了(字符串以 0 结尾) ,如果结束了直接跳转到返回 0 的代码 73F52844 6.PNG

    第五步跟第四步类似 比较以edx开始第二个字符

    7.PNG

    第七步是将eax中高16位的两个字符移动到低16位来,然后继续重复 五 六步 的动作

    8.PNG

    第八步是给edx 和 ecx 都加 4,如果第四个字符不等于0 ,那就跳转到第三步继续做比较

    结果
    我们可以看到比较的结果可以在两处返回
    1、若str1 执行到结束字符 0 的位置,说明 此时的 str2 也是 等于 0(如果不等的话,前面两者的比较就会跳转),那么程序就会跳转到以下代码,eax作为返回值 置位 0

    9.PNG

    2、如果是两个字符对比不相等,就会跳转到如下代码:


    先来述说 sbb 的用法 ,sbb eax,eax 等价于 eax = eax - eax -cf
    CF 是进位/借位标志符

    在跳转之前 我们进行了 cmp a,b

    • 如果是 a < b,CF因为借位置 1
      那么:
      sbb eax,eax --> eax = FFFF
      shl eax,1 --> eax =FFFE
      add eax,1 -->eax = FFFF
      也就是说 eax = -1D(十进制补码表示)

    • 如果a>b
      那这一段代码执行下来
      eax = 1(十进制)

    相关文章

      网友评论

        本文标题:八、小白逆向之路之对strcmp函数的反汇编分析

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