首页
社区
课程
招聘
[原创]迅雷死循环
发表于: 2013-5-28 23:42 14980

[原创]迅雷死循环

2013-5-28 23:42
14980

Executable modules, item 76
Base=03170000
Size=000CE000 (843776.)
Entry=031E61FF XAppLuaT.<ModuleEntryPoint>
Name=XAppLuaT
File version=1, 0, 0, 70
Path=C:\Users\Public\Thunder Network\KanKan\Pusher\XAppLuaTool.1.0.0.70.dll

LPVOID __cdecl sub_10077B30(int a1, unsigned int a2)
{
        LPVOID v3; // [sp+0h] [bp-24h]@9
        struct _MEMORY_BASIC_INFORMATION Buffer; // [sp+4h] [bp-20h]@6
        LPCVOID lpAddress; // [sp+20h] [bp-4h]@1

        lpAddress = (LPCVOID)sub_10077C00(a1);

        while ( (unsigned int)lpAddress < a2 )
        {
                if ( (unsigned int)lpAddress < 0x50000000 || (unsigned int)lpAddress > 0x80000000 )
                {
                        memset(&Buffer, 0, 0x1Cu);

                        if ( !VirtualQuery(lpAddress, &Buffer, 0x1Cu) )  return 0;

                        if ( Buffer.State != MEM_FREE || Buffer.RegionSize < 0x10000 )
                        {
                                lpAddress = (LPCVOID)sub_10077C00((char *)Buffer.BaseAddress + Buffer.RegionSize);
                        }
                        else
                        {
                                v3 = VirtualAlloc((LPVOID)lpAddress, 0x10000u, 0x3000u, 0x40u);
                                if ( v3 ) return v3;
                                lpAddress = (char *)lpAddress + 0x10000;
                        }
                }
                else
                {
                        lpAddress = (LPCVOID)0x80010000;
                }
        }
        return 0;
}

int __cdecl sub_10077C00(int a1)
{
        if ( (_WORD)a1 )
                a1 -= 0x10000 - (unsigned __int16)a1;
        return a1;
}

Buffer.BaseAddress = 0x01F6E000
Buffer.RegionSize = 0x1000

sub_10077C00应该是对齐0x10000

问题就出在,每次都减去0x1000,又回到BaseAddress

一直VirtualQuery,导致cpu占用30%

如果不是这个问题,我还不怎么关注迅雷的垃圾进程

有必要写个软件干掉所有迅雷的垃圾进程

这函数的作用是找MEM_FREE &&  Buffer.RegionSize >= 0x10000的内存,重新分配利用起来

可惜代码没写好,对齐导致死循环

把 - 改成 +, 就正常了

a1 += 0x10000 - (unsigned __int16)a1;

原始
031E7C00        55              PUSH EBP
031E7C01        8BEC            MOV EBP,ESP
031E7C03        83EC 08         SUB ESP,8
031E7C06        8B45 08         MOV EAX,[EBP+8]
031E7C09        25 FFFF0000     AND EAX,0FFFF
031E7C0E        8945 FC         MOV [EBP-4],EAX
031E7C11        74 14           JE SHORT 031E7C27
031E7C13        B9 00000100     MOV ECX,10000
031E7C18        2B4D FC         SUB ECX,[EBP-4]
031E7C1B        894D F8         MOV [EBP-8],ECX
031E7C1E        8B55 08         MOV EDX,[EBP+8]
031E7C21        2B55 F8         SUB EDX,[EBP-8]                ;sub
031E7C24        8955 08         MOV [EBP+8],EDX
031E7C27        8B45 08         MOV EAX,[EBP+8]
031E7C2A        8BE5            MOV ESP,EBP
031E7C2C        5D              POP EBP
031E7C2D        C3              RETN

