2019独角兽企业重金招聘Python工程师标准>>>

原理:
a,crc32函数的实现

b,内存校验:顾名思义,运行在内存代码通过crc32得到一个值,当第二次运行可执行文件的时候,可以把第一次保存下来的值和第二次运行的结果相比较,从而根据比较结果判断时候内存数据吧被修改。

1,crc32算法的实现部分:

DWORD CRC32(BYTE* ptr,DWORD Size)
{DWORDcrcTable[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[i] = crcTmp1;}//计算CRC32值DWORDcrcTmp2= 0xFFFFFFFF;while(Size--){crcTmp2 = ((crcTmp2>>8) &0x00FFFFFF) ^ crcTable[ (crcTmp2^(*ptr)) & 0xFF ];ptr++;}return(crcTmp2^0xFFFFFFFF);
}

2,代码实现:

A,要保护的代码:

ProtectStart:   //要保护的代码的起始地址__asm{inc eax  //花指令dec eaxpush eaxpop 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,eaxstParam.dwStart = dwAddr; //保存在我们自己定义的结构体里__asm mov eax,offset ProtectEnd //计算保护代码的结束地址,同样保存在自己定义的                   结构体里。__asm mov dwAddr,eaxstParam.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;DWORDdwCodeSize = stParam->dwEnd - stParam->dwStart;BYTE*pbyteBuf = NULL;pbyteBuf= (BYTE *)stParam->dwStart;DWORDdwOldProtect = 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下断点,然后就来到线程函数了。

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

3,测试:

让debug版本的程序运行起来,ce附加进程。

点击Memory View,定位到我们要保护的代码段。

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

哈哈哈,还不错吧。内存校验不难吧。

转自:http://bbs.pediy.com/showthread.php?t=140471

转载于:https://my.oschina.net/iwuyang/blog/198610

基于crc32实现的内存的代码校验相关推荐

  1. showdialog 尝试读取或写入受保护的内存_TreadMarks: 基于工作站网络的共享内存计算...

    TreadMarks: 基于工作站网络的共享内存计算 以前学MIT6.824时看过TreadMarks相关论文,这篇论文当时只翻译了一半.最近无意中看到这篇未完成的翻译,google了下发现仍然没有人 ...

  2. 基于windows PE文件的恶意代码分析;使用SystemInternal工具与内核调试器研究windows用户空间与内核空间...

    基于windows PE文件的恶意代码分析:使用SystemInternal工具与内核调试器研究windows用户空间与内核空间 ******************** 既然本篇的主角是PE文件,那 ...

  3. 基于C语言的JPEG编码代码详解

    一.基于C语言的JPEG编码代码详解 #include <stdio.h> #include <stdlib.h> #include <string.h>#prag ...

  4. Google工具包Guava——聊聊代码校验Preconditions

    一.Preconditions工具类介绍 Preconditions是guava提供的用于进行代码校验的工具类,其中提供了许多重要的静态校验方法,用来简化我们工作或开发中对代码的校验或预处理. 所有的 ...

  5. 《MEMDOG:一种基于 Linux 的在线内存检测器》

    [1]王小强. MEMDOG:一种基于Linux的在线内存检测器[D].兰州大学,2017. 由于 DRAM 的容量不断地增大,体积不断地减小,因此表示一个位信息的存储单元在不断地缩小,使得 DRAM ...

  6. 使用Java故意消耗Cpu和内存的代码

    使用Java故意消耗Cpu和内存的代码 1.直接上代码 2.消耗Cpu命令 3.消耗内存命令 为什么要故意消耗Cpu和内存?在项目交付时有时会申请一定的资源进行项目程序代码的部署,一般会预留一些Cpu ...

  7. 使用 Java 故意消耗 Cpu 和内存的代码

    为什么要故意消耗 Cpu 和内存?在项目交付时有时会申请一定的资源进行项目程序代码的部署,一般会预留一些 Cpu 和内存,以便后续扩展项目时能有足够的资源,但有时往往要求很严格,会时不时的检查你的服务 ...

  8. 门神——转转前端代码校验系统

    序 每逢新春佳节,家家户户都会按照习俗,在门上贴上凶神恶煞的门神,希望能驱邪避灾,保护家人平安. 而转转 FE 团队,也在农历新年前,正式上线了门神系统--一个在 编译 & 部署 环节可以通过 ...

  9. 基于Qsys的DDR2内存驱动

    目录 基于Qsys的DDR2内存驱动 1.建立Qsys系统 1.1.时钟 1.2.NIOS II 1.3.系统ID 1.4.片上RAM 1.5.JTAG调试器 1.6.DDR2控制器 1.7.连接 2 ...

最新文章

  1. 【JDBC 报错】Connections could not be acquired from the underlying database!
  2. 对话微软黄学东:语音语言技术是镶在 AI 皇冠上的明珠
  3. matlab与python交互_Python和MATLAB交互的基本操作
  4. Uncaught SecurityError: Failed to execute 'replaceState' on 'History': A history state object with
  5. OpenCV C++ 01 - Load Image from File and Display
  6. javaIo流实际应用
  7. 理解一个类里边设置两个同名函数
  8. Struts2的手工自定义验证--完整实例代码
  9. 1473. A + B 格式
  10. java manualbuffer_java从很大的buffer数组中每次读128字节 读到最后不足128字节的用0xff补齐 这个代码怎么写 ?没有思路哎...
  11. “KVM is not available”的相应解决方案
  12. 我要偷偷的学Python,然后惊呆所有人(第六天)
  13. 去除win10桌面图标快捷方式小箭头
  14. Action Recognition with Improved Trajectories
  15. 提高禁毒意识,vr全景直观感受毒品危害
  16. 3大能力升级,云效+钉钉,让研发协作更「敏捷」
  17. 位运算的奇技淫巧:Bit Twiddling Hacks
  18. 微信小程序Day2学习笔记
  19. ASO优化如何做?这几个技巧你绝对要了解
  20. 亚洲黄色人种表情识别数据集

热门文章

  1. html 显示不吃,长期不吃晚饭,或有4个变化出现,自查一下,看看你占了几个
  2. SAP QM 内向交货单包装的时候触发的检验批不能被自动取消?
  3. SAP PM入门系列29 - IW65 Display Activities
  4. 5G+AI:影响未来的新趋势
  5. 「AI不惑境」移动端高效网络,卷积拆分和分组的精髓
  6. AGV机器人市场:未来竞争大战一触即发
  7. TensorFlow基本使用
  8. 揭榜:2018中国AI英雄风云榜,年度10位杰出领军人物!
  9. 训练 AI 学会通过复制来构建 AI 系统
  10. 深度丨吴恩达走了,林元庆也走了,百度研究院到底怎么了?