红色警戒实现无限核弹的艰辛之路
本帖最后由 KaQqi 于 2019-4-29 20:32 编辑这个思路从寒假就提出了,只是当时一直没有空实现。这个周末有空了,就想试试,顺便看看联机能不能用。
待会可以又水一期视频了。。
视频版本地址:https://www.bilibili.com/video/av49956719/
下面开始正题
https://static.52pojie.cn/static/image/hrline/2.gif
根据之前的成果,通过搜索字符串定位到关键部分。
之前已经有过注入箱子实现无限钱和地图全开的经验了(详见前贴),所以知道第一个call仅仅是一个提示而已,没什么用。。于是往下跟踪
这部分代码没有多少内容,一共就3个call。依次看了看,通过字符串可以确定每一个call的用途。
第三个call之前做科技全开的时候提到过。。是添加建造选项的。于是第一反应就是用@苏紫方璇 大神的注入器调用这个call。。
跟进call发现,这个call需要2个堆栈参数,一个寄存器参数
于是现在的任务就是找一下ecx和eax的值哪来的。。
向上回溯,得到
00482D44|.B9 E8F78700 mov ecx,gamemd.0087F7E8
对于eax,则需要动态跟踪。
回溯发现
00482D3E|.8B83 98000000 mov eax,dword ptr ds:
那么ebx又是从哪来的呢?
回溯发现
00482CC5|.8BD8 mov ebx,eax ;kernel32.BaseThreadInitThunk
额,那么此时eax又是从哪来的呢?
代码不多,果断下断点动态跟踪。发现第一个call就是用来获得eax的。。
00482CB8|.B9 14000000 mov ecx,0x14
00482CBD|.E8 EEC12400 call gamemd.006CEEB0 ;得到eax
这样,三个参数就集齐了。立刻打开代码注入器
pushad
mov ecx,0x14
call 006ceeb0
mov ebx,eax
mov eax,
mov ecx,0087f7e8
push eax
push 1f
call 006a6300
popad
ret
@610100 :要这核弹有个屁用,不能用
这估计就是倒数第二个call作的怪了。
点进去一看有点眼熟,再跟踪一层突然想起在无线超武那一节研究过这里
跟进分析
发现有3个堆栈参数,一个寄存器参数。
00482D17|.6A 00 push 0x0
00482D19|.6A 00 push 0x0
00482D1B|.8B0C81 mov ecx,dword ptr ds: ;ecx来源
00482D1E|.6A 01 push 0x1
00482D20|.E8 3B882400 call gamemd.006CB560 ;调整cd
00482D25|.84C0 test al,al
然后向上回溯找ecx。发现ecx竟然是由一个堆栈地址赋值的。。
00482D13|.8B4C24 3C mov ecx,dword ptr ss: ;ntdll.7701E115
于是从头开始往下跟踪,盯着第15行什么时候变成09xxxxxxx。。跟踪了一个小时都没发现这个堆栈地址从哪付的值。定睛一看,诶
610:这tmd不是esp+3c吗。。
00482CE3|.895424 3C mov dword ptr ss:,edx ;edx给ecx赋值
往上回溯分析,看看谁给edx付的值。
00482CDD|.8B92 58020000 mov edx,dword ptr ds: ;edx+258给edx赋值
继续跟踪
00482CC9|.8B91 1C020000 mov edx,dword ptr ds: ;ecx+21c给edx赋值
再继续
00482CC2|.8B4D 08 mov ecx, ;把arg1给ecx
arg1是个眼熟的东西。。之前两次使用代码注入让我知道了他可以是基地址。于是果断写代码
根据这个分析
00482CA1|> \0FBF4E 26 movsx ecx,word ptr ds:
00482CA5|.0FBF56 24 movsx edx,word ptr ds:
00482CA9|.51 push ecx
00482CAA|.52 push edx ;gamemd.<ModuleEntryPoint>
00482CAB|.68 F0CE8100 push gamemd.0081CEF0 ;Crate at %d,%d contains ICBM\n
00482CB0|.E8 2B3CF8FF call gamemd.004068E0
00482CB5|.83C4 0C add esp,0xC
00482CB8|.B9 14000000 mov ecx,0x14
00482CBD|.E8 EEC12400 call gamemd.006CEEB0 ;得到eax
00482CC2|.8B4D 08 mov ecx, ;把arg1给ecx
00482CC5|.8BD8 mov ebx,eax ;kernel32.BaseThreadInitThunk
00482CC7|.33C0 xor eax,eax ;kernel32.BaseThreadInitThunk
00482CC9|.8B91 1C020000 mov edx,dword ptr ds: ;ecx+21c给edx赋值
00482CCF|.8B8A 64020000 mov ecx,dword ptr ds: ;edx+264
00482CD5|.85C9 test ecx,ecx
00482CD7|.0F8E 18060000 jle gamemd.004832F5
00482CDD|.8B92 58020000 mov edx,dword ptr ds: ;edx+258给edx赋值
00482CE3|.895424 3C mov dword ptr ss:,edx ;edx给ecx赋值
00482CE7|.8BFA mov edi,edx ;gamemd.<ModuleEntryPoint>
00482CE9|>8B17 /mov edx,dword ptr ds:
00482CEB|.8B52 28 |mov edx,dword ptr ds: ;<&KERNEL32.GetVersion>
00482CEE|.83BA B4000000>|cmp dword ptr ds:,0x0
00482CF5|.74 0D |je short gamemd.00482D04
00482CF7|.40 |inc eax ;kernel32.BaseThreadInitThunk
00482CF8|.83C7 04 |add edi,0x4
00482CFB|.3BC1 |cmp eax,ecx
00482CFD|.^ 7C EA \jl short gamemd.00482CE9
00482CFF|.E9 F1050000 jmp gamemd.004832F5
00482D04|>83F8 FF cmp eax,-0x1
00482D07|.0F84 E8050000 je gamemd.004832F5
00482D0D|.8B83 98000000 mov eax,dword ptr ds:
00482D13|.8B4C24 3C mov ecx,dword ptr ss: ;ntdll.7701E115
00482D17|.6A 00 push 0x0
00482D19|.6A 00 push 0x0
00482D1B|.8B0C81 mov ecx,dword ptr ds: ;ecx来源
00482D1E|.6A 01 push 0x1
00482D20|.E8 3B882400 call gamemd.006CB560 ;调整cd
得到
pushad
mov ecx,0x14
call 006ceeb0
mov ebx,eax
mov eax,
mov edx,
mov ecx,
mov ecx,dword ptr ds:
push 0
push 0
mov ecx,
push 1
call 006CB560
mov eax,
mov ecx,0087f7e8
push eax
push 1f
call 006a6300
popad
ret
写完了果断注入,注入了果断报错。
我哪写错了,不是逐句写的吗
610:我觉得我们不如去搞比利
于是不得已请教了szfx大神,szfx大神给出了调试注入器的办法。
1.用一个od调试注入器,下 kernel32.CreateRemoteThread 的断点
2.断下后得到地址,在游戏od里跟踪这个地址
3.进入,下断,然后让注入器od运行起来。
然后走着走着发现,走过一个mov居然崩溃了。。
走过mov还能崩溃?定睛一看,发现崩溃的原因是后面的地址不存在。
仔细检查一番,发现mov ecx,dword ptr ds:这一行是多余的,因为他既不影响下面的edx的取值,从而影响最终ecx的取值、还会影响ecx本身的取值,导致程序gg
最终写出代码注入的代码
pushad
mov ecx,0x14
call 006ceeb0
mov ebx,eax
mov eax,
mov edx,
mov ecx,
push 0
push 0
mov ecx,
push 1
call 006CB560
mov eax,
mov ecx,0087f7e8
push eax
push 1f
call 006a6300
popad
ret
by KaQqi 20190420
ps:对战注入这个拿这个炸人真爽
如果需要的话,可以在b站发一下过程视频。风格和上次地图全开一样,不是为了直接得出答案,而是用来幽默的逆向(呸,是为了哗众取宠),积累逆向经验(呸,是播放量),增加收货(呸,是粉丝量)
我太菜了,搞了一个下午。。
视频版本地址:https://www.bilibili.com/video/av49956719/ 膜拜会无限扔核弹的大佬 写完了果断注入,注入了果断报错
这句话很有幽默感 厉害{:1_921:},越来越深入了。
我以前只是用CE简单修改内存完成这些功能。
但是做任务的时候,没有基地。。。只有几个兵。。。
那时候不用基地,直接把兵营功能给打开,把小兵建造也给打开了,可惜不能造小兵。
希望楼主也能从这个方向研究研究。
厉害辛苦了咳咳咳咳 有成型品没,小白不懂 这个真是硬核 膜拜会无限扔核弹的大佬 如果联网时,选一群动员兵,能给自己加铁幕不死,然后举枪就是射核弹。。。对面联网的玩家会说啥? 楼主给力 都是高手啊!膜拜一下