KaQqi 发表于 2019-4-20 19:59

红色警戒实现无限核弹的艰辛之路

本帖最后由 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/

苏紫方璇 发表于 2019-4-20 20:21

膜拜会无限扔核弹的大佬

laochai 发表于 2019-4-20 20:35

写完了果断注入,注入了果断报错
这句话很有幽默感

zhou220 发表于 2019-4-20 21:55

厉害{:1_921:},越来越深入了。
我以前只是用CE简单修改内存完成这些功能。
但是做任务的时候,没有基地。。。只有几个兵。。。
那时候不用基地,直接把兵营功能给打开,把小兵建造也给打开了,可惜不能造小兵。
希望楼主也能从这个方向研究研究。

he1231234 发表于 2019-4-20 20:21

厉害辛苦了咳咳咳咳

橘子啤 发表于 2019-4-20 20:24

有成型品没,小白不懂

19955563626 发表于 2019-4-20 20:26

这个真是硬核

liuyanjie2012 发表于 2019-4-20 20:37

膜拜会无限扔核弹的大佬

qiuss 发表于 2019-4-20 20:47

如果联网时,选一群动员兵,能给自己加铁幕不死,然后举枪就是射核弹。。。对面联网的玩家会说啥?

Norton 发表于 2019-4-20 20:48

楼主给力

what01 发表于 2019-4-20 20:49

都是高手啊!膜拜一下
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 红色警戒实现无限核弹的艰辛之路