修改后
031E7C00        55              PUSH EBP
031E7C01        8BEC            MOV EBP,ESP
031E7C03        83EC 08         SUB ESP,8
031E7C06        8B45 08         MOV EAX,[EBP+8]
031E7C09        25 FFFF0000     AND EAX,0FFFF
031E7C0E        8945 FC         MOV [EBP-4],EAX
031E7C11        74 14           JE SHORT 031E7C27
031E7C13        B9 00000100     MOV ECX,10000
031E7C18        2B4D FC         SUB ECX,[EBP-4]
031E7C1B        894D F8         MOV [EBP-8],ECX
031E7C1E        8B55 08         MOV EDX,[EBP+8]
031E7C21        0355 F8         ADD EDX,[EBP-8]                ;add
031E7C24        8955 08         MOV [EBP+8],EDX
031E7C27        8B45 08         MOV EAX,[EBP+8]
031E7C2A        8BE5            MOV ESP,EBP
031E7C2C        5D              POP EBP
031E7C2D        C3              RETN

这种对齐以前没看过,顺便收集起来,对齐的4种算法

//(1)最容易想到的算法:
unsigned int calc_align1(unsigned int n,unsigned align)
{
        if ( n / align * align == n) return n;
        return (n / align + 1) * align;
}

//(2)更好的算法:
unsigned int calc_align2(unsigned int n,unsigned align)
{
        return ((n + align - 1) & (~(align - 1)));
}

unsigned int calc_align3(unsigned int n,unsigned align)
{
        if (n%align) return (n/align+1)*align;
        else return n;
}

//迅雷
unsigned int calc_align4(unsigned int n,unsigned align)
{
        if (n%align) return n += align - n%align;
        else return n;
}

//hellotong
unsigned int calc_align5(unsigned int n,unsigned align)
{
        return (n+align-1)/align*align;
}

最好的是第2种算法,其他是绿叶衬红花


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 5
支持
分享
最新回复 (22)
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
膜拜小鸡弟弟............
2013-5-29 06:09
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
头像明明是女女。。
2013-5-29 08:14
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
but,我觉得是个男人。。。
2013-5-29 08:46
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
5
膜拜凹凸曼的小鸡弟弟............
2013-5-29 09:05
0
雪    币: 190
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
同膜拜弟弟女女
2013-5-29 10:04
0
雪    币: 141
活跃值: (318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵,不错,。。。
2013-5-29 12:02
0
雪    币: 692
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
这个对齐写法的人肯定没看过linux内核。如果可以通过与运算和移位来解决的尽量不要使用乘除指令。
2013-5-29 12:38
0
雪    币: 258
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
return (n+align-1)/align*align;
2013-5-29 14:10
0
雪    币: 525
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
发现这个死循环,总是占到一个CPU。前几天,每次这样的时候,我就退掉迅雷。
2013-5-29 18:45
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
迅雷5飘过
2013-5-29 19:10
0
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
肯定是男的
2013-5-29 19:25
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主妹妹 那天晚上真的好开心!
2013-5-29 21:18
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
“sub_10077C00应该是对齐0x10000

问题就出在,每次都减去0x1000,又回到BaseAddress

一直VirtualQuery,导致cpu占用30%”

每次减去0x1000在哪里啊 ? 我不能理解这句  麻烦楼主详细说下 ~ 小菜一只
2013-5-29 21:30
0
雪    币: 357
活跃值: (3473)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
15
Buffer.BaseAddress = 0x01F6E000
Buffer.RegionSize = 0x1000

0x01F6E000 = 迅雷对齐(0x01F6E000+0x1000)
2013-5-29 22:07
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
16
我指的头像。。。没说此人哈哈
2013-5-30 21:04
0
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
牛拜~
收藏对齐算法
2013-6-1 15:03
0
雪    币: 647
活跃值: (564)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
18
2013-6-1 15:13
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
see see~
2013-6-2 17:53
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我晕..他不是我的啊..这误会可闹大了啊..
2013-6-5 11:07
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
呵呵,不用看linux内核,只要是成熟一点的开源库,都使用了第二种方法来做对齐,任何一个版本的STL,ACE,Sqlite等,都是使用第二种方法的。只要看过就知道了。
2013-6-24 14:41
0
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
写的好啊!膜拜
2013-6-25 07:39
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
膜拜
2013-6-29 11:39
0
游客
登录 | 注册 方可回帖
返回
//