姓名:
电话:
QQ:
学历:

游戏分析之综述

发布时间:2010-02-01 18:32   内容发布:武汉科锐软件安全教育机构

文章分析的程序和外挂可以本站下载区下载

程序说明:
以Windows消息循环的方式来分析这个游戏,先用PEID查看,发现什么也没有,再用OD载入发现没有加壳。从代码的风格上来看不是用VC,BC或汇编写的可能是其它的编译器编译的。
流程概述:
1.    解密数据,注册窗口
2.    创建窗口
3.    消息循环,等待
4.    在消息空闲的时候,开始游戏的数据,控制处理
5.    如果收到退出消息就退出进程
程序分析:
00402020 > $  53            push    ebx
00402021   .  83C4 E4       add     esp, -1C
00402024   .  6A 00         push    0                                    /pModule = NULL
00402026   .  E8 C7270000   call    <jmp.&KERNEL32.GetModuleHandleA>     \GetModuleHandleA
0040202B   .  A3 D8694000   mov     dword ptr [4069D8], eax
得到程序实例句柄。
00402030   .  E8 D3010000   call    00402208
    跟入此call
    0040220E  |.  E8 6F260000   call    <jmp.&WINMM.timeGetTime>
00402213  |.  A3 005C4000   mov     dword ptr [405C00], eax
得到系统时间放到全局变量里面
    0040221A  |.  BE B0634000   mov     esi, 004063B0
0040221F  |>  8B06          /mov     eaxdword ptr [esi]
00402221  |.  E8 CEFFFFFF   |call    004021F4
00402226  |.  43            |inc     ebx
00402227  |.  83C6 04       |add     esi, 4
0040222A  |.  83FB 0D       |cmp     ebx, 0D
0040222D  |.^ 7C F0         \jl      short 0040221F
    将一些文本字符串数据解密
    
004022B8  |.  C74424 04 182>mov     dword ptr [esp+4], 00402318
004022C0  |.  33D2          xor     edxedx
004022C2  |.  895424 08     mov     dword ptr [esp+8], edx
004022C6  |.  33C9          xor     ecxecx
004022C8  |.  894C24 0C     mov     dword ptr [esp+C], ecx
004022CC  |.  8B1D D8694000 mov     ebxdword ptr [4069D8]
004022D2  |.  895C24 10     mov     dword ptr [esp+10], ebx
004022D6  |.  6A 65         push    65                                   /RsrcName = 101.
004022D8  |.  53            push    ebx                                  |hInst => NULL
004022D9  |.  E8 68250000   call    <jmp.&USER32.LoadIconA>              \LoadIconA
004022DE  |.  894424 14     mov     dword ptr [esp+14], eax
004022E2  |.  68 007F0000   push    7F00                                 /RsrcName = IDC_ARROW
004022E7  |.  6A 00         push    0                                    |hInst = NULL
004022E9  |.  E8 5E250000   call    <jmp.&USER32.LoadCursorA>            \LoadCursorA
004022EE  |.  894424 18     mov     dword ptr [esp+18], eax
004022F2  |.  33C0          xor     eaxeax
004022F4  |.  894424 1C     mov     dword ptr [esp+1C], eax
004022F8  |.  33D2          xor     edxedx
004022FA  |.  895424 20     mov     dword ptr [esp+20], edx
004022FE  |.  C74424 24 565>mov     dword ptr [esp+24], 00405C56          ASCII "wcTKKN"
00402306  |.  54            push    esp                                  /pWndClass
00402307  |.  E8 22250000   call    <jmp.&USER32.RegisterClassA>         \RegisterClassA
可见是注册窗口类,00402318就是消息处理函数了。
马上调用00402059   > \E8 12010000   call    00402170
进入
    00402170  /$  53            push    ebx
