首页
社区
课程
招聘
riijj 的Crack me的一点疑惑
2006-9-5 04:45 3819

riijj 的Crack me的一点疑惑

2006-9-5 04:45
3819
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呀)

很奇怪 (应该这可以写到一个函数里,为什么要用三个函数呢?)

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
打赏
分享
最新回复 (2)
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
caterpilla 1 2006-9-5 10:58
2
0
请问这个CRACKME在哪里可看到?有源码吗?
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2006-9-6 16:14
3
0
那时候我很懒,没有为 crackme 的代码写批注,名字也胡乱使用

现在已经记不起了
游客
登录 | 注册 方可回帖
返回