当我偶然发现这段代码时,我只是在检查一个简单的可执行打包器的代码,该打包器将一个部分写入可执行文件中,在启动期间将其解包:
void setDistance( unsigned long size )
{
char* set = (((char *)I)+pUnpacker->VirtualAddress);
union
{
short sh[2];
long l;
} conv;
conv.l = size;
conv.sh[0] = 0;
unpacker_set(set, (char *)(&conv.l), 4, TEXT_DISTANCE);
}
Size 是从内存中的解包器代码到应该被解包的 Section 开头的距离。在加载程序代码中,它被定义为无符号长整数。unpacker_set 另一方面有这个代码:
void inline unpacker_set( char* at, char* what, size_t size, unsigned long sig )
{
DWORD oldprotect;
unsigned char *set = (unsigned char *)at;
while(*((unsigned long*)(set)) != sig)
set++;
if(VirtualProtect(set, size, PAGE_READWRITE, &oldprotect) == TRUE)
for(unsigned i=0; i<size; i++)
*(set+i) = *(what+i);
}
虽然我知道第二个例程替换了解包器代码中的值,但我想知道为什么要完成联合的麻烦。任何帮助,将不胜感激。