首页
社区
课程
招聘
难倒了几个 C++编写通用不连续的特征码定位 通过偏移数组 和偏移特征码
发表于: 2011-2-8 18:19 6100

难倒了几个 C++编写通用不连续的特征码定位 通过偏移数组 和偏移特征码

2011-2-8 18:19
6100
【求助】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虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 40
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
自己顶起自己顶起自己顶起
2011-2-8 19:33
0
雪    币: 225
活跃值: (294)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请贴出:
SeekProcEntry和SeekProcess的代码
2011-2-8 20:22
0
雪    币: 290
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
if((*(p+DistInctOffSet[j]))==DistInctCode[j]){rBet=TRUE;}
        else{rBet=FALSE;}

改成:
if(((*(p+DistInctOffSet[j]))==DistInctCode[j]) && (j==DistCodeLength))
{
      rBet=TRUE;
}
else{break;}
2011-2-8 23:37
0
雪    币: 40
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
那几个没错
我知道问题所在 但是不知道杂整 感觉比算法还复杂
2011-2-9 09:05
0
雪    币: 40
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=feifeixiao;923134]if((*(p+DistInctOffSet[j]))==DistInctCode[j]){rBet=TRUE;}
        else{rBet=FALSE;}

改成:
if(((*(p+DistInctOffSet[j]))==DistInctCode[j]) && (j==DistCod...[/QUOTE]

不对的
是超出了读取数组的范围
2011-2-9 09:06
0
游客
登录 | 注册 方可回帖
返回
//