【邀请码已发】某游戏平台多开修改.
【文章标题】:某游戏平台多开修改
【文章作者】: DK
【软件名称】: XXGame.exe 版本:2.4.104.42
【下载地址】: http://dl_dir.qq.com/minigamefile/QQGame2010Beta4P1_setup_web.EXE
【保护方式】: 无
【编写语言】: VC6.0
【使用工具】: PEiD,OllyDBG.
【操作平台】: Windows XP
【软件介绍】:游戏平台
【作者声明】: 第一次写这种文章,失误之处敬请诸位大侠赐教!
(文章格式参考自论坛各位大侠的作品,谢谢)
思路:
(a)第一次打开游戏平台的情况下,
(b)平台已经运行,第二次打开平台.
在以上(a,b)两种情况下,用OD调试平台的运行,
找到两种情况下程序运行的不同分支,也就是平台退出或运行的跳转语句,修改跳转条件,达到多开的目的.
用PEiD先看一下,没加壳.
1.直接OD打开,程序停在:
004023A4 >/$ 55 PUSH EBP
004023A5 |. 8BEC MOV EBP,ESP
004023A7 |. 6A FF PUSH -1
004023A9 |. 68 38314000 PUSH 某游戏.00403138
004023AE |. 68 2A254000 PUSH <JMP.&MSVCRT._except_handler3> ; SE 处理程序安装
004023B3 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
004023B9 |. 50 PUSH EAX
004023BA |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP
2.直接按F9执行,游戏客户端直接运行,说明程序没有陷阱.OD中关闭平台.
3.直接打开一个客户端.(下文中用<B>代替)
4.回到OD中按Ctrl+F2(重新运行).程序停在步骤1位置.(入口处).
5.按F8单步执行.遇到向上的跳转,直接将光标下移,再按F4(直接运行到光标处).
让程序一直向下走.
当走到
004024D3 |. E8 F5FDFFFF CALL 某游戏.004022CD ; \关键CALL
时候,发现游戏经过很多运算,程序执行2-3秒,之后游戏退出.
F2下断004024D3,
关闭步骤3中直接运行的(<B>客户端),
Ctrl+F2重新加载游戏平台,在执行到004024D3的时候,按F8,在CALL内部执行的时候,平台登陆窗体就已经显示出来了.
这说明,判断判断在这个CALL里面.
6.打开直接运行的客户端(B),OD中Ctrl+F2(重新加载),直接F9运行到断点004024D3处,F7步入,到如下代码
004022CD /$ 55 PUSH EBP
004022CE |. 8BEC MOV EBP,ESP
004022D0 |. 83EC 18 SUB ESP,18
004022D3 |. 8D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
004022D6 |. E8 25EDFFFF CALL 某游戏.00401000
004022DB |. 837D 10 00 CMP DWORD PTR SS:[EBP+10],0
004022DF |. FF75 14 PUSH DWORD PTR SS:[EBP+14]
004022E2 |. 74 05 JE SHORT 某游戏.004022E9
004022E4 |. FF75 10 PUSH DWORD PTR SS:[EBP+10]
004022E7 |. EB 02 JMP SHORT 某游戏.004022EB
004022E9 |> 6A 00 PUSH 0
004022EB |> FF75 08 PUSH DWORD PTR SS:[EBP+8]
004022EE |. 8D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
004022F1 |. E8 44EDFFFF CALL 某游戏.0040103A ; 1层步入关键call
在执行到004022F1,程序同样做了很多工作,比较可疑,F2在004022F1下断.
老方法判断其中是否包含判断:关闭<B>, 在OD中Ctrl+F2,执行到004022F1时,按F8,程序同样显示出了登陆窗体.说明判断指令在这里里面.
ctrl+F2,使OD到程序入口,打开<B>,OD走到刚刚下的断点004022F1,F7进入.
7.程序如下:
0040103A /$ B8 C2254000 MOV EAX,某游戏.004025C2
0040103F |. E8 FC120000 CALL 某游戏.00402340
00401044 |. 51 PUSH ECX
00401045 |. 51 PUSH ECX
00401046 |. 53 PUSH EBX
00401047 |. 56 PUSH ESI
00401048 |. 57 PUSH EDI
00401049 |. 33DB XOR EBX,EBX
0040104B |. 8BF9 MOV EDI,ECX
0040104D |. 53 PUSH EBX
0040104E |. 897D EC MOV DWORD PTR SS:[EBP-14],EDI
00401051 |. FF15 04314000 CALL DWORD PTR DS:[<&ole32.CoInitialize>>; ole32.CoInitialize
00401057 |. 53 PUSH EBX
00401058 |. E8 79010000 CALL 某游戏.004011D6
0040105D |. 8BCF MOV ECX,EDI
0040105F |. E8 89040000 CALL 某游戏.004014ED
00401064 |. 8BCF MOV ECX,EDI
00401066 |. E8 09050000 CALL 某游戏.00401574
0040106B |. 8BCF MOV ECX,EDI
0040106D |. E8 85030000 CALL 某游戏.004013F7
00401072 |. 8BCF MOV ECX,EDI
00401074 |. E8 AF030000 CALL 某游戏.00401428
00401079 |. 6A 14 PUSH 14
0040107B |. E8 A8120000 CALL <JMP.&MSVCRT.??2@YAPAXI@Z>
00401080 |. 59 POP ECX
00401081 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
00401084 |. 3BC3 CMP EAX,EBX
00401086 |. 895D FC MOV DWORD PTR SS:[EBP-4],EBX
00401089 |. 74 11 JE SHORT 某游戏.0040109C
0040108B |. 68 2C404000 PUSH 某游戏.0040402C ; ASCII "factory.dll"
00401090 |. 8BC8 MOV ECX,EAX
00401092 |. E8 B5000000 CALL 某游戏.0040114C
00401097 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
0040109A |. EB 03 JMP SHORT 某游戏.0040109F
0040109C |> 895D F0 MOV DWORD PTR SS:[EBP-10],EBX
0040109F |> 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004010A2 |. 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
004010A6 |. 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
004010A9 |. 3BC3 CMP EAX,EBX
004010AB |. 74 6A JE SHORT 某游戏.00401117
004010AD |. 6A 02 PUSH 2
004010AF |. FFD0 CALL EAX
004010B1 |. 8BF0 MOV ESI,EAX
004010B3 |. 59 POP ECX
004010B4 |. 3BF3 CMP ESI,EBX
004010B6 |. 74 5F JE SHORT 某游戏.00401117
004010B8 |. 8B06 MOV EAX,DWORD PTR DS:[ESI]
004010BA |. 68 01E00200 PUSH 2E001
004010BF |. 68 20404000 PUSH 某游戏.00404020 ; ASCII "StartUp.dll"
004010C4 |. 53 PUSH EBX
004010C5 |. 8BCE MOV ECX,ESI
004010C7 |. FF50 08 CALL DWORD PTR DS:[EAX+8]
004010CA |. 8BF8 MOV EDI,EAX
004010CC |. 3BFB CMP EDI,EBX
004010CE |. 74 27 JE SHORT 某游戏.004010F7
004010D0 |. 8B07 MOV EAX,DWORD PTR DS:[EDI]
004010D2 |. 8BCF MOV ECX,EDI
004010D4 |. FF50 3C CALL DWORD PTR DS:[EAX+3C]
004010D7 |. 85C0 TEST EAX,EAX
004010D9 |. 74 13 JE SHORT 某游戏.004010EE ; 关键跳转
004010DB |. 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
004010DE |. 53 PUSH EBX ; /Arg1
004010DF |. E8 53020000 CALL 某游戏.00401337 ; \某游戏.00401337
004010E4 |. 8B07 MOV EAX,DWORD PTR DS:[EDI]
004010E6 |. FF75 0C PUSH DWORD PTR SS:[EBP+C]
004010E9 |. 8BCF MOV ECX,EDI
004010EB |. FF50 40 CALL DWORD PTR DS:[EAX+40] ; 正常登陆函数的调用
004010EE |> 8B06 MOV EAX,DWORD PTR DS:[ESI]
关闭<B>,再OD中一次往下走. 发现在004010EB这个CALL显示出了登陆平台.
F2这里下断点.
打开<B>,在OD中F9运行,发现004010EB这个断点没有断到. 说明接近目标了.
ps:说明,在有一处:
00401131 |. 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
00401134 |. E8 E6020000 CALL 某游戏.0040141F
00401139 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
00401134这个CALL,F8是过不去的,只有在上下都下断点,F8到附近的时候,按F9过去.这个无关跳转的判断.
不知道是为什么?
在004010EB附近JE的跳转出多下几个断点.
分别比较<B>运行和没运行时候,程序走的路线.
就会发现,我们要找的跳转就在004010EB上面不远:
004010D9 |. 74 13 JE SHORT 某游戏.004010EE ; 关键跳转
这个跳转直接跳到了004010EB(正常登陆函数的调用) 之下.
8.确认我们找的跳转对不对呢?
在004010D9 |. 74 13 JE SHORT 下断点.
在<B>运行的情况下,Ctrl+F2,在运行到004010D9时,双击标志寄存器的0标志位,修改ZF值,如图:
将ZF由1改成0.
继续F9执行,发现程序可疑照常运行了.2个平台出来了.
9.修改程序:
在004010D9处,双击汇编语句"JE SHORT 004010EE",弹出如图窗口,改成NOP,如图:
ps:第一次改成JNZ SHORT 004010EE ,发现程序第一次有问题.
10.保存:
刚才修改后的语句,与其他语句的颜色不一样了.
拖拽鼠标选中修改的2句NOP语句.右键点击,在右键菜单中选择"复制到可执行文件-->>选择",弹出选择"复制",
弹出修改后的文件窗体,再弹出窗体中右键,选择"保存文件".
完工.
拖拉机可以1v2了 ^_^
结束语:
没有直接公布软件名称,感兴趣的朋友可以直接在下载地址里下载.
第一次写这样的文章.不足之处还请见谅!!
[课程]Android-CTF解题方法汇总!