2011年8月30日星期二

ODbgScript源碼學習(九)

Search.h:

#pragma once

bool Replace(char * s,const char * searchstr,const char * replstring,size_t length);
//bool CompareChar(const char src, char* cmp); //替換函數
int FindWithWildcards(const char* source, const char* findstring, size_t len);
//char * Byte2Hex(char b); //尋找寬通配符

Search.cpp:

#include "StdAfx.h"
#include <math.h>

bool CompareChar(const char src, char* cmp)//比較char
{
if(strstr(cmp, "??")) // ??查找是否有"??"
return true;

if(strstr(cmp, "?") == cmp) // ?6是否有
{
char low = src % 0x10;//源字串%0x10
char val = (char)strtoul(cmp + 1, 0, 16);//轉換為16進制
if(val == low)//如果與前面顯得
return true;//返回真
return false;
}
else if(strstr(cmp, "?") == cmp + 1) // 5?如果"?"在cmp+1的位置
{
cmp[1] = 0;//第二位為0
char high = (src - src % 0x10) / 0x10;//高位計算結果
char val = (char)strtoul(cmp, 0, 16);//轉換16進制
if(val == high)//如果等於高位
return true;//為真
return false;
}
else // 56
{
char high = (src - src % 0x10) / 0x10;//其他高位計算
char low = src % 0x10;//低位計算
char val2 = (char)strtoul(cmp + 1, 0, 16);//轉換為16進制
cmp[1] = 0;//第二位為0
char val1 = (char)strtoul(cmp, 0, 16);//16進制轉換
if(high == val1 && low == val2)//如果高位和低位等於轉換結果
return true; //返回真
return false;
}
}

int FindWithWildcards(const char* source, const char* findstring, size_t len)
{
char cmp[3] = {0};  //第三位為{0}
int findlen = ceil(((double)strlen(findstring) / 2));//尋找長度為向上捨入字串findstring長度的一半
if(len < findlen)//如果輸入長度小於字串findstring長度
return -1;//返回-1

for(int i = 0; i < len; i++)  //len長度內循環
{
for(int j = 0; j < findlen; j++)//findlen長度內循環
{
strncpy(cmp, findstring + j * 2, 2);  //複製2個字節的cmp
if(!CompareChar(source[i+j], cmp))//比較字串
break;
else if(j == (findlen - 1))//如果尋找長度為循環次數
return i;//返回i
}
}
return -1;
}



没有评论:

发表评论