本帖最后由 KaQqi 于 2019-4-29 20:32 编辑
这个思路从寒假就提出了,只是当时一直没有空实现。这个周末有空了,就想试试,顺便看看联机能不能用。
待会可以又水一期视频了。。
视频版本地址:https://www.bilibili.com/video/av49956719/
下面开始正题
根据之前的成果,通过搜索字符串定位到关键部分。
之前已经有过注入箱子实现无限钱和地图全开的经验了(详见前贴),所以知道第一个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+0x98]
那么ebx又是从哪来的呢?
回溯发现
00482CC5 |. 8BD8 mov ebx,eax ; kernel32.BaseThreadInitThunk
额,那么此时eax又是从哪来的呢?
代码不多,果断下断点动态跟踪。发现第一个call就是用来获得eax的。。
[Asm] 纯文本查看 复制代码 00482CB8 |. B9 14000000 mov ecx,0x14
00482CBD |. E8 EEC12400 call gamemd.006CEEB0 ; 得到eax
这样,三个参数就集齐了。立刻打开代码注入器
[Asm] 纯文本查看 复制代码 pushad
mov ecx,0x14
call 006ceeb0
mov ebx,eax
mov eax,[ebx+98]
mov ecx,0087f7e8
push eax
push 1f
call 006a6300
popad
ret
@610100 :
要这核弹有个屁用,不能用
这估计就是倒数第二个call作的怪了。
点进去一看有点眼熟,再跟踪一层突然想起在无线超武那一节研究过这里
跟进分析
发现有3个堆栈参数,一个寄存器参数。
[Asm] 纯文本查看 复制代码 00482D17 |. 6A 00 push 0x0
00482D19 |. 6A 00 push 0x0
00482D1B |. 8B0C81 mov ecx,dword ptr ds:[ecx+eax*4] ; 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:[esp+0x3C] ; ntdll.7701E115
于是从头开始往下跟踪,盯着第15行什么时候变成09xxxxxxx。。跟踪了一个小时都没发现这个堆栈地址从哪付的值。定睛一看,诶
610:这tmd不是esp+3c吗。。
00482CE3 |. 895424 3C mov dword ptr ss:[esp+0x3C],edx ; edx给ecx赋值
往上回溯分析,看看谁给edx付的值。
00482CDD |. 8B92 58020000 mov edx,dword ptr ds:[edx+0x258] ; edx+258给edx赋值
继续跟踪
00482CC9 |. 8B91 1C020000 mov edx,dword ptr ds:[ecx+0x21C] ; ecx+21c给edx赋值
再继续
00482CC2 |. 8B4D 08 mov ecx,[arg.1] ; 把arg1给ecx
arg1是个眼熟的东西。。之前两次使用代码注入让我知道了他可以是基地址。于是果断写代码
根据这个分析
[Asm] 纯文本查看 复制代码 00482CA1 |> \0FBF4E 26 movsx ecx,word ptr ds:[esi+0x26]
00482CA5 |. 0FBF56 24 movsx edx,word ptr ds:[esi+0x24]
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,[arg.1] ; 把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+0x21C] ; ecx+21c给edx赋值
00482CCF |. 8B8A 64020000 mov ecx,dword ptr ds:[edx+0x264] ; edx+264
00482CD5 |. 85C9 test ecx,ecx
00482CD7 |. 0F8E 18060000 jle gamemd.004832F5
00482CDD |. 8B92 58020000 mov edx,dword ptr ds:[edx+0x258] ; edx+258给edx赋值
00482CE3 |. 895424 3C mov dword ptr ss:[esp+0x3C],edx ; edx给ecx赋值
00482CE7 |. 8BFA mov edi,edx ; gamemd.<ModuleEntryPoint>
00482CE9 |> 8B17 /mov edx,dword ptr ds:[edi]
00482CEB |. 8B52 28 |mov edx,dword ptr ds:[edx+0x28] ; <&KERNEL32.GetVersion>
00482CEE |. 83BA B4000000>|cmp dword ptr ds:[edx+0xB4],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:[ebx+0x98]
00482D13 |. 8B4C24 3C mov ecx,dword ptr ss:[esp+0x3C] ; ntdll.7701E115
00482D17 |. 6A 00 push 0x0
00482D19 |. 6A 00 push 0x0
00482D1B |. 8B0C81 mov ecx,dword ptr ds:[ecx+eax*4] ; ecx来源
00482D1E |. 6A 01 push 0x1
00482D20 |. E8 3B882400 call gamemd.006CB560 ; 调整cd
得到
[Asm] 纯文本查看 复制代码 pushad
mov ecx,0x14
call 006ceeb0
mov ebx,eax
mov eax,[ebx+98]
mov edx,[00a83d4c]
mov ecx,[edx+258]
mov ecx,dword ptr ds:[edx+0x264]
push 0
push 0
mov ecx,[ecx+eax*4]
push 1
call 006CB560
mov eax,[ebx+98]
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+0x264]这一行是多余的,因为他既不影响下面的edx的取值,从而影响最终ecx的取值、还会影响ecx本身的取值,导致程序gg
最终写出代码注入的代码
[Asm] 纯文本查看 复制代码 pushad
mov ecx,0x14
call 006ceeb0
mov ebx,eax
mov eax,[ebx+98]
mov edx,[00a83d4c]
mov ecx,[edx+258]
push 0
push 0
mov ecx,[ecx+eax*4]
push 1
call 006CB560
mov eax,[ebx+98]
mov ecx,0087f7e8
push eax
push 1f
call 006a6300
popad
ret
by KaQqi 20190420
ps:对战注入这个拿这个炸人真爽
如果需要的话,可以在b站发一下过程视频。风格和上次地图全开一样,不是为了直接得出答案,而是用来幽默的逆向(呸,是为了哗众取宠),积累逆向经验(呸,是播放量),增加收货(呸,是粉丝量)
我太菜了,搞了一个下午。。
视频版本地址:https://www.bilibili.com/video/av49956719/ |