补丁代码其实用不到kmp或sunday算法
本帖最后由 menglv 于 2015-6-2 15:44 编辑kmp和sunday算法其实是居于一些极端的例子,就是重码率很高。比如查找00000000000012,这种就会有优势。
而我们找特征码基本都是唯一,而且特征码的重码率也极低。比如查找890D6CC94200C1E10803CA890D68C94200,kmp和sunday算法这种可能要更慢!
所以我们编写代码打补丁用暴力算法即可!kmp和sunday都没有用武之地,而且还不方便写模糊hex查找。
我们特意将890D6CC94200C1E10803CA890D68C94200放在一个120MB测试文件的最后。
刚刚用论坛的sunday证实了一下我的想法。
下面是几个暴力算法测试
可以看出飘雨阁的那个特征码查找效率也是不错的。
dup2.26的那个特征码算法效率还不是很高!
这个代码速度不错,而且支持??查找
#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
}
} 沙发是我的, 有空把你的好东西放出点了,别都放长毛了啊 我的查找函数是扣代码的,所以不好意思放出来
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 谢谢分享,楼主:-) 支持楼主放源码,放压箱角的收藏品。。。。
页:
[1]