易语言教程_易语言源码_易语言视频教程_易语言论坛

 找回密码
 点击注册

Vip新手入门区
新手学习指南  学员作品展示 Vip课程总纲  Vip绝密课程系列

Vip相关下载区
Vip模块下载   Vip模块绑定   Vip模块例子 魔鬼插件下载  魔鬼插件例子  教程工具下载

Vip论坛服务区
教程问题提问区   模块问题提问区 技术交流区   魔鬼插件建议   忘记密码找回

VIP会员办理QQ: 8643245   
【请先加好友,然后到好友列表双击联系客服,办理VIP会员。】
【基础篇】易语言辅助入门基础教程
VIP模块办理QQ: 7189694 办理正版魔鬼作坊VIP模块 【基础篇】OD与CE入门基础教程
办理【终身VIP会员】“秒杀价” 仅需 RMB278.00元… 【基础篇】零基础绝密汇编语言入门课程 (共26课已完成)…
办理VIP详情…猛击这里查看详情 【基础篇】VIP辅助入门基础教程-新手必学 已发布10课 ……
VIP教程免费试看章节…猛击下载 【第1款】制作“辅助挂”教程目录查看(共107+16_x64下更新课已完成)…
亲爱的VIP学员,请到此写下你学习的感受与发布作品截图… 【第2款】制作“任务挂”教程目录查看(共77+1_x64下更新课已完成)…
卍解吧!不用bp send类封包断点找CALL的各种通杀思路 【第3款】驱动过保护技术课程(共38课已完成)…
【绝密教程】VIP绝密教程系列---注意:随时会更新! 【第4款】VIP邪恶二叉树辅助课程 (共31+17_x64下更新课已完成)…
【精品第13款】3D射击游戏与页游透视 智辅课程 已完成17课… 【第5款】零基础易语言按键辅助教程 (30课已完成)…
【精品第14款】变态功能辅助是如何炼成的 已完成36课… 【第6款】从零开始学习封包辅助技术教程(20课已完成) …
【精品第15款】DNF商业变态辅助的修炼之路 已完成27课… 【第7款】大杀特杀分析来源与CALL吸血鬼课程 (56课已完成)
【精品第16款】中控台多线程多开自动化商业辅助课程 已完成66课… 【第8款】完全零基础网页辅助课程(40课已完成)
【全新精品第17款】检测原理与过游戏内存检测技术课程 已发布9课… 【第9款】自动登录与操控LUA技术课程 (共46+8_x64下更新课已完成)…
【全新精品第18款】手游全自动化任务脚本辅助课程 已发布25课…… 【第10款】网页辅助封包脱机进阶课程 已完成30课…
【全新精品第19款】D3D方框骨骼透视与自瞄辅助课程进阶篇 已发布34课…… 【第11款】VC++ Lua脚本辅助课程 已完成112课…
【全新精品第20款】 X64模拟器吃鸡游戏方框透视自瞄辅助课程 发布中... 【第12款】网游脱机封包智辅课程 已完成35课…
查看: 1684|回复: 0

基于crc32实现的内存的代码校验

[复制链接]

9

主题

7

回帖

17

积分

编程入门

Rank: 1

魔鬼币
550
发表于 2017-5-30 08:02:21 | 显示全部楼层 |阅读模式
原理:a,crc32函数的实现
      b,内存校验:顾名思义,运行在内存代码通过crc32得到一个值,当第二次运行可执行文件的时候,可以把第一次保存下来的值和第二次运行的结果相比较,从而根据比较结果判断时候内存数据吧被修改。

1,crc32算法的实现部分:

DWORD CRC32(BYTE* ptr,DWORD Size)
{
   
  DWORD crcTable[256],crcTmp1;
  
  //动态生成CRC-32表
  for (int i=0; i<256; i++)
   {
    crcTmp1 = i;
    for (int j=8; j>0; j--)
     {
      if (crcTmp1&1) crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L;
       else crcTmp1 >>= 1;
    }

     crcTable = crcTmp1;
   }
  //计算CRC32值
  DWORD crcTmp2= 0xFFFFFFFF;
  while(Size--)
  {
    crcTmp2 = ((crcTmp2>>8) & 0x00FFFFFF) ^ crcTable[ (crcTmp2^(*ptr)) & 0xFF ];
    ptr++;
  }
  
  return (crcTmp2^0xFFFFFFFF);
}

