【文章标题】: 游戏菜单加个点击率功能
【文章作者】: 逍遥法外
【作者邮箱】: qf.net@163.com
【作者QQ号】: 30068591
【软件名称】: cgo游戏菜单
【软件大小】: 134K
【加壳方式】: ASPack 2.12
【编写语言】: Microsoft Visual C++ 7.0
【使用工具】: peid,waspack,od,vs2005
【操作平台】: winxpsp2
【软件介绍】: 锐起cgo首席游戏官
【作者声明】: 新手报道,多多指教!!!
--------------------------------------------------------------------------------
【详细过程】
步骤:
1. 在游戏菜单中取得游戏调用路径
2. 把取得的调用路径作为命令行参数传给外部程序
3. 外部程序把命令行参数与点击率写到共享服务器的ini文件中保存,OK
文件名:RTGameMenuCln.exe
peid发现ASPack 2.12,到看学下载aspack 2.12的脱壳机,文件脱壳后240K
od载入,因为游戏菜单要调用游戏,无非就WinExec或CreateProcess,那我就Ctrl+N查找这两个api并在每个调用处设置断点。
//CreateProcess 的两个调用:
参考位于 _UnPacke:UnPackEr 到 KERNEL32.CreateProcessA
地址 反汇编 注释
00414B42 call dword ptr [<&KERNEL32.CreateProc kernel32.CreateProcessA
0041543F call dword ptr [<&KERNEL32.CreateProc kernel32.CreateProcessA
//WinExec 的一个调用:
参考位于 _UnPacke:UnPackEr 到 KERNEL32.WinExec
地址 反汇编 注释
00412B6B call dword ptr [<&KERNEL32.WinExec>] kernel32.WinExec
//设置好后F9运行,并在菜单里随便运行一个游戏od会在00414B42处停下,一看EAX显示ASCII "f:\netgame\诛仙\Run.exe"
//就是我刚才游戏菜单里运行的游戏路径。我想把这个路径作为游戏区分,当然你也可以往下找到调用游戏名。我准备在00414B3F处跳转到空白区域,好把这个游戏路径传给外部程序。
00414B2F |. 8BCE mov ecx, esi
00414B31 |. C74424 3C 440>mov dword ptr [esp+3C], 44
00414B39 |. FF15 5CB34100 call dword ptr [<&MFC71.#2469_ATL::CS>; MFC71.7C143771
00414B3F |. 50 push eax ; |CommandLine
00414B40 |. 6A 00 push 0 ; |ModuleFileName = NULL
00414B42 |. FF15 00B14100 call dword ptr [<&KERNEL32.CreateProc>; \CreateProcessA //od在此行停下来了
00414B48 |. 85C0 test eax, eax
00414B4A |. 5F pop edi
00414B4B |. 75 38 jnz short 00414B85
//我在0041AA90选了一片空地先把原程序还原,就是我设置跳转占用的那几个和获取路径字符串及调用外部程序的指令都放在这
//这几句是原程序
0041AA90 > \50 push eax ; |CommandLine
0041AA91 . 6A 00 push 0 ; |ModuleFileName = NULL
0041AA93 . E8 CF783E7C call kernel32.CreateProcessA ; \CreateProcessA
//获取字符串,并把字符串联接到0041AB30的后面(0041AB30地址放的是我写的外部程序"qfr.exe ",0),这样就给外部程序提供了命令行参数
0041AA98 . 56 push esi
0041AA99 . 57 push edi
0041AA9A . 50 push eax
0041AA9B . 8B7424 E8 mov esi, dword ptr [esp-18]
0041AA9F . BF 38AB4100 mov edi, 0041AB38
0041AAA4 > AC lods byte ptr [esi]
0041AAA5 . 08C0 or al, al
0041AAA7 . 74 03 je short 0041AAAC
0041AAA9 . AA stos byte ptr es:[edi]
0041AAAA .^ EB F8 jmp short 0041AAA4
0041AAAC > 58 pop eax
0041AAAD . 5F pop edi
0041AAAE . 5E pop esi
0041AAAF . EB 04 jmp short 0041AAB5
//上面的参数都提供了,下面就该调用了,直接调用外部程序qfr.exe
0041AAB5 > 6A 05 push 5 ; /ShowState = SW_SHOW
0041AAB7 . 68 30AB4100 push 0041AB30 ; |CmdLine = "qfr.exe "
0041AABC . E8 AC68447C call kernel32.WinExec ; \WinExec
0041AAC1 .^ E9 82A0FFFF jmp 00414B48
//我的外部程序字符串:
0041AB30 . 71 66 72 2E 6>ascii "qfr.exe ",0
//外部程序qfr.exe的原码:
char* str="TEST";
char* path = "\\\\server\\log$\\c.ini";
if(lpCmdLine!=NULL)
str = lpCmdLine;
Buffer[0] = '\0';
GetPrivateProfileString("m",str,"0",Buffer,sizeof(Buffer), path);
if (Buffer[0]== '0')//是否第一次
WritePrivateProfileString("m", str, "1", path);
else
{
int i = atoi(Buffer);
char a[4];
sprintf(a,"%d",++i);
WritePrivateProfileString("m", str, a, path);//"m", str, (++inT).ToString());
}
//最后客户机启动时把修改的菜单与刚写的外部程序考到菜单目录,在到服务器设置一个隐藏共享文件,客户机每点一个游戏都会在共享文件里写入游戏路径与游戏点击次数
【下载地址】:
241K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2&6i4K6u0V1M7h3k6Q4x3X3g2U0L8W2)9J5c8X3c8G2N6$3&6K6i4K6u0r3M7h3k6U0k6$3!0Q4x3X3g2Z5N6r3@1`.
--------------------------------------------------------------------------------
【版权声明】: 只供学习研究,请勿商业使用,版权归锐起
2008年04月09日 0:55:38
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课