2011年9月1日星期四

ODbgScript源碼學習(十一)

char HexString2BinChar(const char *s) //hex字符串轉換到bin char
{
char HexBuf[3];
strncpy(HexBuf,s,2); //賦值參數s到局部變量hexbuf
HexBuf[2]=0;
return (char)strtoul(HexBuf,0,16); //轉換到16進制
}

bool Replace(char * s, const char * searchstr, const char * replstring, size_t length)
{
char * ps=s; //定義參數s的指針
bool WasReplaced=false;  //替換標誌
if (strlen(searchstr)!=strlen(replstring))  //參數搜索字串的長度不等於參數替換字符串長度
throw("Search string and replace strings should be of equal length");  //顯示均等

if (strlen(searchstr)%2) //如果參數搜索字串長度為0
throw("Bad search string"); //顯示錯誤

if ((strlen(searchstr)/2)>length) //搜索字串長度的一半大於參數指定長度
throw("The size of data is too small"); //數據大小不夠

size_t ReplaceLength=strlen(replstring)/2; //替換長度的一半

size_t offs=0;

bool equal=true;
unsigned i=0;
unsigned j=0;

//Wildcard Search
while (i<strlen(replstring)) //如果i小於replstring長度
{
if (strncmp("??",&searchstr[i],2)) // 如果if searchstr[i] != "??"
{
if ((searchstr[i]=='?') || (searchstr[i+1]=='?'))//如果searchstr的第i或者第i+1為為?
{
unsigned char mask=0; //定義一個變量mask

char maskbuf[3];

if (searchstr[i]=='?') //如果i位為?
{
maskbuf[0]=searchstr[i+1]; // "?5"
maskbuf[1]=0; //第二位為0

if (s[j]>0xF) //如果s的第j為大於0xF
equal=false; //假

mask=0x0F; //mask為0xF

}
else
{
maskbuf[0]=searchstr[i]; // "5?"
maskbuf[1]='0';
maskbuf[2]=0;
mask=0xF0;
}


if ((char)(s[j]&mask)-(char)strtoul(maskbuf,0,16))
equal=false;//如果s[j]&mask減去十六進制maskbuf,為假

if (!equal)
break; //中斷
}
else
if (HexString2BinChar(&searchstr[i])!=s[j]) //hex字符串轉換到bin char
{
equal=false;
break;
}

}
else
{
i+=2;
i-=2;
}
i+=2;
j++;

}

//Wildcard Replacment
if (equal) //如果為真
{
if (!strstr(replstring,"?")) // no wildcards如果沒有?
{
char * replacestring;
try
{
replacestring=HexString2BinArray(replstring); //轉換hex字符串到bin 數組
}
catch (...)
{
throw("Bad replace string"); //轉換不了顯示錯誤
}
memcpy(s,replacestring,ReplaceLength); //複製
delete replacestring;
}
else //replace by wildcard
for (i=0;i<ReplaceLength;i++)
{
if (strncmp("??",&replstring[i*2],2)) // if searchstr[i] != "??"如果為??
{
if ((replstring[i*2]=='?') || (replstring[i*2+1]=='?')) //
{

if (replstring[i*2]=='?') //?5
ps[i]=(ps[i]& 0xF0) | WildSymbolToChar(&replstring[i*2]);
else //5?
ps[i]=(ps[i]& 0x0F) | WildSymbolToChar(&replstring[i*2]);
}
else
ps[i]=HexString2BinChar(&replstring[i*2]); //not wildcard replacement
}
}
WasReplaced=true;
}
return WasReplaced;
}

char * Byte2Hex(char b) //字節到hex
{
char * buf=new char[3];
sprintf(buf,"%02X",(unsigned char)b); //打印緩衝區
return buf;
}

没有评论:

发表评论