menglv 发表于 2015-6-2 15:22:36

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

本帖最后由 menglv 于 2015-6-2 15:44 编辑




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


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

下面是几个暴力算法测试

可以看出飘雨阁的那个特征码查找效率也是不错的。
dup2.26的那个特征码算法效率还不是很高!


menglv 发表于 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 ,eax
sLoop:
      mov ax,word ptr          //取CMP_BYTE
      test al,al                      //判断IsValid
      je sNext
      mov ebx,
      cmp ah,byte ptr
      jne dNext

sNext:
      inc dword ptr       //自加计数
      add esi,0x02                  //自加结构指针
      mov eax,dword ptr
      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
    }
}

menglv 发表于 2015-6-2 15:45:56

沙发是我的,

vipcrack 发表于 2015-6-2 17:12:31

有空把你的好东西放出点了,别都放长毛了啊

menglv 发表于 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,
' mov eax,

' mov edx,
' add edx,
' mov ,edx

' mov edx,
' adc edx,
' mov ,edx

' mov edx,
' adc edx,
' mov ,edx

' mov edx,
' adc edx,
' mov ,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,
' mov ebp,
' mov eax,
' mov edx,esi
' add esi,eax
' mov eax,
' add edx,eax
' mov edi,
' xor eax,eax
' xor ebx,ebx
' @menglv1:
' cmp esi,edx
' jg @menglv2
' xor ecx,ecx
' mov al,
' mov bl,
' inc esi
' cmp al,bl
' jne @menglv1
' dec esi
' @menglv3:
' inc ecx
' inc esi
' inc ebp
' mov bl,
' cmp bl,0
' jne @menglv4
' sub esi,ecx
' mov ,esi
' popad
' mov eax,
' mov ecx,
' sub eax,ecx
' retn 4*5
' @menglv4:
' bt edi,ecx
' jnc @menglv3
' moval,
' cmp al,bl
' je @menglv3
' mov ebp,
' sub esi,ecx
' inc esi
' inc esi
' @menglv5:
' jmp @menglv1
' @menglv2:
' popad
' xor eax,eax
' retn 4*5
'}
End Function

小柯师傅 发表于 2015-6-2 19:02:41

谢谢分享,楼主:-)

crackvip 发表于 2015-6-3 23:34:39

支持楼主放源码,放压箱角的收藏品。。。。
页: [1]
查看完整版本: 补丁代码其实用不到kmp或sunday算法