2,代码实现:
A,要保护的代码:
ProtectStart:   //要保护的代码的起始地址
  __asm
  {
         inc eax   //花指令
       dec eax
       push eax
       pop eax
  }
start:
     HMODULE hMod = GetModuleHandle(NULL);//同样是花指令
     HMODULE hUser32 = LoadLibrary("user32.dll");
ProtectEnd:               //要保护代码的终结地址
     DWORD dwThreadId = 0;

     STBINGLEPARAM stParam = {0};
       stParam.hEvent = CreateEvent(NULL,FALSE,FALSE,"bingle");
     
     DWORD dwAddr = 0;  //一个缓存空间
     __asm mov eax,offset ProtectStart  //计算代码的起始地址
     __asm mov dwAddr,eax
     stParam.dwStart = dwAddr; //保存在我们自己定义的结构体里

       __asm mov eax,offset ProtectEnd //计算保护代码的结束地址,同样保存在自己定义的                   结构体里。
     __asm mov dwAddr,eax
     stParam.dwEnd = dwAddr;
     
     printf("开始了\n");
       CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)bingleProc,(LPVOID)&stParam,0,&dwThreadId);
B,创建了一个线程,用来计算校验值。并且将线程的创建放在循环中,这样保证在程序运行的过程中,会不断的监视内存的数据是否改变。
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)bingleProc,(LPVOID)&stParam,0,&dwThreadId);

     DWORD dwRet = 0;
     dwRet = WaitForSingleObject(stParam.hEvent,INFINITE);
     while(dwRet == WAIT_OBJECT_0)
     {
         Sleep(5000);
           CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)bingleProc,(LPVOID)&stParam,0,&dwThreadId);
       dwRet = WaitForSingleObject(stParam.hEvent,INFINITE);
     }
上边的代码是创建线程的,根据创建线程的返回值来作为循环条件。其中stParam是我自定义结构体生成的一个对象。这个对象保存在堆栈中。该结构体的定义如下:
#pragma pack(1)
typedef struct __STBINGLEPARAM
{
  HANDLE hEvent;  //用于同步的一个信号量
  DWORD dwStart;  //要校验的代码的起始地址
  DWORD dwEnd;   //要校验的代码的终结地址
}STBINGLEPARAM,*PBINGLEPARAM;
#pragma pack()

接下来是是线程函数了。
STBINGLEPARAM *stParam = (STBINGLEPARAM *)lpParameter;
   
  DWORD dwCodeSize = stParam->dwEnd - stParam->dwStart;
  BYTE *pbyteBuf = NULL;
  pbyteBuf = (BYTE *)stParam->dwStart;
  
  DWORD dwOldProtect = 0;
  VirtualProtect((LPVOID)stParam->dwStart,4*1024,PAGE_EXECUTE_READWRITE,&dwOldProtect);
  if(CRC32(pbyteBuf,dwCodeSize) != 0xa0eb5866)
  {
     MessageBox(NULL,"bingle","代码被修改了",NULL);
     printf("代码被修改了\n");

     SetEvent(stParam->hEvent);
     ExitProcess(0);
  }


  SetEvent(stParam->hEvent); //执行完上边的代码开始传信,让主线程继续运行
在这里要说的是中的0xa0eb5866,这个是我在od中让代码运行起来找到的。
在创建的线程函数体中找到0x40100a,ctrl+g来到这个地址,F2下断点,然后就来到线程函数了。

一直往下找,找到比较代码cmp eax,0xa0eb5866这一句,把这个地址保存下来,就是我们要校验的地址。可以直接用在代码中。。

3,测试:
让debug版本的程序运行起来,ce附加进程。
点击Memory View,定位到我们要保护的代码段。

找到我们要保护的代码,然后用ce修改一下内存的数值试试,我想修改0x40127a。只要这个内存地址在我们要保护的代码中就可以。

哈哈哈,还不错吧。内存校验不难吧。。
您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

魔鬼作坊|易语言教程|易语言源码|易语言论坛|易语言视频教程| 论坛导航|免责申明|手机版||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表魔鬼作坊立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2019 All Right Reserved.
快速回复 返回顶部 返回列表