飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5679|回复: 6

补丁代码其实用不到kmp或sunday算法

[复制链接]
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

    发表于 2015-6-2 15:22:36 | 显示全部楼层 |阅读模式
    本帖最后由 menglv 于 2015-6-2 15:44 编辑




    kmp和sunday算法其实是居于一些极端的例子,就是重码率很高。比如查找00000000000012,这种就会有优势。
    而我们找特征码基本都是唯一,而且特征码的重码率也极低。比如查找890D6CC94200C1E10803CA890D68C94200,kmp和sunday算法这种可能要更慢!
    所以我们编写代码打补丁用暴力算法即可!kmp和sunday都没有用武之地,而且还不方便写模糊hex查找。
    我们特意将890D6CC94200C1E10803CA890D68C94200放在一个120MB测试文件的最后。
    无标题.png

    刚刚用论坛的sunday证实了一下我的想法。

    下面是几个暴力算法测试
    无标题1.png
    可以看出飘雨阁的那个特征码查找效率也是不错的。
    dup2.26的那个特征码算法效率还不是很高!


    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

     楼主| 发表于 2015-6-2 17:21:23 | 显示全部楼层
    这个代码速度不错,而且支持??查找
    #define ASM __declspec (naked)

    typedef struct _CMP_BYTE
    {
        bool          IsValid;      //1字节
        BYTE        Data;        //1字节
    } CMP_BYTE, *PCMP_BYTE;

    ASM UINT WINAPI FindMemory(PBYTE destAddr,UINT destSize,PCMP_BYTE pCB,UINT cbCount,BOOL Absolute)
    {
        __asm
        {
            push ebp
            mov ebp,esp
            push ebx
            push esi
            push edi
            cmp destAddr,0                   //判断参数是否为NULL
            je BackErr
            cmp destSize,0
            je BackErr
            cmp pCB,0
            je BackErr
            cmp cbCount,0
            je BackErr
            mov eax,cbCount
            cmp eax,destSize
            ja BackErr
            push eax                        //i
            mov edi,destAddr
    dLoop:
            mov esi,pCB
            xor eax,eax
            mov [ebp-0x10],eax
    sLoop:
            mov ax,word ptr [esi]           //取CMP_BYTE
            test al,al                      //判断IsValid
            je sNext
            mov ebx,[ebp-0x10]
            cmp ah,byte ptr [edi+ebx]
            jne dNext

    sNext:
            inc dword ptr [ebp-0x10]        //自加计数
            add esi,0x02                    //自加结构指针
            mov eax,dword ptr [ebp-0x10]
            cmp eax,cbCount                 //比较cbCount和计数
            jb sLoop                        //计数 < cbCount 跳转
            mov eax,Absolute
            test eax,eax
            mov eax,edi
            jne Return                       
            sub eax,destAddr
            jmp Return
    dNext:
            inc edi                         //srcAddr++
            mov eax,destSize                 
            sub eax,cbCount                 //eax = srcSize - cbCount
            add eax,destAddr
            cmp edi,eax                     //比较
            jbe dLoop   

    BackErr:
            xor eax,eax
            dec eax
    Return:
            pop ecx
            pop edi
            pop esi
            pop ebx
            mov esp,ebp
            pop ebp
            retn 0x14
        }
    }
    PYG19周年生日快乐!
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

     楼主| 发表于 2015-6-2 15:45:56 | 显示全部楼层
    沙发是我的,
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2025-1-4 10:11
  • 签到天数: 490 天

    [LV.9]以坛为家II

    发表于 2015-6-2 17:12:31 | 显示全部楼层
    有空把你的好东西放出点了,别都放长毛了啊
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

     楼主| 发表于 2015-6-2 17:20:14 | 显示全部楼层
    我的查找函数是扣代码的,所以不好意思放出来

    Private Sub Command4_Click()

      Dim tt&, i&, s1_add&, s2_add&, j&
      tt = GetTickCount
      Dim l_byte() As Byte '要被转化的Byte()
      Dim scanhex(255) As Byte

    Open App.Path & "\PitStop Pro.dll" For Binary As #1
      i = LOF(1) - 1
      ReDim l_byte(i)
      Get #1, , l_byte
      Close

    scanhex(0) = &HFD
    scanhex(1) = &HFD
    scanhex(2) = &HF0
    s1_add = VarPtr(l_byte(0))
    s2_add = VarPtr(scanhex(0))

    j = findhex(s1_add, s2_add, 0, i, 7)
      DoEvents
      MsgBox GetTickCount - tt & vbNewLine & "findhex" & j

      Text1 = ss
    End Sub

    Function addhex2(ByVal s1&, ByVal s3&) As Long
      '_asm{overall}
      '    _asm{
      
      ' mov ecx,[esp+36-32]
      ' mov eax,[esp+40-32]
      
      ' mov edx,[eax]
      ' add edx,[ecx]
      ' mov [eax],edx
      
      ' mov edx,[eax+4]
      ' adc edx,[ecx+4]
      ' mov [eax+4],edx
      
      ' mov edx,[eax+8]
      ' adc edx,[ecx+8]
      ' mov [eax+8],edx

      ' mov edx,[eax+12]
      ' adc edx,[ecx+12]
      ' mov [eax+12],edx

      '         retn 8
      '       }
    End Function

    Function findhex(ByVal s1&, ByVal s2&, ByVal j&, ByVal k&, ByVal g&) As Long
    '_asm{overall}
    '    _asm{
    ' pushad
    ' mov esi,[esp+4*8+4]
    ' mov ebp,[esp+4*8+8]
    ' mov eax,[esp+4*8+12]
    ' mov edx,esi
    ' add esi,eax
    ' mov eax,[esp+4*8+16]
    ' add edx,eax
    ' mov edi,[esp+4*8+20]
    ' xor eax,eax
    ' xor ebx,ebx
    ' @menglv1:
    ' cmp esi,edx
    ' jg @menglv2
    ' xor ecx,ecx
    ' mov al,[esi]
    ' mov bl,[ebp]
    ' inc esi
    ' cmp al,bl
    ' jne @menglv1
    ' dec esi
    ' @menglv3:
    ' inc ecx
    ' inc esi
    ' inc ebp
    ' mov bl,[ebp]
    ' cmp bl,0
    ' jne @menglv4
    ' sub esi,ecx
    ' mov [esp+4*8+20],esi
    ' popad
    ' mov eax,[esp+20]
    ' mov ecx,[esp+4]
    ' sub eax,ecx
    ' retn 4*5
    ' @menglv4:
    ' bt edi,ecx
    ' jnc @menglv3
    ' mov  al,[esi]
    ' cmp al,bl
    ' je @menglv3
    ' mov ebp,[esp+4*8+8]
    ' sub esi,ecx
    ' inc esi
    ' inc esi
    ' @menglv5:
    ' jmp @menglv1
    ' @menglv2:
    ' popad
    ' xor eax,eax
    ' retn 4*5
    '}
    End Function
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-6-13 21:25
  • 签到天数: 38 天

    [LV.5]常住居民I

    发表于 2015-6-2 19:02:41 | 显示全部楼层
    谢谢分享,楼主:-)
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2015-8-14 00:08
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    发表于 2015-6-3 23:34:39 | 显示全部楼层
    支持楼主放源码,放压箱角的收藏品。。。。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表