首页
社区
课程
招聘
[讨论]WIN7下面内存CRC校验还可以进行么
发表于: 2016-6-22 10:47 7956

[讨论]WIN7下面内存CRC校验还可以进行么

2016-6-22 10:47
7956
通过学习《加密与解密》(第三版)上第14.3章的例子DetectingBk,发现在XP下是没问题,可在WIN7上运行就不行,每次都不一样,根据所查资料是因为WIN7引入了ASLR机制,所以每次ImageBase都是随机的,那我想问的是,在WIN7下面还可以实现内存块CRC校验吗?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 36
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大神们在吗?好像发错区了,可以让版主给我挪到“编程技术”区吗?
2016-6-22 14:27
0
雪    币: 1324
活跃值: (1123)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
用基址 + size分段做校验就行了
2016-6-22 15:51
0
雪    币: 36
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好像不行啊,每次基址都变化,而且里面的变量address也在不断变化,我上代码了:

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
        PIMAGE_DOS_HEADER            pDosHeader = NULL;
        PIMAGE_NT_HEADERS       pNtHeader = NULL;
        PIMAGE_SECTION_HEADER   pSecHeader = NULL;

        DWORD                                        ImageBase, OriginalCRC32;

        ImageBase = (DWORD)GetModuleHandle(NULL);//取基址,其实本例也可直接用0x4000000这个值

        pDosHeader = (PIMAGE_DOS_HEADER)ImageBase;
        pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader + pDosHeader->e_lfanew);
        //定位到PE文件头(即字串“PE\0\0”处)前4个字节处,并读出储存在这里的CRC-32值:
        //OriginalCRC32 = *((DWORD *)((DWORD)pNtHeader - 4));

        pSecHeader = IMAGE_FIRST_SECTION(pNtHeader);   //得到第一个区块的起始地址

        DWORD address1,address2,size;

        _asm mov address1,offset begindecrypt;
        _asm mov address2,offset enddecrypt;

        begindecrypt : //标记代码的起妈地址
        MessageBox(NULL,TEXT ("Hello world!"),TEXT ("OK"),MB_ICONEXCLAMATION);
        enddecrypt ://标记代码的结束地址

        size=address2-address1;       
        DWORD dw = CRC32((BYTE*)(address1), size); // ! 这个 address1 在不断变化 !
        if(CRC32((BYTE*)address1,size)==0x78E888AE)
                MessageBox(NULL,TEXT ("Breakpoint not found!"),TEXT ("Breakpoint detection by CRC"),MB_ICONEXCLAMATION);
        else
            MessageBox(NULL,"Breakpoint or a change in the program found !","Breakpoint detection by CRC",MB_ICONEXCLAMATION);
        return 0;
}

里面的 address1 在不断变化,怎么办?
2016-6-23 14:43
0
雪    币: 36
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
address1 在不断变化,导致 CRC 值每次都不一样,好难搞!!
2016-6-23 14:45
0
雪    币: 23
活跃值: (1506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
MessageBox(NULL,TEXT ("Hello world!"),TEXT ("OK"),MB_ICONEXCLAMATION);  

上面2个文本用 局部变量保存再 传参给MessageBox. 具体的 差别看下反汇编代码就知道了.
2016-6-24 01:13
0
雪    币: 36
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
改成固定基址后,原本的保护机制废掉了,程序容易受到攻击,不能为了自己编程简单而让程序脆弱啊,所以我倾向第二种方法,关键是怎么实现,有代码可参考吗亲
2016-6-24 13:59
0
雪    币: 36
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
win7下面按你的方法试了,无效
int _tmain(int argc, _TCHAR* argv[])
{
        PIMAGE_DOS_HEADER            pDosHeader = NULL;
        PIMAGE_NT_HEADERS       pNtHeader = NULL;
        PIMAGE_SECTION_HEADER   pSecHeader = NULL;

        DWORD                                        ImageBase, OriginalCRC32;

        ImageBase = (DWORD)GetModuleHandle(NULL);//取基址,其实本例也可直接用0x4000000这个值

        pDosHeader = (PIMAGE_DOS_HEADER)ImageBase;
        pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader + pDosHeader->e_lfanew);
        //定位到PE文件头(即字串“PE\0\0”处)前4个字节处,并读出储存在这里的CRC-32值:
        //OriginalCRC32 = *((DWORD *)((DWORD)pNtHeader - 4));

        pSecHeader = IMAGE_FIRST_SECTION(pNtHeader);   //得到第一个区块的起始地址

        DWORD address1 = 0, address2 = 0, size = 0;

        TCHAR tch1[20] = TEXT("Hello world!");
        TCHAR tch2[20] = TEXT("OK");

        _asm mov address1, offset begindecrypt;
        _asm mov address2, offset enddecrypt;

begindecrypt: //标记代码的起妈地址
        MessageBox(NULL, tch1, tch2, MB_ICONEXCLAMATION);
enddecrypt://标记代码的结束地址

        DWORD dw = CRC32((BYTE*)(address1), size); // ! 这个 address1 在不断变化 !

        if (CRC32((BYTE*)address1, size) == 0xe6efb0db)
                MessageBox(NULL,TEXT ("Breakpoint not found!"),TEXT ("Breakpoint detection by CRC"),MB_ICONEXCLAMATION);
        else
                   MessageBox(NULL,L"Breakpoint or a change in the program found !",L"Breakpoint detection by CRC",MB_ICONEXCLAMATION);

        return 0;
}
2016-6-24 14:00
0
雪    币: 36
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那你继续调你的代码吧 我挖坑去了
2016-6-27 12:00
0
游客
登录 | 注册 方可回帖
返回
//