mugen吧 关注:79,059贴子:1,494,153

新しい技术解析:主程序强制解体

只看楼主收藏回复

也许又是一个隔离用于演出的有趣想法
顺便说一下多线程的写法
新しいテクノロジー:マスタプログラム強制解体
通过修改mugen画面的刷新范围,逐步减少mugen画面刷新范围多出来的区域画面就会残留在那里,直至刷新范围减少为0,整个mugen画面就不刷新了,相当于fps永远为0

图为在主程序强制解体中的彩虹水晶。


IP属地:湖北1楼2022-02-17 21:45回复
    我们最终会发现,此处的值递减时,剩余的画面越来越少。
    于是分析实现慢慢吞噬主程序的代码

    mugen.exe+B404A - mov eax,[mugen.exe+B5518]
    mugen.exe+B404F - mov ebx,[mugen.exe+B551C]
    mugen.exe+B4055 - sub dword ptr [eax+04],02
    mugen.exe+B4059 - sub dword ptr [ebx+04],02
    mugen.exe+B405D - nop
    mugen.exe+B405E - nop
    mugen.exe+B405F - nop
    mugen.exe+B4060 - nop
    mugen.exe+B4061 - nop
    mugen.exe+B4062 - nop
    mugen.exe+B4063 - nop
    mugen.exe+B4064 - nop
    mugen.exe+B4065 - nop
    mugen.exe+B4066 - nop
    mugen.exe+B4067 - push 00000100
    mugen.exe+B406C - call dword ptr [mugen.exe+9F128] { ->kernel32.Sleep }
    mugen.exe+B4072 - jmp mugen.exe+B404A
    mugen.exe+B4074 - nop
    这是此处的代码


    IP属地:湖北3楼2022-02-17 22:06
    回复
      mugen.exe+B404A - mov eax,[mugen.exe+B5518]
      mugen.exe+B404F - mov ebx,[mugen.exe+B551C]
      将上述两个储存地址里的值保存到寄存器里。
      ——————————————————————————————
      注意
      mov eax,[004B404A]是把004B404A这个地址的值复制到eax里
      假如转到004B404A,里面有E001,则上述命令中eax最后为E001
      mov eax,004B404A是把004B404A这些字节移入eax,此时eax=004B404A
      不要弄混,切记。
      ——————————————————————————————
      mugen.exe+B4055 - sub dword ptr [eax+04],02
      mugen.exe+B4059 - sub dword ptr [ebx+04],02
      eax+04的地方-02,ebx+04的地方-02
      dword ptr 你在ce中不输入也会给你自动带上
      mugen.exe+B405D - nop
      mugen.exe+B405E - nop
      mugen.exe+B405F - nop
      mugen.exe+B4060 - nop
      mugen.exe+B4061 - nop
      mugen.exe+B4062 - nop
      mugen.exe+B4063 - nop
      mugen.exe+B4064 - nop
      mugen.exe+B4065 - nop
      mugen.exe+B4066 - nop
      不做任何,指执行后什么也不干
      mugen.exe+B4067 - push 00000100
      mugen.exe+B406C - call dword ptr [mugen.exe+9F128] { ->kernel32.Sleep }
      此处至关重要,是实现【逐渐吞噬】的必须
      void Sleep(DWORD dwMilliseconds)
      此处函数原型
      后面是毫秒
      可以挂起进程,相当于停一段时间
      100转换成十进制就是256毫秒
      最后
      mugen.exe+B4072 - jmp mugen.exe+B404A
      mugen.exe+B4074 - nop
      调回最初,重新-2,一直减
      为什么要sleep?因为每行代码的执行速度很快,不然一下就吞噬了或干涉到了不该干涉的内存以至于闪退。


      IP属地:湖北4楼2022-02-17 22:20
      回复

        ce->工具->创建线程,输入代码开始的地方,开始运行!

        运行得很成功!


        IP属地:湖北5楼2022-02-17 22:25
        回复
          明天讲如何阻止此技术


          IP属地:湖北6楼2022-02-17 22:26
          回复
            MUGEN关于此的地址储存在4B5518和4B551C的地方,此处的值会变但是地址固定。此处地址分别储存在4B5518,4B551C里的值分别加04的位置。稍加探究,多次试验后得出普遍结论:正常时值为E001,减少这里的值E001改为D600再退回主界面,mugen就会出现魂渊的效果


            IP属地:湖北来自Android客户端8楼2022-02-18 01:42
            回复
              牛蛙牛蛙


              IP属地:广西来自Android客户端9楼2022-02-18 11:11
              回复
                行啊


                IP属地:江苏来自Android客户端10楼2022-02-18 11:16
                回复
                  厉害啊~不愧是你啊~


                  IP属地:北京来自Android客户端11楼2022-02-18 12:35
                  回复
                    既然已经有了内存地址,那么阻止它就简单起来了,尤其是这种不像dtc那样会跳来跳去的。
                    阻止代码总是顺着逻辑来,从上述实现代码分析,先获取地址,再修改地址,一气呵成,那么我们把修改
                    的值指回E001就可以大功告成。


                    IP属地:湖北12楼2022-02-18 21:01
                    回复
                      修复代码的第一行肯定是获取地址
                      mugen.exe+B404C - mov eax,[mugen.exe+B5518]
                      mugen.exe+B4051 - mov ebx,[mugen.exe+B551C]
                      但我们这回是用add逐步加回还是用mov直接修改呢?
                      很好想,如果用add的话,那么加到E001时还会继续加,于是我们就自然想到直接覆写的mov
                      mugen.exe+B4057 - cmp [eax+04],000001E0 { 480 }
                      mugen.exe+B405E - je mugen.exe+B4067
                      mugen.exe+B4060 - mov [eax+04],000001E0 { 480 }
                      mugen.exe+B4067 - cmp [ebx+04],000001E0 { 480 }
                      mugen.exe+B406E - je mugen.exe+B4077
                      mugen.exe+B4070 - mov [ebx+04],000001E0 { 480 }
                      于是我们得到以上代码
                      比较eax+04处的值是否为E001,不等于就修改,等于就进入检查ebx+04处的值
                      mugen.exe+B4077 - push 00000000
                      mugen.exe+B407C - call dword ptr [mugen.exe+9F128] { ->kernel32.Sleep }
                      mugen.exe+B4082 - jmp mugen.exe+B404C
                      mugen.exe+B4084 - nop
                      最后,进入sleep,以迅雷不及掩耳之势去覆写修改的内容,再跳回最开始的保存地址段,形成循环


                      IP属地:湖北13楼2022-02-18 21:09
                      回复
                        开始测试,如图是被魂渊药^^住的彩虹水晶

                        让我们尝试在魂渊已经开始吞噬主程序时创建一个修复线程来修复它!

                        成功!


                        IP属地:湖北14楼2022-02-18 21:17
                        回复
                          接下来是多线程的教程


                          IP属地:湖北15楼2022-02-18 21:43
                          回复
                            多线程是隔离技术中的广泛技术,很多人也听说过多线程防御,和Rin和luli的无尽魂渊的多线程直死(就是超直死)和威客的防御与攻击都是靠它的
                            多线程自然离不开API调用,简单说一下API调用的方法
                            格式:
                            push 参数n
                            push 参数3
                            push 参数2
                            push 参数1
                            Call dword ptr [函数基址]
                            比如
                            Sleep,它有一个参数
                            回到函数原型
                            void Sleep(DWORD dwMilliseconds)
                            它的基址是 0049F128
                            于是,套公式
                            push 参数1
                            Call dword ptr [函数基址]
                            ————》
                            push 毫秒(必须是16进制,比如256毫秒,转为16进制为100则此处为push 0000100)
                            Call dword ptr [0049F128]


                            IP属地:湖北16楼2022-02-18 21:52
                            回复
                              但是非常不幸,我们不知道一些函数的基址,于是先辈们留了一条鎏金大道
                              GetModuleHandle与GetProcAddress获取未知的函数基址
                              函数原型如下
                              HMODULE WINAPI GetModuleHandleA(
                              _In_opt_LPCTSTR lpModuleName //DLL模块名
                              );
                              FARPROC GetProcAddress(
                              HMODULE hModule, // DLL模块句柄
                              LPCSTR lpProcName // 函数名
                              );
                              所谓DLL模块,就是我们的dll文件,主要是kernel32.dll
                              套上公式
                              GetModuleHandleA基址0049F0B8
                              有一个参数,是字符串
                              这里记住一个位置:0049F604
                              mugen这里有个固定的KERNEL32字符串,直接套用就可以了
                              push 0049F604
                              Call dword ptr [0049F0B8]
                              它的返回值会给eax(所有kernel32函数的返回值大多如此)
                              类型为HMODULE
                              然后看向第二个函数
                              GetProcAddress有两个参数
                              一个正好是我们获取并保存到eax的HMODULE
                              一个是函数名,我们现在要CreateThread的基址
                              我们找一个空白的内存位置:004BC000
                              mugen.exe+B404A - nop
                              mugen.exe+B404B - mov [004BC000],00000000
                              mugen.exe+B4055 - mov [004BC004],61657243 { "Crea" }
                              mugen.exe+B405F - mov [004BC008],68546574 { "teTh" }
                              mugen.exe+B4069 - mov [004BC00C],64616572 { "read" }
                              mugen.exe+B4073 - mov [004BC010],00000000
                              这样写
                              于是mugen.exe+BC004(004BC004)就是字符串,"CreateThread"
                              然后套公式
                              push 004BC004 (函数名称,参数2)
                              push eax (模块句柄,参数1)
                              call dword ptr [0049F130]
                              返回值也在eax里,就是createthread的基址啦


                              IP属地:湖北17楼2022-02-18 22:11
                              回复