00402171  |.  83C4 F0       add     esp, -10
00402174  |.  33C0          xor     eaxeax
00402176  |.  894424 04     mov     dword ptr [esp+4], eax
0040217A  |.  890424        mov     dword ptr [esp], eax
0040217D  |.  C74424 08 400>mov     dword ptr [esp+8], 140
00402185  |.  C74424 0C F00>mov     dword ptr [esp+C], 0F0
0040218D  |.  6A 00         push    0                                    /ExtStyle = 0
0040218F  |.  6A 00         push    0                                    |HasMenu = FALSE
00402191  |.  68 0000CA00   push    0CA0000                              |Style = WS_OVERLAPPED|WS_MINIMIZEBOX|WS_SYSMENU|WS_CAPTION
00402196  |.  8D5424 0C     lea     edxdword ptr [esp+C]               |
0040219A  |.  52            push    edx                                  |pRect
0040219B  |.  E8 DC260000   call    <jmp.&USER32.AdjustWindowRectEx>     \AdjustWindowRectEx
004021A0  |.  6A 00         push    0                                    /lParam = NULL
004021A2  |.  8B0D D8694000 mov     ecxdword ptr [4069D8]              |
004021A8  |.  51            push    ecx                                  |hInst => NULL
004021A9  |.  6A 00         push    0                                    |hMenu = NULL
004021AB  |.  6A 00         push    0                                    |hParent = NULL
004021AD  |.  8B4424 1C     mov     eaxdword ptr [esp+1C]              |
004021B1  |.  8B5424 14     mov     edxdword ptr [esp+14]              |
004021B5  |.  2BC2          sub     eaxedx                             |
004021B7  |.  50            push    eax                                  |Height
004021B8  |.  8B4C24 1C     mov     ecxdword ptr [esp+1C]              |
004021BC  |.  8B4424 14     mov     eaxdword ptr [esp+14]              |
004021C0  |.  2BC8          sub     ecxeax                             |
004021C2  |.  51            push    ecx                                  |Width
004021C3  |.  68 00000080   push    80000000                             |Y = 80000000 (-2147483648.)
004021C8  |.  68 00000080   push    80000000                             |X = 80000000 (-2147483648.)
004021CD  |.  68 0000CA00   push    0CA0000                              |Style = WS_OVERLAPPED|WS_MINIMIZEBOX|WS_SYSMENU|WS_CAPTION
004021D2  |.  68 515C4000   push    00405C51                             |WindowName = ""93,"翆P"
004021D7  |.  68 565C4000   push    00405C56                             |Class = "wcTKKN"
004021DC  |.  6A 00         push    0                                    |ExtStyle = 0
004021DE  |.  E8 8D260000   call    <jmp.&USER32.CreateWindowExA>        \CreateWindowExA
004021E3  |.  8BD8          mov     ebxeax
004021E5  |.  6A 0A         push    0A                                   /ShowState = SW_SHOWDEFAULT
004021E7  |.  53            push    ebx                                  |hWnd
004021E8  |.  E8 2F260000   call    <jmp.&USER32.ShowWindow>             \ShowWindow
004021ED  |.  8BC3          mov     eaxebx
004021EF  |.  83C4 10       add     esp, 10
004021F2  |.  5B            pop     ebx
004021F3  \.  C3            retn
    创建并显示窗口了,通过参数可以看出游戏窗口的信息。
返回
00402095   .  54            push    esp                                  /pMsg
00402096   .  E8 7B270000   call    <jmp.&USER32.TranslateMessage>       \TranslateMessage
0040209B   .  54            push    esp                                  /pMsg
0040209C   .  E8 C3270000   call    <jmp.&USER32.DispatchMessageA>       \DispatchMessageA
004020A1   >  6A 01         push    1                                    /RemoveMsg = PM_REMOVE
004020A3   .  6A 00         push    0                                    |MsgFilterMax = WM_NULL
004020A5   .  6A 00         push    0                                    |MsgFilterMin = WM_NULL
004020A7   .  6A 00         push    0                                    |hWnd = NULL
004020A9   .  8D5424 10     lea     edxdword ptr [esp+10]              |
004020AD   .  52            push    edx                                  |pMsg
004020AE   .  E8 87270000   call    <jmp.&USER32.PeekMessageA>           \PeekMessageA
消息循环
后面的调用WaitMessage附近是一些游戏的逻辑。
再向后才是最重要的地方之-:
004020FB   .  E8 00130000   call    00403400
关于call    00403400函数的作用是控制游戏和核心,下几篇详细分析
00402112   .  51            push    ecx                                  /ExitCode
00402113   .  E8 EC260000   call    <jmp.&KERNEL32.ExitProcess>          \ExitProcess
退出进程

Copyright©2007-2015 武汉市科锐软件技术有限公司.
公司地址:武汉市东湖新技术开发区关南园一路当代光谷梦工场5号楼十层
鄂ICP备17007538号-1