;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)在线全文阅读。
相关推荐: