【发布时间】:2014-02-28 01:35:35
【问题描述】:
我正在用 c++ 制作签名扫描器,为了测试它,我将注入到 steam 中并比较前 10 个字节。
#define sig "\x4D\x5A\x90\x00\x03\x00\x00\x00\x04\x00\x00"
当我到达第 3 个字节 x90 时,我得到的输出是:
steam: \x4D\x5A\x90\x00\x03\x00\x00\x00\x04\x00\x00
sig: \x4D\x5A\xFFFFFF90\x00\x03\x00\x00\x00\x04\x00\x00
这是我的全部来源:
#include <Windows.h>
#include <stdio.h>
#include <Psapi.h>
#define sig "\x4D\x5A\x90\x00\x03\x00\x00\x00\x04\x00"
#pragma comment( lib, "Psapi" )
HANDLE thread = NULL;
DWORD getImageSize( MEMORY_BASIC_INFORMATION &memInfo )
{
if( !VirtualQuery( GetModuleHandleA(NULL), &memInfo, sizeof( memInfo ) ) )
return 0x00;
IMAGE_DOS_HEADER *dosHeader = (IMAGE_DOS_HEADER *)memInfo.AllocationBase;
IMAGE_NT_HEADERS *peHeader = (IMAGE_NT_HEADERS *)((unsigned long)dosHeader + (unsigned long)dosHeader->e_lfanew);
if( peHeader->Signature != IMAGE_NT_SIGNATURE )
return 0x00;
return peHeader->OptionalHeader.SizeOfImage;
}
DWORD scan( HANDLE hProc, const DWORD length = 0x200, DWORD base = 0x00 )
{
if(!base )
return base;
if( AllocConsole() )
AttachConsole( GetCurrentProcessId() );
freopen( "CON", "w", stdout );
SetConsoleTitleW( L"Test Console" );
MEMORY_BASIC_INFORMATION memInfo;
int sigLength = sizeof( sig );
const DWORD size = getImageSize( memInfo );
unsigned char *pBase;
pBase = (unsigned char *)base;
printf( "Size = %d\n", size );
if( !size )
return size;
for( int i(0); i < size; i++ )
{
printf( "\\x%02X", pBase[i] );
printf( "\\x%02X", (unsigned char *)sig[i] );
if( i && (i % 10 == 0))
system( "PAUSE" );
if( pBase[i] == sig[i] )
{
for( int j(i), k(0); k < sigLength; j++, k++ )
{
if( sig[k] == '?' )
continue;
if( pBase[j] != sig[k] )
break;
if( j == (sigLength-1) )
return (DWORD)&pBase[i];
}
}
}
printf( "\n" );
system( "PAUSE" );
return 0x00;
}
BOOL WINAPI DllMain ( HMODULE hModule, DWORD dwReason, LPVOID lpReserved )
{
if( dwReason == DLL_PROCESS_ATTACH )
{
DWORD base = (DWORD)GetModuleHandleA( NULL );
scan( GetCurrentProcess(), 0x200, base );
}
return TRUE;
}
我能想到的唯一一件事是该值被视为已签名,但 %02X 不会使其未签名吗?
提前致谢。
【问题讨论】: