-
-
riijj 的Crack me的一点疑惑
-
发表于:
2006-9-5 04:45
4021
-
unsigned char *xtable;
int i;
makeoldtable();
xtable = VirtualAlloc(0, 500, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
for( i=0; i<8; i++)
{
xtable[i*12] = 0xb8;
*((DWORD*)(&(xtable[i*12+1]))) = (DWORD)oldtable[i] - 0xe0 ;
oldtable[i] = 0;
xtable[i*12+5] = 0x05;
xtable[i*12+6] = 0xE0;
xtable[i*12+7] = 0x00;
xtable[i*12+8] = 0x00;
xtable[i*12+9] = 0x00;
xtable[i*12+10] = 0x50;
xtable[i*12+11] = 0xc3;
newtable[i] = (void*)&(xtable[i*12]);
}
这段代码有些不明白。
在新函数表里
1) 为什么开始字符是0xb8
2) 后面一个字符要把 函数的真实地址 - 0xe0
3) 0x05, 0xe0, 0x00, 0x00, 0x00, 0x50, 0xc3 这是什么意思?
void godie()
{
__asm push -1;
__asm ret -1;
}
int ccsafe(void *lpapi)
{
if(*((unsigned char*)lpapi + 0xe0) == 0xcc)
{
godie();
}
return 1;
}
int ccsafe2(FARPROC pp)
{
FARPROC x;
x = (void*)*((DWORD*)( (char*)pp + 1));
return ccsafe(x);
}
这三个函数也有些不明白:
ccsafe2 是得到函数地址的第二个字节 不知道这是什么意思,如果说这表示开始一个字节是无用的话,那应该所有的函数调用前都使用这三个 函数,但是只有在ContinueDebugEvent 这个函数调用的时候才使用了这三个函数.
ccsafe 判断 第二个字节的地址的值 + 0xe0 == 0xcc 这句何解?(我认为应该是判断第一个字节是不是等于 0xcc呀)
很奇怪 (应该这可以写到一个函数里,为什么要用三个函数呢?)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课