第八篇:逆向之KMP算法

本文介绍了如何使用C语言实现KMP算法,并给出了`match`函数的反汇编代码,展示了算法在内存中的执行过程。通过`failure`函数计算失败函数,然后在`match`函数中进行字符串匹配。在OD调试工具下,详细分析了`match`函数的执行步骤,包括字符串长度的获取、比较和循环处理等关键环节。
摘要由CSDN通过智能技术生成
版本:Release
优化选项:O2
调试工具:OD
源码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 100  
char fail[MAX_SIZE];

void failure(char* pat)
{
	int n=strlen(pat);
	int i,j;
	fail[0]=-1;
	for(j=1;j<n;j++)
	{
		i=fail[j-1];
		while((pat[i+1]!=pat[j])&&(i>=0))
			i=fail[i];
		if(pat[i+1]==pat[j])
			fail[j]=i+1;
		else
			fail[j]=-1;
	}
}

int match(char *string,char *pat)
{
	int lenp,lens,i,j;
	failure(pat);
	i=j=0;
	lens=strlen(string);
	lenp=strlen(pat);
	while(i<lens&&j<lenp)
	{
		if(string[i]==pat[j])
		{
			i++;j++;
		}
		else
			if(j==0) i++;
			else
				j=fail[j-1]+1;
	}
	return j==lenp?i-lenp:-1;
}

int main()
{
	char s[100]="abcdsdfsdfassdfwefjkjfelkf";
	char a[10]="dsdf";
	int q=match(s,a);
	printf("%d",q);
	system("pause");
	return 0;
}


match函数的反汇编
00211060 >/$  53            push    ebx
00211061  |.  55            push    ebp
00211062  |.  8B6C24 10     mov     ebp, dword ptr [esp+10]               ;  第二个参数
00211066  |.  56
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值