第七章:应用层保护
加密,加壳,反调试,混淆。。。
静态保护:去静态特征,去字符串,全局指针等。
动态保护:
在dump模块的方法中,一般会调用ReadProcessMemory来读取,可以修改PE结构中可选头中的ImageOfSize,还有抹去PE头的方法干扰,但对指定基址和大小就无效。
修改页面访问属性为PAGE_NO_ACCESS可以反dump.

修改代码方式的HOOK很难绕过代码检验;硬件断点触发的异常可能被GetThreadContext函数获取硬件断点的设置检测出来,而且硬件断点只有4个。
内存页面访问异常更具隐藏性,但存在因代码页频繁访问而影响原始程序性能问题。

//测试EXE
#include <stdio.h>
#include <Windows.h>
#include <vector>
#include <TlHelp32.h>void EnumModule()
{// TODO: Add your control notification handler code herechar szBuffer[256*100] = "";char szModuFile[240] = "";char szTmpBuffer[256] = "";MODULEENTRY32 moudle;HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);if (handle == INVALID_HANDLE_VALUE){printf("枚举模块失败!");return;}int i = 1;if ( Module32First(handle,&moudle)){ do{sprintf(szModuFile,"[%d]Address: 0x%x, Name: %s \r\n", i, moudle.modBaseAddr, moudle.szModule);strcat(szBuffer,szModuFile);i++;}while(Module32Next(handle,&moudle));}CloseHandle(handle);printf(szBuffer);
}void main()
{
#if 1MessageBox(NULL,"the fact infor111","test SEH hook",MB_OK);  ::LoadLibraryA("WaiGua.dll");char buf[] = "the fact infor111";MessageBox(NULL,buf,"test SEH hook",MB_OK);
#else   //测试反dumpEnumModule();::LoadLibraryA("WaiGua.dll");EnumModule();printf("second enum end.\n");
#endifgetchar();
}
//hook.dll
// VEHHook.cpp : Defines the entry point for the DLL application.
//
#include <Windows.h>
#include <TlHelp32.h>
#include <stdio.h>
#include <limits.h>
#include <Winbase.h>typedef LONG  (WINAPI *PVECTOREDEXCEPTIONHANDLER)(PEXCEPTION_POINTERS ExceptionInfo);typedef PVOID (WINAPI *ADDVECTOREEXCEPTIONHANDLER)(ULONG FirstHandler,PVECTOREDEXCEPTIONHANDLER VectoredHandler
);
ADDVECTOREEXCEPTIONHANDLER g_AddVectorExceptionHandler = NULL;DWORD func_addr = 0x00401000;
DWORD func_addr_offset = func_addr + 0x2;
DWORD g_dwOldProtect = 0;void PrintParameters(PCONTEXT debug_context)
{printf("EAX: %X EBX: %X ECX: %X EDX: %X\n",debug_context->Eax, debug_context->Ebx, debug_context->Ecx, debug_context->Edx);printf("ESP: %X EBP: %X\n",debug_context->Esp, debug_context->Ebp);printf("ESI: %X EDI: %X\n",debug_context->Esi, debug_context->Edi);printf("Parameters\n""HWND: %X\n""text: %s\n""caption: %s\n",(HWND)(*(DWORD*)(debug_context->Esp + 0x4)),(char*)(*(DWORD*)(debug_context->Esp + 0x8)),(char*)(*(DWORD*)(debug_context->Esp + 0xC)));}void ChangeText(PCONTEXT debug_context) {char* text = (char*)(*(DWORD*)(debug_context->Esp + 0x8));int length = strlen(text);DWORD oldprotect = 0;_snprintf(text, length, "Be Hooked!");
}void __declspec(naked) ReturnOriginalFunc(void) {__asm {mov edi,edijmp [func_addr_offset]}
}LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) {if(ExceptionInfo->ExceptionRecord->ExceptionCode != EXCEPTION_SINGLE_STEP &&ExceptionInfo->ExceptionRecord->ExceptionCode != STATUS_ACCESS_VIOLATION){return EXCEPTION_CONTINUE_SEARCH;}if((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress == func_addr) {PCONTEXT debug_context = ExceptionInfo->ContextRecord;printf("Breakpoint hit!\n");PrintParameters(debug_context);ChangeText(debug_context);debug_context->Eip = (DWORD)&ReturnOriginalFunc;DWORD dwOldProtect = 0;VirtualProtect( (LPVOID)func_addr, 1024,PAGE_EXECUTE_READWRITE,&dwOldProtect);}return EXCEPTION_CONTINUE_EXECUTION;
}DWORD ChangeDataSectionPageProtectAttr(DWORD dwProtect)
{DWORD dwOldProtect = 0;MEMORY_BASIC_INFORMATION mbi = { 0 };__try{VirtualQuery(ChangeDataSectionPageProtectAttr,&mbi,sizeof(mbi));//VirtualProtect( (LPVOID)((PBYTE)mbi.BaseAddress + mbi.RegionSize), 1024,dwProtect,&dwOldProtect);VirtualProtect( (LPVOID)ChangeDataSectionPageProtectAttr, 4,dwProtect,&dwOldProtect);}__except(EXCEPTION_CONTINUE_EXECUTION){printf("ChangeDataSectionPageProtectAttr failed.\n"); }return dwOldProtect;
}DWORD MemPageHook(DWORD dwNewFuncAddr)
{g_AddVectorExceptionHandler(1, ExceptionFilter);DWORD dwOldProtect = 0;VirtualProtect( (LPVOID)func_addr, 4,PAGE_NOACCESS,&dwOldProtect);return dwOldProtect;
}int APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID reserved)
{if(reason == DLL_PROCESS_ATTACH) {
#if 1DisableThreadLibraryCalls(hModule);if(AllocConsole()) {freopen("CONOUT$", "w", stdout);SetConsoleTitle("Console");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);printf("DLL loaded.\n");}func_addr = (DWORD)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");func_addr_offset = func_addr+2;printf("MessageBoxA Addr: 0x%x\n",func_addr);g_AddVectorExceptionHandler = (ADDVECTOREEXCEPTIONHANDLER)GetProcAddress(GetModuleHandle("kernel32.dll"), "AddVectoredExceptionHandler");g_dwOldProtect = MemPageHook(func_addr);#else//测试反dumpChangeDataSectionPageProtectAttr(PAGE_NOACCESS);
#endif}return TRUE;
}

页面异常反dump 及 内存访问异常hook相关推荐

  1. 通过gdb core dump方法查看程序异常时的堆栈信息

    在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息.core dump叫做核心转储,当程序运行过程中发生异常的那一刻的一个内存快照,操作系 ...

  2. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  3. 《深入理解JVM.2nd》笔记(二):Java内存区域与内存溢出异常

    文章目录 概述 运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 HotSpot虚拟机对象探秘 对象的创建 第一步 第二步 第三步 第四步 最后一脚 ...

  4. 《深入理解java虚拟机》第2章 Java内存区域与内存溢出异常

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 2.1 概述 https://blog.csdn.net/q5706 ...

  5. java 计数器越界,[总结]-第二章 Java内存区域与内存溢出异常

    [总结]-第二章 Java内存区域与内存溢出异常 一.知识点 1.虚拟机运行时数据区 方法区:运行时常量池(JDK1.7被移出) 堆:存放对象实例或数组.新生代和老年代 虚拟机栈:线程私有.栈 本地方 ...

  6. 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  7. Java内存溢出异常(下)

    此篇是上一篇文章Java内存溢出异常(上)的续篇,没有看过的同学,可以先看一下上篇.本篇文章将介绍剩余的两个溢出异常:方法区和运行时常量池溢出. 方法区和运行时常量池溢出 这部分为什么会放在一起呢?在 ...

  8. JVM面试题整理-Java内存区域与内存溢出异常、垃圾收集器和内存分配策略

    参考: https://blog.csdn.net/zd836614437/article/details/64126826 https://blog.csdn.net/u011225629/arti ...

  9. jsp获取静态服务器文件路径,11、统一处理异常、处理静态资源访问、项目中的绝对地址跟相对地址问题...

    一.项目中的相对地址和绝对地址问题 在jsp,html中使用的地址,都是在前端页面中的地址,都是相对地址 地址分类: 1.绝对地址 , 带有协议名称的是绝对地址,  http://www.baidu. ...

最新文章

  1. 一种关注于重要样本的目标检测方法!
  2. 博图只能通过地址相同设备找到plc_小白求教:博途v13无法连接s7-1200,显示在网络上未找到任何设备...
  3. 从《四驱兄弟》到“联想中国”
  4. 信息学奥赛一本通(1110:查找特定的值)
  5. 判断字段是否与枚举相同_Scala基础学习九之枚举和Trait了解
  6. axios发post请求,后端接收不到参数的问题
  7. 努力做一个优秀的programmer [ C# 影院售票系统]
  8. Mac 屏幕共享和远程控制
  9. 自然语言处理NLP星空智能对话机器人系列:GavinNLP星空对话机器人Transformer课程片段1到片段4
  10. 项目实训--Unity多人游戏开发(八、3D音效融合AudioMixer、统一的音频播放系统)
  11. 1148 数字字符出现频率
  12. 机房收费系统心得总结
  13. MPB:中科院植物所杨文强组-​莱茵衣藻遗传连锁分析方法
  14. vue外卖十九:商家详情-底部购物车组件,购物车相关vuex状态设计、相关计算、清空购物车+滚动购物车
  15. C#重载函数与可选参数简单实例
  16. MySQL子查询的优缺点_浅谈mysql的子查询
  17. 2023江苏大学计算机考研信息汇总
  18. position:sticky新特性
  19. Direct3D 12 尝鲜(二): Fence
  20. 华为计算机技能,华为笔记本电脑技术参数及功能一览

热门文章

  1. ML之RFXGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)
  2. 成功解决Please use the NLTK Downloader to obtain the resource:
  3. Crawler:基于splinter.browser库实现爬取12306网站来实现快速抢票
  4. python记录_day14 内置函数二 迭代 二分法
  5. wordpress学习笔记
  6. 你必须知道的28个HTML5特征、窍门和技术
  7. android除去标题栏或全屏
  8. php中cookie的用法
  9. 关于正则表达式匹配任意字符
  10. XP 终端服务组件 恢复补丁包 terminal service patch