77范文网 - 专业文章范例文档资料分享平台

OD反调试大全(8)

来源:网络收集 时间:2019-02-16 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

;restore protect push eax

push oldProtect push 0x10

push offset label3;

call dword ptr [VirtualProtect];

xor eax,eax mov esp,ebp pop ebp retn

rt_label: ;write back

mov dword ptr[label3],0x106a90b0 mov dword ptr[label3+0x4],0x205CBF59 mov dword ptr[label3+0x8],0xAAF30040 mov dword ptr[label3+0xc],0x90909090 mov dword ptr[label3+0x6],offset label3 lea eax, dword ptr[tmpProtect]; ;restore protect push eax

push oldProtect push 0x10

push offset label3;

call dword ptr [VirtualProtect];

xor eax,eax inc eax mov esp,ebp pop ebp retn }

5.9 FT_Prefetch_queue_nop2 与5.8节类似,这是根据CPU预取指令的这个特性实现的另一种反跟踪技巧。原理是通过检测REP指令后的ECX值,来判断REP指令是否被完整执行。在正常情况下,REP指令完整执行后,ECX值应为0;但在调试态下,由于REP指令没有完整执行,ECX值为非0值。通过检测ECX值,实现反跟踪。 DWORD oldProtect; DWORD tmpProtect; __asm {

lea eax,dword ptr[oldProtect]

push eax push 0x40 push 0x10

push offset label3;

call dword ptr [VirtualProtect]; mov ecx,0 label3: mov al,0x90 push 0x10 pop ecx

mov edi,offset label3 rep stosb nop nop nop nop nop nop

push ecx ;write back

mov dword ptr[label3],0x106a90b0 mov dword ptr[label3+0x4],0x201CBF59 mov dword ptr[label3+0x8],0xAAF30040 mov dword ptr[label3+0xc],0x90909090 mov dword ptr[label3+0x6],offset label3 lea eax, dword ptr[tmpProtect]; ;restore protect push eax

push oldProtect push 0x10

push offset label3;

call dword ptr [VirtualProtect]; pop ecx

test ecx,ecx jne rt_label }

rf_label: return false; rt_label: return true;

六、 检测-补丁(FP_)

这部分内容也较少,方法当然也有很多种,原理都差不多,我只选了下面三种。这几种方法

通常在一些壳中较常用,用于检验文件是否被脱壳或被恶意修改。 函数列表如下: //find Patch

bool FP_Check_FileSize(DWORD Size);

bool FP_Check_FileHashValue_CRC(DWORD CRCVALUE_origin); bool FP_Check_FileHashValue_MD5(DWORD MD5VALUE_origin);

6.1 FP_Check_FileSize(DWORD Size)

通过检验文件自身的大小的方法,是一种比较简单的文件校验方法,通常如果被脱壳,或被恶意修改,就可能影响到文件的大小。我用下面的代码实现。需注意的是,文件的大小要先编译一次,将首次编译得到的数值写入代码,再重新编译完成。 DWORD Current_Size; TCHAR szPath[MAX_PATH]; HANDLE hFile;

if( !GetModuleFileName( NULL,szPath, MAX_PATH ) ) return FALSE;

hFile = CreateFile(szPath, GENERIC_READ , FILE_SHARE_READ, NULL,

OPEN_ALWAYS,

FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == INVALID_HANDLE_VALUE) return false;

Current_Size=GetFileSize(hFile,NULL); CloseHandle(hFile); if(Current_Size!=Size) return true; return false;

6.2 FP_Check_FileHashValue_CRC

检验文件的CRC数值,是比较常用的文件校验方法,相信很多人都碰到过了,我是在《软件加解密技术》中了解到的。需注意的是文件原始CRC值的获得,及其放置位置,代码编写完成后,通常先运行一遍程序,使用调试工具获得计算得到的数值,在将这个数值写入文件中,通常这个数值不参加校验,可以放置在文件的尾部作为附加数据,也可以放在PE头中不用的域中。

下面的代码只是个演示,没有保存CRC的真实数值,也没有单独存放。

DWORD fileSize,NumberOfBytesRW; DWORD CRCVALUE_current;

TCHAR szFileName[MAX_PATH];

TCHAR *pBuffer ;

GetModuleFileName(NULL,szFileName,MAX_PATH); HANDLE hFile = CreateFile( szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile != INVALID_HANDLE_VALUE ) {

fileSize = GetFileSize(hFile,NULL);

if (fileSize == 0xFFFFFFFF) return false; pBuffer = new TCHAR [fileSize];

ReadFile(hFile,pBuffer, fileSize, &NumberOfBytesRW, NULL); CloseHandle(hFile); }

CRCVALUE_current=CRC32((BYTE *)pBuffer,fileSize); if(CRCVALUE_origin!=CRCVALUE_current) return true; return false;

6.3 FP_Check_FileHashValue_MD5 与6.2节的原理相同,只是计算的是文件的MD5数值。仍要注意6.2节中同样的MD5真实数值的获得和存放问题。

未完。

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库OD反调试大全(8)在线全文阅读。

OD反调试大全(8).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/474917.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: