-
-
[求助]那位前辈高人可以帮忙优化此函数
-
发表于:
2011-5-17 07:26
4125
-
下面是小弟写的一个特征码定位的函数。写完后不是很满意。
可是因为不是科班出身的程序员。编程基础很薄弱。虽然知道问题多多。但没有能力自己解决
无奈只好来求助看雪的前辈高人啦。
希望:
优化函数算法 流程 变量申请 堆申请
加入优雅的异常处理机制
//
参数1:字符型 传入特征码
参数2:距离。(通过特征码查找到的地址与实际需要的地址相距多少)
参数3:查找方式。(确定特征码在实际需要地址之前还是之后。TRUE=之前)
//
DWORD GetFunctionAddress(PCHAR Code,DWORD Distance,BOOL Mode)
{
BOOL Success=FALSE;
DWORD Begin=0x00400000;
DWORD Loop=0;
DWORD Value=0;
DWORD Length=0;
DWORD Index=0;
PBYTE Buffer=NULL;
PBYTE Scan=NULL;
PDWORD Pointer=NULL;
//因传入的是字符型特征码。所以需要休整特征码为BYTE型以便搜索比较
Length=strlen(Code)/2;
Buffer=new BYTE[Length];
if (Buffer==NULL)
{
return Value;
}
for (Index;Index<Length;Index++)
{
char Temp[]={Code[Index*2],Code[Index*2+1],'\0'};
Buffer[Index]=(BYTE)strtol(Temp,NULL,16);
}
//已经注入到目标进程中。可以用指针搜索其内存空间
for (Begin;Begin<=0x80000000;Begin+=0x1000)
{
for (Loop=Begin;Loop<(Begin+0x1000);Loop++)
{
Scan=(PBYTE)Loop;
for (Index=0;Index<Length;Index++)
{
if (*(PBYTE)((DWORD)Scan+Index)!=Buffer[Index])
{
break;//如果有1位与特征码不同。就立即退出此循环
}
if (Index==Length-1)
{
Success=TRUE;//如果成功找到。做如下处理
delete Buffer;
if (Mode==TRUE)
{
Pointer=(PDWORD)((DWORD)Scan+Distance);
Value=(*(PDWORD)((DWORD)Pointer+1)+(DWORD)Pointer+5);
return Value;
//找到的地址与传入的距离做计算.得到实际需要的地址。
//再通过实际地址计算得出call地址。并成功返回
}
else
{
Pointer=(PDWORD)((DWORD)Scan-Distance);
Value=(*(PDWORD)((DWORD)Pointer+1)+(DWORD)Pointer+5);
return Value;
}
}
}
if (Success==TRUE)
{
break;
}
}
if (Success==TRUE)
{
break;
}
}
delete Buffer;
return Value;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)