StarCrap12是一款星际争霸108b作弊软件,可以地图全开,很早以前使用过。
今天群里有个人说不支持xp系统,于是决定修改。
发现已经被汉化过, 为aspack211的壳, 于是ollydbg打开,
oep收衡定律:hw stack,却发现中断不了。明明第一条语句是pushad的呀!
于是没办法, f8,f7跟踪, 很快找到了popad出口,找到了oep, dump下来,
重新用ollydbg加载。
发现里面有个关于按纽,于是bp MessageBoxA 却发现中断不下来, 明明
是#32770啊?? 索性把所有的MessageBoxExA等函数都下断点,却发现没一个
能中断, 莫非。。。。
设置所有交互调用断点, 发现了可疑处WaitForSingleObject, CreateProcess..
原来是多进程版, 程序把自身数据解出来释放到临时目录,然后加载运行,
真实的代码并不在此进程中,当然无法跟踪了! 突然想起曾经碰过这种类型
的壳, 把原程序加密起来,到时候释放加载运行, 自己却伪装成aspack211。 呵呵。
这里顺便提一下:原程序是用cheat make之类工具做的(PEiD观看为
Microsoft Visual C++ 6.0 [Overlay]) 呵呵,想想看就知道为什么Overlay是用
cheat make类工具制作的了。 Overlay意味着在exe尾部追加了修改数据,所以是
不能用一般的加壳工具加的, 要不就破坏了文件offset等, 程序无法执行了。
很好, 这个时候把临时目录下的这个文件 STARCRAP.EXE 拿来分析。
我们知道,一般游戏修改工具,都需要做2件事
1:找到运行中的游戏进程
2: 用函数WriteProcessMemory写关键数据(可能是指令或者数据)
一般而言,如果第一步失败了,则不会进行第2步操作。很明显,下断点
bp FindWindowA
bp Process32First
可是,却中断不了。
于是跟踪那个按钮的事件(可以通过窗口句丙和click消息来跟踪)
终于找到了, 原来他是读注册表!!
注册表中有个动态值记录了当前系统的进程列表。这个程序居然是根据这个来判断的!
打开任务管理器,发现星际的进程为starcr~1.exe, 然后程序找的却是starcraft.exe!
(这里估计是xp系统认为是个早期exe,所以生成的进程名为短文件格式,然98下断然
是starcraft.exe长文件名的)
修改比较字符串为starcr~1, 现在可以了,设置OpenProcess, WriteProcessMemory
都能中断到, 可是,在游戏中却没有效果啊!!这没道理。
明明修改了程序的指令, 可是没产生效果。
用另外个ollydbg打开starcraft.exe, 这次来观看指令变化。可是虽然
writeprocessmemory了,对应的指令却没变化。 说明writeprocessmemory失败了。
可是这个函数的参数却没有错。 返回到OpenProcess来, 发现打开方式为PROCESS_VM_WRITE.
应该没问题, 查msdn,PROCESS_VM_WRITE意味着打开方式可以调用writeprocessmemory,
但一般,都是用PROCESS_ALL_ACCESS, 换成PROCESS_ALL_ACCESS试试??
但这里可不好操作了, 因为push PROCESS_VM_WRITE(0x20)是2个字节,
而push PROCESS_ALL_ACCESS(0xf10fff)却是5个字节, 只能用jmp大法了。
查找00 00 00 00 00 找到一处空白处, 写入代码
push PROCESS_ALL_ACCESS
call OpenProcess
jmp 原地址后面紧接的下条语句
原来的push PROCESS_VM_WRITE, call OpenProcess全部nop掉,然后修改成jmp 原00 00 00的空白处。
经查找一共有5处OpenProcess全部修改,这下在去游戏中,ok, 正常!
这里我没那个工具。所以没加壳
另外把原来的www.xxx.com修改成了 支持xp:jjnet qq:900572.收工
PS:刚发网友做测试的时候,他说非法操作。 地址为7c81e079, 经查为OpenProcess.
估计是网吧权限不足, 于是把PROCESS_ALL_ACCESS 换成
PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ(0x38)
大功告成
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)