【求助】C++编写通用不连续的特征码定位 通过偏移数组 和偏移特征码
DWORD SeekDistInctCode(HANDLE hProcess,
LPCVOID lpBaseAddress,
int *DistInctOffSet,
BYTE *DistInctCode,
int DistCodeLength)
{
BOOL rBet=FALSE;
DWORD rAddr=NULL;
int PageSize=0x10;
BYTE page[16]={0};
DWORD *TmpAddress=(DWORD *)lpBaseAddress;
MEMORY_BASIC_INFORMATION ProcSize;
VirtualQueryEx(hProcess,lpBaseAddress,&ProcSize,sizeof(ProcSize));
for(int PageNumer=0;((DWORD)lpBaseAddress+PageSize*PageNumer)<0x675ffe;PageNumer++)
{
DWORD dwSizep=NULL;
if (!ReadProcessMemory(hProcess,(LPCVOID)(TmpAddress+PageNumer*PageSize),&page,PageSize,&dwSizep))
{
return rAddr;
}
printf("实际读取%x",dwSizep);
for (int i=0;i<PageSize;i++) //循环加1遍历
{
BYTE *p= page+i;
printf("%x\n",p);
for(int j=0;j<DistCodeLength;j++) ////循环加1 读取特征码偏移
{
rAddr=(DWORD)(TmpAddress+PageSize*PageNumer+i);
if((*(p+DistInctOffSet[j]))==DistInctCode[j]){rBet=TRUE;}
else{rBet=FALSE;}
}
//比较看是否跟特征码一样
if (rBet)
{
rAddr=(DWORD)(TmpAddress+PageSize*PageNumer+i);
printf("目标地址为%x",rAddr);
return rAddr;
}
}
}
return rAddr;
}
void main()
{
HANDLE hFile=NULL;
DWORD ProcAddr=SeekProcEntry("E:\\VStart50\\VStart.exe"); //获取入口点
hFile=SeekProcess("VStart.exe"); //获取进程句柄
int DistInctOffset[9]={1,2,3,4,7,8}; //偏移
BYTE DistInctCode[9]={0xEE,0xFC,0x11,0xDB,0xb8,1}; //特征码
if (ProcAddr==NULL)
{
printf("没有找到特征码");
}
printf("%x",ProcAddr);
ProcAddr=SeekDistInctCode(hFile,(LPVOID)ProcAddr,DistInctOffset,DistInctCode,6);
printf("特征码地址%x",ProcAddr);
}
确实不知道毛病在哪里就是有问题 定位不出来
俺问倒了几个 希望大家帮忙看看
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法