首页
社区
课程
招聘
[求助]那位前辈高人可以帮忙优化此函数
发表于: 2011-5-17 07:26 4126

[求助]那位前辈高人可以帮忙优化此函数

2011-5-17 07:26
4126
下面是小弟写的一个特征码定位的函数。写完后不是很满意。

可是因为不是科班出身的程序员。编程基础很薄弱。虽然知道问题多多。但没有能力自己解决

无奈只好来求助看雪的前辈高人啦。


希望:

优化函数算法 流程 变量申请 堆申请

加入优雅的异常处理机制


//
参数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;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2


没有人帮助嘛?
2011-5-18 08:06
0
雪    币: 258
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不是进程空间的所有内存地址都是可读的、、
2011-5-18 09:29
0
游客
登录 | 注册 方可回帖
返回
//