tag:blogger.com,1999:blog-60739876775316884902024-03-13T21:37:05.107-07:00Luli总是那么饿Anonymoushttp://www.blogger.com/profile/17179538242497895176noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-6073987677531688490.post-29609435158367272162028-12-31T00:00:00.000-08:002018-05-16T03:16:43.915-07:00今天Luli饱了吗?并没有!欢迎来到我的博客<br />
这里大概会写一些MUGEN相关的东西<br />
然后……<br />
就是自己的一些日常啦<br />
(这么随便的置顶真的没问题吗?Anonymoushttp://www.blogger.com/profile/17179538242497895176noreply@blogger.com1tag:blogger.com,1999:blog-6073987677531688490.post-40024468757237750612018-05-29T03:55:00.001-07:002018-05-29T04:15:21.169-07:00关于隔离技术 我之前看了国外一些作者的博文,介绍了各种隔离技术,emmm怎么说呢,我是感觉有点不太好,那么我就在这里说一下我认为的隔离技术。<br />
<br />
;========引用说明=========<br />
大部分内容参考遥远的贴子https://tieba.baidu.com/p/5092155802,说的很详细明白。<br />
;=========正 文==========<br />
<br />
<h2>
<span style="font-size: x-large;">首先一点,隔离技术区分按照什么方式区分 </span></h2>
这个在国内达成了共识隔离技术有两种区分方式——按技术分和按应用分。<br />
<br />
<h3>
<span style="font-size: x-large;">
1 按技术分</span></h3>
<h4>
<span style="font-size: large;">
1.1 512BUG</span></h4>
<div>
<br /></div>
<div>
对方有hitpausetime的情况下可以进入一个有超过512个控制器的状态号。</div>
<div>
该类技术有:</div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;">直死 </span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">利用512BUG</span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">把敌人的ALIVE刷成0</span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;">亲捏造系 </span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">利用512BUG改写内存的某个指针,达到可以改写其它内存的值的效果</span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;">Player消去 </span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">使用512BUG改写对方PLAYER的存在状态</span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;">解除系 </span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">使用512BUG改写对方PLAYER的各种状态</span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">残影 </span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">使用512BUG改写</span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;"><span style="font-size: 14px;">残影控制器的位置,然后通关创建残影写值</span></span><br />
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;"><span style="font-size: 14px;"><br /></span></span></div>
<h4>
<span style="font-size: large;">
1.2 DTC、ATC系</span></h4>
<div>
<br /></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;">DTC = displaytoclipboard;</span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;">ATC = appendtoclipboard;</span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;">该类技术有:</span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;">%N </span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">利用格式控制符进行</span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">溢出,达到在任意地点写值的效果 ※%F为%N中的一种应用,不再赘述</span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;">Text Bug </span><span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">text=“1024%d”输出的值超过1024字节会发生溢出,覆盖掉text的返回值,从而执行写好的纯汇编代码</span><br />
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;"><br /></span></div>
<h4>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: large;">1.3 Statedef状态号溢出攻击</span></h4>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;"><br /></span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">状态号的值超过54字节会发生溢出,覆盖掉状态号的返回值,从而执行写好的纯汇编代码</span><br />
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;"><br /></span></div>
<h4>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: large;">1.4 DEF文件溢出</span></h4>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif;"><br /></span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">利用XP SP1中固有的漏洞,这个BUG就是字符的链表拆解,这个技术又叫“堆溢出”关键代码</span><br />
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">MOV [EAX+4],ECX </span><br />
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;">下一个链表被上一个的CHAR所覆盖掉,ECX又是上一个字符EAX+4的CHAR</span></div>
<div>
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;"><b>※Windows XP限定</b></span><br />
<span style="color: #333333; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px;"><b><br /></b></span></div>
<h3>
<span style="font-size: x-large;">
2 按应用分</span></h3>
<div>
即根据隔离技术的应用来达到某种特定的效果。</div>
<div>
这种有非常多</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-zsYg8fpEW3M/Ww0o2SsTe4I/AAAAAAAAAI4/-UtsDl9H-fEOl-N3zPJvc-f2T5u-QW2IgCLcBGAs/s1600/%25E5%2595%258A%25E6%2589%258B%25E5%258A%25A8%25E9%2598%2580%25E6%2589%258B%25E5%258A%25A8%25E9%2598%2580%25E6%2589%258B%25E5%258A%25A8%25E9%2598%2580.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="887" data-original-width="1015" height="279" src="https://2.bp.blogspot.com/-zsYg8fpEW3M/Ww0o2SsTe4I/AAAAAAAAAI4/-UtsDl9H-fEOl-N3zPJvc-f2T5u-QW2IgCLcBGAs/s320/%25E5%2595%258A%25E6%2589%258B%25E5%258A%25A8%25E9%2598%2580%25E6%2589%258B%25E5%258A%25A8%25E9%2598%2580%25E6%2589%258B%25E5%258A%25A8%25E9%2598%2580.png" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br />
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
大部分应用技术我都在这个表上列出来了,当然肯定还不止这些<br />
<br /></div>
<div>
<br /></div>
<div>
;=========结 论==========</div>
<div>
以上使用的名词皆为技术名词,和技术名词并不一样</div>
<div>
技术名词和技术名称有什么不一样的地方?举个例子</div>
<div>
Statedef状态号溢出和SuperNull</div>
<div>
DEF文件溢出和HyperNull</div>
<div>
YouTube上似乎更喜欢用技术名称,国内一律都是直接用技术名词的</div>
<div>
Textbug啊S溢出啊DEF溢出啊什么%N%F啊什么的</div>
<div>
各个地方有各个地方的叫法无所谓</div>
<div>
但是技术是固定的,<b>隔离技术和隔离技术的详细应用<span style="color: red;">并不能</span>归在一起讨论</b></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
;=========附 加==========</div>
<div>
妈耶写都7点了饿死我了吃饭去了溜了溜了ԅ(¯﹃¯ԅ). . .</div>
Anonymoushttp://www.blogger.com/profile/17179538242497895176noreply@blogger.com0tag:blogger.com,1999:blog-6073987677531688490.post-42010837680552342132018-05-29T01:55:00.001-07:002018-05-29T01:55:07.322-07:00我为什么要这么费心思的做代理公开? 其实我想这么做挺久的了,只是一直没平台搞这玩意。<br />
说实话,国内的Mugen已经差不多凉凉了,充斥着无脑拳皇和无脑强度,然而真正喜欢mugen的都不希望看到这样的情况。新作者做的人物没人关注,老作者的人物更新了也没人用,我基本上是对这现象绝望了。<br />
于是我思考着怎么改善这一局面,国内最大的mugen交流平台就是百度贴吧,百度贴吧的优点很明显,门槛低、流量大、管理简单直接。但是现在发展出来的情况却是越来越差了,大吧直接全换了,白丽上位成为唯一一个大吧,为什么会这9样,因为吃力不讨好啊。<br />
我也想过成为大吧,直接制订一套相对严格的规范。但是发现是要求实名制的……那还是算了吧,当个小吧有点小权限够了。<br />
说回来,我的理念是什么呢。很明显我是个凶恶向的作者(?)但是我的想法并不是winmugen王道或者杀伤越高越好,我更倾向于本质、兼容。说白了就是在没有违反大前提下怎么样都好,纸并强凶狂神论外皆可,并不是限定于哪个级别更优越,各级别都有各自的特色。在这个情况下隔离技术就是个特别的存在了,在隔离技术开发出来的那一刻起似乎就一直是为了杀伤而存在的(少部分是辅助向的比如说天门的helper normal化,但这毕竟是少数),发展到现在是执行速度越来越快,这里有个很有意思的就是,隔离技术并不是以强度来分的而是以速度来区分的,到现在Statedef状态号溢出攻击已经是选人后就执行了(在mugen开启了人物预读取的情况下),既然是按速度来发展的为什么却都是以杀伤为主呢?很简单,杀伤是最直观的体现方式,你说再多也没有一个KO来的简单直接,就这么简单。<br />
我大概可以算是个凶恶向作者,但是我对隔离技术的看法却不是杀伤,而是更广泛的应用,比如说现在日本那里发展起来的隔离技术辅助优化神级技术(亲捏造轻量化全领域亲变更、全领域邪眼、快速探查等等)又比如说我和Rin现在在研究的隔离技术演出向(各P数不同头像、选人宣战宣言、窗体震动等等)以及更特别的隔离技术无效化(KNaCa氏的赫卡特、拉莱耶文本S溢出、萌新氏的七夜式)。我想的是,隔离技术之所以称为“隔离技术”,就是因为这类技术过于强大,更做到很多规格外的事情,如果只是单纯的为了杀伤,那就是炼出来铁却只用来造杀人的刀,浪费。<br />
而国内的氛围却似乎很乐意看到这种只是为了杀伤而杀伤的人物,挺难过的,我记得我不止一次说过做这种套模板类的人物请加上自己的创意,而不是什么都么有就一个贴图然后开幕KO,这样不觉得很无聊吗?<br />
真是因为这种大量存在而观众们又很喜闻乐见的看这种,在一定程度上排挤了真正的作者,他们的优秀的人物就这样被无视了,这是不对的啊。在有了月月的帮助下,同时我还有这么个大容量的优秀的网盘,我就做了这个决定,面向国外的代理公开,为没梯子的作者们提供帮助。<br />
我有想过我理想中的管理mugen的方式,我倒是觉得现在国内MC的方式挺不错的,以论坛+百科的方式呈现。mugen方面百科有了,就是千寻mugen(虽然千寻mugen有很多地方我觉得非常糟糕就是了……),而论坛现在依旧处于贴吧的形式,贴吧不能说不好,只是它是一个大类,而mugen还有很多分类呢,单单版本就有winmugen、mugen1.0、mugen1.1了,更别说还有mugen等级划分、mugen整合包、mugen杯赛这种,贴吧一个大类要管理这种是非常吃力不讨好的,理想方式还是建立一个论坛,当然我是没这个能力啦,只能在这里bb几句而已。<br />
最后我再说一下我对mugen人物的看法。怎么样都好,就是别粗制滥造,YouTube那里有很多演出向的人物都是套层皮的,这种我知道看的就是演出,可是……能不能用心做一下啊,乍一看感觉很厉害,仔细一看什么玩意。这是一,二就是我是反对需要手动执行mugen.exe以外的程序或脚本的人物的,这就是自欺欺人(mugen.exe -p1 winer -p2 loser -p2.life -1000 -rounds 1)这种我一分钟都不需要就是一个,没意思,有本事mugen里自动执行啊,别要人手动执行。三,我其实很希望每个人物都附有readme和update log。四,带有dll的应当附有源代码。<br />
<br />
;==================<br />
乱七八糟说了这么多,饿了,吃东西去了ヾ(≧ ▽ ≦)ゝAnonymoushttp://www.blogger.com/profile/17179538242497895176noreply@blogger.com0tag:blogger.com,1999:blog-6073987677531688490.post-34695367889978746662018-05-22T06:01:00.002-07:002018-05-22T06:01:33.599-07:00新七夜式代码及开发文档七夜式作者——萌新<br />
本文详细介绍了七夜式的研究开发过程<br />
<b>本文所有代码遵循GPLv2许可证发布</b><br />
https://www.gnu.org/licenses/old-licenses/gpl-2.0.html<br />
<br />
<b>※以下内容皆为转载</b><br />
<br />
s溢出的注意点:<br />
1.每隔1kb的代码必须要有一个00,否则mugen会直接在相应位置插入00,导致代码错误<br />
2.不能出现00,3B<br />
3.st文件不要放在第一个,会导致异常<br />
<br />
Statedef状态号溢出攻击研究<br />
# 检测研究<br />
<br />
## 基础知识<br />
<br />
Statedef溢出原理:压入的状态号过长将esp中原本的返回位置覆盖了<br />
<br />
47EBF0是文件处理入口,47F18A,47ECF1,47F23F是返回到溢出写入地址的位置<br />
<br />
47E9B6也是一个返回地址<br />
<br />
4949F0 改动4B2188处可以在对方的读取线程里插入自己的代码,这个地方的原始值是49221E<br />
<br />
注入时获取的esp与对方的状态号返回地址差值10D0 注入时不可读 1p人物信息指针尚未赋值<br />
<br />
esp-DD0出是对方正在处理的文件名字符串头<br />
<br />
状态号返回地址对应堆栈位置的值不固定,进入到溢出区段时可能是正常的地址,在区段中地址保持不变,之后那个位置的值基本随机<br />
<br />
状态号与获取的esp的差值:0D21FF54-0D21EE4C=1108,这个位置是状态号的空格<br />
<br />
esp-dd0处不是00时尚未开始读取statedef状态号<br />
<br />
使用常规的检测太慢,需要一些手段<br />
考虑在对方的状态号返回地址处设置硬件断点,在写入时触发,触发之后会调用异常处理函数。把事先写好的异常处理函数加入对方读取线程的SEH链中。硬件断点会抛出EXCEPTION_SINGLE_STEP异常<br />
进入异常处理函数之后,如果是EXCEPTION_SINGLE_STEP异常就说明对方正在写入状态号返回地址,检查是否正在读取statedef,如果是则判断返回地址是否是正常值<br />
如果返回地址不是正常值,就改成47EB31<br />
返回<br />
<br />
在使用中断+断点之后就不必再设置开始检查和结束检查的条件,只要等到对方的人物信息基地址不是00就进入下一步即可。在这个过程中子线程不执行任何动作。<br />
statedef溢出检查完全在对方的线程里执行,子线程不干预<br />
<br />
fs:[0]指向的区域是可读的,不用担心<br />
由于硬件断点的限制,需要在47EBF0处再设置一个硬件断点,在47EBF0处的异常处理函数里启用对47F18A的断点,在47F18A处的异常处理函数里启用对47EBF0的断点<br />
<br />
## 初步思路:<br />
<br />
### 对方子线程:<br />
<br />
构造一个新的EXCEPTION_REGISTRATION结构,函数地址是statedef_of_dectet_pre,prev是fs:[0]。<br />
修改对方线程的fs:[0],即SEH链,指向上一步构造的结构<br />
在edi+40处设置一个硬件断点,在写入时触发<br />
<br />
### 异常处理函数:<br />
<br />
取出EXCEPTION_RECORD,读出其中的ExceptionCode和ExceptionAddress<br />
检查ExceptionCode是否是EXCEPTION_SINGLE_STEP(0x80000004),不是返回EXCEPTION_CONTINUE_SEARCH (0)<br />
检查[esp]是否是47EB31或者47E9B6,不是改成47EB31并且4B42F0改成1,返回EXCEPTION_CONTINUE_EXECUTION<br />
<br />
异常处理函数入口地址[4B4300]<br />
<br />
~~# 详细设计:~~ <br />
~~## 对方子线程:~~ <br />
~~1. 保存esp到4B4120~~ <br />
~~2. push 异常处理函数入口地址,push fs:[0],构造新的SEH链结构~~ <br />
~~3. mov fs:[0],esp,装入~~ <br />
~~4. 写入“GetCurrentThread”~~ <br />
~~5. 获取GetCurrentThread的地址,保存~~ <br />
~~1. 写入“SuspendThread”~~ <br />
~~1. 获取SuspendThread的地址,保存~~ <br />
~~2. 写入“ResumeThread"~~ <br />
~~1. 获取ResumeThread的地址,保存~~ <br />
~~6. 写入“GetThreadContext”~~ <br />
~~1. 获取GetThreadContext的地址,保存~~ <br />
~~8. 写入“SetThreadContext”~~ <br />
~~1. 获取SetThreadContext的地址,保存~~ <br />
~~10. 调用GetCurrentThread,获取当前线程的句柄,保存到内存中~~ <br />
~~1. 在[4B4200]写入FFFFFFFF~~ <br />
~~1. 调用SuspendThread,暂停自己~~ <br />
~~## 己方子线程:~~ <br />
~~1. 检查[4B4200]是否是FFFFFFFF,不是继续检查~~ <br />
~~11. 调用GetThreadContext,获取对方子线程的Context~~ <br />
~~11. 读dr6,判断异常原因~~ <br />
~~12. 如果是47F18A引发异常 修改Context,Dr0写入47EBF0,Dr7写入401,其他部分不改动;否则修改Context,Dr1写入47F18A,Dr7写入404~~ <br />
~~14. 调用SetThreadContext,写入新的Context~~ <br />
~~14. 在[4B4200]写入10101010~~ <br />
~~15. 调用ResumeThread,恢复对方子线程~~ <br />
<br />
如果在47F18A处设置一个断点,然后在异常处理函数里把CONTEXT->EIP改成403249,重新启用dr0,即让程序从另一个ret指令处返回,避开硬件断点,并返回EXCEPTION_CONTINUE_EXECUTION让程序从403249开始执行<br />
<br />
## 原理:<br />
<br />
Intel 提供了Drx寄存器用于设置硬件断点,执行到硬件断点处会产生单步异常。<br />
在对方的47F18A处设置硬件断点并注入对方选人线程的SEH,在对方执行到47F18A时会触发单步异常。这时自己定义的异常处理函数会被调用,通过判断此时选人线程的返回地址来判断对方是否使用了statedef溢出,如果是就修正地址并通知自己的子线程,之后修改eip到另一个ret指令处,重新启用断点并通知系统忽略异常,这样选人线程会继续执行。当对方读取完毕时自己的子线程进入下一功能模块。<br />
47F18A处只在处理状态定义时执行,执行时返回地址必然是状态定义处理的返回地址,稳定可靠<br />
<br />
## 详细设计:<br />
<br />
### 对方子线程:<br />
<br />
1. 保存esp到4B4120<br />
1. push 异常处理函数入口地址,push fs:[0],构造新的SEH链结构<br />
1. mov fs:[0],esp,装入<br />
1. 写入“GetCurrentThread”<br />
1. 获取GetCurrentThread的地址,保存<br />
1. 写入“SuspendThread”<br />
1. 获取SuspendThread的地址,保存<br />
1. 写入“ResumeThread"<br />
1. 获取ResumeThread的地址,保存<br />
1. 写入“GetThreadContext”<br />
1. 获取GetThreadContext的地址,保存<br />
1. 写入“SetThreadContext”<br />
1. 获取SetThreadContext的地址,保存<br />
1. 调用GetCurrentThread,获取当前线程的伪句柄,保存到内存中<br />
1. 调用GetCurrentProcess获取当前进程的伪句柄(49F0E8)<br />
1. 调用DuplicateHandle获取当前进程的真实句柄,参数为CurrentProcess,CurrentThread,CurrentProcess,4BE320,00000000,01,00000002<br />
1. 在[4B4200]写入FFFFFFFF<br />
1. 调用SuspendThread,暂停自己<br />
<br />
### 己方子线程:<br />
<br />
1. 检查[4B4200]是否是FFFFFFFF,不是继续检查<br />
1. 调用GetThreadContext,获取对方子线程的Context<br />
1. 修改Context,Dr0写入47F18A,Dr1写入47ECF1,Dr2写入47F23F,Dr7写入415<br />
1. 调用SetThreadContext,写入新的Context<br />
1. 在[4B4200]写入00000000<br />
1. 调用ResumeThread,恢复对方子线程<br />
<br />
### 异常处理函数:<br />
<br />
push ebp <br />
mov ebp,esp <br />
sub esp,08 <br />
push ebx <br />
push esi <br />
push edi <br />
mov eax,[ebp+08];第一个参数ExceptionRecord的地址 <br />
mov eax,[eax];第一个参数ExceptionRecord的ExceptionCode <br />
cmp [eax],0x80000004;是否是EXCEPTION_SINGLE_STEP异常 <br />
jne 交给其他的处理函数 <br />
mov eax,[4B4120] <br />
sub eax,10D0 <br />
cmp [eax],47EB31 <br />
je 返回 <br />
cmp [eax],47E9B6 <br />
je 返回 <br />
mov [eax],47EB31 <br />
mov [4B42F0],1 <br />
mov eax,FFFFFFFF <br />
jmp 返回 <br />
交给其他的处理函数: <br />
xor eax,eax <br />
返回: <br />
修改CONTEXT->DR7为401 <br />
修改CONTEXT->EIP为403249 <br />
pop edi <br />
pop esi <br />
pop ebx <br />
mov esp,ebp <br />
pop ebp <br />
ret <br />
<br />
## 编码:<br />
<br />
### 对方子线程:<br />
<br />
### 异常处理函数:<br />
<br />
push ebp<br />
mov ebp,esp<br />
sub esp,08<br />
push ebx<br />
push esi<br />
push edi<br />
mov eax,[ebp+08];第一个参数ExceptionRecord的地址<br />
mov eax,[eax];第一个参数ExceptionRecord的ExceptionCode<br />
cmp [eax],0x80000004;是否是EXCEPTION_SINGLE_STEP异常<br />
jne 交给其他的处理函数<br />
mov eax,[4B4120]<br />
sub eax,10D0<br />
cmp [eax],47EB31<br />
je 返回<br />
cmp [eax],47E9B6<br />
je 返回<br />
mov [eax],47EB31<br />
mov [4B42F0],1<br />
mov eax,FFFFFFFF<br />
jmp 返回<br />
交给其他的处理函数:<br />
xor eax,eax<br />
返回:<br />
mov [4B4200],FFFFFFFF<br />
调用SuspendThread,暂停自己<br />
pop edi<br />
pop esi<br />
pop ebx<br />
mov esp,ebp<br />
pop ebp<br />
ret<br />
<br />
<br />
except_handler:<br />
push ebp<br />
mov ebp,esp<br />
sub esp,08<br />
push ebx<br />
push esi<br />
push edi<br />
mov eax,[ebp+08];第一个参数ExceptionRecord的地址<br />
mov eax,[eax];第一个参数ExceptionRecord的ExceptionCode<br />
cmp [eax],0x80000004;是否是EXCEPTION_SINGLE_STEP异常<br />
jne ret_search<br />
mov eax,[4B4120]<br />
sub eax,10D0<br />
cmp [eax],47EB31<br />
je ret_EXECUTION<br />
cmp [eax],47E9B6<br />
je ret_EXECUTION<br />
mov [eax],47EB31<br />
mov [4B42F0],1<br />
mov eax,FFFFFFFF<br />
jmp ret_EXECUTION<br />
ret_search:<br />
xor eax,eax<br />
ret_EXECUTION:<br />
;修改CONTEXT->DR7为401<br />
;获取CONTEXT的指针<br />
mov edx,[ebp+10]<br />
mov edx,[edx]<br />
add edx,18<br />
mov [edx],401<br />
;修改CONTEXT->EIP为403249<br />
add edx,A0<br />
mov [edx],403249<br />
pop edi<br />
pop esi<br />
pop ebx<br />
mov esp,ebp<br />
pop ebp<br />
ret<br />
# 编码:<br />
对方子线程:<br />
pushad<br />
pushfd<br />
mov [4B4120],esp<br />
push 4B3000<br />
push fs:[0]<br />
mov fs:[0],esp<br />
;写入“GetCurrentThread”,从4BE200开始,避开1p的字符串<br />
mov [4BE200],43746547<br />
mov [4BE204],65727275<br />
mov [4BE208],6854746E<br />
mov [4BE20C],72656164<br />
push 49F604;KERNEL32<br />
call dword ptr [49F0B8];KERNEL32.GetModuleHandleA,获取KERNEL32.dll地址<br />
mov edi,eax<br />
push 4BE200<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4BE300],eax<br />
;写入“SuspendThread”<br />
mov [4BE200],70737553<br />
mov [4BE204],54646E65<br />
mov [4BE208],61657268<br />
mov [4BE20C],00000064<br />
push 4BE200<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4BE304],eax<br />
;写入“ResumeThread"<br />
mov [4BE200],75736552<br />
mov [4BE204],6854656D<br />
mov [4BE208],64616572<br />
mov [4BE20C],00000000<br />
push 4BE200<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4BE308],eax<br />
;写入“GetThreadContext”<br />
mov [4BE200],54746547<br />
mov [4BE204],61657268<br />
mov [4BE208],6E6F4364<br />
mov [4BE20C],74786574<br />
push 4BE200<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4BE310],eax<br />
;写入“SetThreadContext”<br />
mov [4BE200],54746553<br />
mov [4BE204],61657268<br />
mov [4BE208],6E6F4364<br />
mov [4BE20C],74786574<br />
push 4BE200<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4BE314],eax<br />
;写入“DuplicateHandle”<br />
mov [4BE200],6C707544<br />
mov [4BE204],74616369<br />
mov [4BE208],6E614865<br />
mov [4BE20C],00656C64<br />
push 4BE200<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4BE318],eax<br />
;调用GetCurrentThread,获取当前线程的句柄,保存到[4BE320]<br />
call dword ptr [4BE300]<br />
mov [4BE320],eax<br />
;调用GetCurrentProcess获取当前进程的伪句柄(49F0E8)<br />
call dowrd ptr [49F0E8]<br />
;调用DuplicateHandle获取当前进程的真实句柄,参数为CurrentProcess,CurrentThread,CurrentProcess,4BE320,00000000,01,00000002<br />
push 00000002<br />
push byte 01<br />
push 00000000<br />
push 4BE320<br />
push eax<br />
push [4BE320]<br />
push eax<br />
call dword ptr [4BE318]<br />
mov [4B42F0],FFFFFFFF<br />
;调用SuspendThread,暂停自己<br />
push [4BE320]<br />
call dword ptr [4BE304]<br />
popfd<br />
popad<br />
ret<br />
<br />
己方子线程:<br />
set_breakpoint:<br />
cmp [4B42F0],FFFFFFFF<br />
jne set_breakpoint_pre<br />
;调用GetThreadContext,获取对方子线程的Context,写入到4B4300<br />
push 4B4300<br />
push [4BE320]<br />
call dword ptr [4BE310]<br />
;修改Context,Dr0写入47F18A,Dr7写入401<br />
mov [4B4304],47F18A<br />
mov [4B4318],401<br />
;调用SetThreadContext,写入新的Context<br />
push 4B4300<br />
push [4BE320]<br />
call dword ptr [4BE314]<br />
;恢复标志位<br />
mov [4B42F0],01010101<br />
;调用ResumeThread,恢复对方子线程<br />
push [4BE320]<br />
call dowrd ptr [4BE308]<br />
<br />
<br />
Dr7为00000000000000000000010000000001,设置是:启用Dr0,局部;关闭保护;写入时触发;断点长度4字节。注意大小端的问题。<br />
00000000000000000000010000000100<br />
<br />
需要注意的点:<br />
线程退出时这些内存区域会变成不可读,如果判断的条件不对会造成报错,即使条件是对的,如果由于多线程问题也有可能出现报错。 利用VirtualQurey检查是否可读<br />
如果能够确定mugen对于各个文件的读取顺序,那么发现对应位置不再是“Statedef”时退出检测 x 对于多个st文件的人物会出现检测失败的情况。<br />
如果能够有判断st文件已经全部完成读取的方法,那么就可以实现稳定检测了 x 可能不需要了<br />
检查读取出的内存开头+4是否是“eate”这个方法是否可靠,会不会出现满足条件但是并不是在处理statdef状态号或者不满足条件但是是在处理statedef状态号的情况<br />
在触发断点之后会取消断点的有效位,所以要在异常处理函数中暂停对方子线程并通过一个内存中的标志通知自己的子线程重新写入标志位。 x 利用异常处理函数获取的线程上下文直接恢复断点并设置eip避开断点<br />
在应用层是不能直接操作Drx寄存器的值,但可以调用这两个api来读写线程的上下文,来达到设置硬件断点的目的,<br />
不要使用EXCEPTION_EXECUTE_HANDLER,返回的地址是不明确的<br />
把写入异常处理函数和对方子线程的工作放到statedef文件里进行,不需要给1p写额外的分支,对方选人进程suspend已经足够了,子线程的1p侧攻击也不需要改<br />
使用GetThreadContext需要先构造一个CONTEXT结构体并初始化其中的Context.ContextFlags,Context.ContextFlags设置为CONTEXT_FULL。具体方式在4B4300那里写入一个3F<br />
GetCurrentThread返回的线程永远指向当前线程<br />
<br />
异常处理函数的值必须是以下其一<br />
typedef enum _EXCEPTION_DISPOSITION {<br />
ExceptionContinueExecution, <br />
ExceptionContinueSearch,<br />
ExceptionNestedException,<br />
ExceptionCollidedUnwind<br />
} EXCEPTION_DISPOSITION;<br />
<br />
ExceptionContinueExecution 表示:已经处理了异常,回到异常触发点继续执行。<br />
ExceptionContinueSearch 表示:没有处理异常,继续遍历异常链表。<br />
ExceptionCollidedUnwind 表示在展开过程中再次触发异常。<br />
<br />
EXCEPTION_RECORD struct{ //共6个成员<br />
+0 DWORD ExceptionCode //异常代码,定义了产生异常的原因<br />
+4 DWORD ExceptionFlags //异常标志 ?<br />
+8 struct EXCEPTION_RECORD //指针,指向另一个EXCEPTION_RECORD结构<br />
+C DVOID ExceptionAddress //异常发生的地址<br />
+10 DWORD NumberParameters //与异常联系的参数个数(0~15)一般=0 ?<br />
+14 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS] //异常信息 ?<br />
}EXCEPTION_RECORD ends<br />
<br />
typedef struct _CONTEXT {<br />
<br />
/*000*/ DWORD ContextFlags;<br />
<br />
/*004*/ DWORD Dr0;<br />
/*008*/ DWORD Dr1;<br />
/*00C*/ DWORD Dr2;<br />
/*010*/ DWORD Dr3;<br />
/*014*/ DWORD Dr6;<br />
/*018*/ DWORD Dr7;<br />
<br />
/*01C*/ FLOATING_SAVE_AREA FloatSave;<br />
<br />
/*08C*/ DWORD SegGs;<br />
/*090*/ DWORD SegFs;<br />
/*094*/ DWORD SegEs;<br />
/*098*/ DWORD SegDs;<br />
<br />
/*09C*/ DWORD Edi;<br />
/*0A0*/ DWORD Esi;<br />
/*0A4*/ DWORD Ebx;<br />
/*0A8*/ DWORD Edx;<br />
/*0AC*/ DWORD Ecx;<br />
/*0B0*/ DWORD Eax;<br />
<br />
/*0B4*/ DWORD Ebp;<br />
/*0B8*/ DWORD Eip;<br />
/*0BC*/ DWORD SegCs;<br />
/*0C0*/ DWORD EFlags;<br />
/*0C4*/ DWORD Esp;<br />
/*0C8*/ DWORD SegSs;<br />
<br />
/*0CC*/ BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];<br />
<br />
/*2CC*/ } CONTEXT;<br />
<br />
<br />
EXCEPTION_DISPOSITION __cdecl _except_handler ( <br />
_In_ struct _EXCEPTION_RECORD *_ExceptionRecord, //异常记录结构指针 <br />
_In_ void * _EstablisherFrame, //指向EXCEPTION_REGISTRATION结构,即SEH链 <br />
_Inout_ struct _CONTEXT *_ContextRecord, //Context结构指针 (线程上下文) <br />
_Inout_ void * _DispatcherContext //无意义 (调度器上下文?) <br />
); <br />
<br />
# 对于state缺失型溢出的处理思考<br />
<br />
对于state缺失型溢出而言,上述处理方法依然能够检测出溢出,但是由于溢出的statedef无控制器不合法,不能完成读取。这时按照普通方法处理mugen会不停地读取这个statedef,溢出会多次执行,并且无法开局。<br />
目前的做法是检测到这种溢出直接关闭程序,不过也可做如下设想:在对方的statedef溢出后面加上一个null控制器,这样对方就有了一个控制器的_文本_,如果重新读取时能够读取到,那个就能解除无限读取并且开幕。<br />
根据新的拉莱耶文本,ebx是控制mugen是否重新加载statedef的控制器,修改它的值就可以阻止mugen重新读取statedef<br />
那么改为在读取statedef处设置硬件断点,检查读入的statedef号长度,超过56的部分去除,同时覆盖ebx阻止重新读取statedef,就可以拦截所有的s溢出<br />
<br />
x<br />
<br />
47EBF0处的esp指向返回地址,只要返回地址不是标准值就可以认为发生了S溢出<br />
<br />
;==========================<br />
<br />
%n与textbug研究<br />
<br />
思路:利用s溢出写入暂停代码和断点设置与SEH注入代码。之后通过主线程调用的代码来让主线程执行暂停。线程检测到主线程暂停之后设置断点与SEH函数,之后恢复主线程执行<br />
<br />
重点:<br />
1. 给出判断%n与textbug的方式<br />
2. 找出速度最快的主线程调用代码<br />
<br />
已知:<br />
1.4967DF是%n和%d的处理函数,ecx为写入的原始字符串(%n等没有替换为实际数值),,edx是最后完成替换的字符串,ebx是参数,%n位于496CB6处,ecx为写入的值<br />
2.4ABDC4处的字符串“trigger%i"可以修改并且可以调用%f,但是这个调用不是在主线程里进行的<br />
3.edx是“%n”出现的地方<br />
4.4969BA处下断点,[eax]是字符串长度,textbug的长度似乎是0x403<br />
5.%d的返回值是定值4713F3<br />
6.%i同样会出现textbug<br />
7.edx是字符串读写指针,指向当前要写入的字符位置。在[eax]达到0x403时,指向返回地址的第二个字节<br />
8.text的参数可以为空<br />
9.text会被缓存,第一次之后的写入都是读取缓存写入。缓存中“%n”的字符串如果改成“%d”,那么以后这个text所有的“%n”都会被%d取代。edi指向缓存当前正在读取的字符<br />
10.主线程被暂停后fs:[0]指向的SEH可能会被释放,需要找到入口地址是496150的seh节点并且覆盖<br />
11.由于硬件断点的限制,在4967DF下断点会导致4967DF出的push无法执行,这样会导致堆栈错误。必须自己完成断点语句的动作。4967EE处的xor esi,esi指令动作容易完成并且寄存器变动不大,可以在此处设置断点.4969BA的add esp,0C很容易模拟<br />
12.od在seh的检测上面效果很差,可以使用CE在异常处理处下断点来查看运行情况<br />
13.触发%n检测之后textbug会导致主程序十分卡顿<br />
<br />
<br />
研究:<br />
1.%n只需要检查字符串中是否有“%n”即可,textbug需要计算字符串长度,其中%xxxd的计算是一个问题<br />
2.既然极限卢使用修改按键处理的方法执行自己的代码并且能够在其他人物选择前执行指向改,那么也许这个方法速度是足够的<br />
3.改掉正常的mugen提示,强行加入%f<br />
4.使用GetWindowThreadProcessId获取窗口线程ID,如果是主线程创建窗口即可获得<br />
5.用CreateToolhelp32Snapshot获取所线程的快照<br />
通过GetWindowThreadProcessId找出mugen的pid。<br />
在进程里找出mugen之后,逐个获取线程id,用OpenThread打开获取句柄,通过GetThreadTimes检测线程的用户时间,用CompareFileTime比较,最长的就是主线程<br />
6.fs:[30]+3000处似乎是主线程的TEB,+24处是主线程id。该处内存可读,之后通过openthread打开即可获得句柄<br />
7.在4967DF处设置断点检查“%n”,在4969BA处下断点检查[eax]是否等于0x403<br />
8.cns指空对已经读取的控制器有何影响?对未读取的控制器有何影响?<br />
9.是否可以修改textbug的地址直接使textbug跳过汇编代码直接返回?<br />
10.是否可以修改edi和edx指向的两个字符串的头部分,将原本的代码改为textbug的返回代码?<br />
11.修改字符串时不能清除掉原有的%d之类字符,因为它们与dtc的params紧密相关,缺少一个都会导致栈异常<br />
<br />
<br />
结论:<br />
2. x 按键处理不在主线程执行<br />
4. x 主线程没有创建窗口<br />
5. x 谁会写谁写<br />
6.可行<br />
8.未知,但是使用cns指空之后%n检测触发后卡顿的问题得到了解决<br />
9.x<br />
10.可行<br />
11.不完全正确,%d可以没有参数,但是有些不行<br />
<br />
;==========================<br />
<br />
※汇编代码部分<br />
<br />
alloc(newmem,2048)<br />
label(palno_range)<br />
label(start)<br />
label(palno_detect)<br />
label(sff)<br />
label(attack_init)<br />
label(defense)<br />
label(p1_attack_init)<br />
label(p2_attack_init)<br />
label(p2_is_selected)<br />
label(attack)<br />
label(enemy_displayname)<br />
label(mugen_path)<br />
label(cmd_select)<br />
label(p2_cmd)<br />
label(attack_fin)<br />
<br />
label(p1)<br />
label(p3)<br />
label(p3_leitaizhan)<br />
label(p5)<br />
label(p7)<br />
label(p2)<br />
label(p4)<br />
label(p4_leitaizhan)<br />
label(p6)<br />
label(p8)<br />
<br />
label(set_breakpoint)<br />
label(p1_pre_in_round_fix)<br />
<br />
label(p1_defense)<br />
label(p1_in_round_init)<br />
label(p1_in_round_detecte)<br />
label(p1_in_round_fix)<br />
label(p1_player_button_off_fix)<br />
<br />
label(p2_defense)<br />
label(p2_pre_in_round_detecte)<br />
label(p2_pre_in_round_fix)<br />
label(p2_in_round_init)<br />
label(p2_in_round_detecte)<br />
label(p2_in_round_fix)<br />
label(p2_player_button_off_fix)<br />
<br />
label(exit)<br />
label(next_round_dectet)<br />
<br />
<br />
<br />
4BE010:<br />
start:<br />
pushad<br />
pushfd<br />
mov esi,[4B41A0]<br />
mov edi,[4B41A4]<br />
mov [4B4194],454C10<br />
mov eax,[4B6178]<br />
mov [4B40A0],eax<br />
;这段是傻瓜包的一部分<br />
;根据之前获取的栈地址去判断p侧<br />
palno_detect:<br />
cmp [esi-000047A4],edi<br />
je p1<br />
cmp [esi-00004790],edi<br />
je p3<br />
cmp [esi-00004748],edi<br />
je p3_leitaizhan<br />
cmp [esi-000046EC],edi<br />
je p5<br />
cmp [esi-00004690],edi<br />
je p7<br />
cmp [esi-00002D08],edi<br />
je p2<br />
cmp [esi-00002CF4],edi<br />
je p4<br />
cmp [esi-00002CAC],edi<br />
je p4_leitaizhan<br />
cmp [esi-00002C50],edi<br />
je p6<br />
cmp [esi-00002BF4],edi<br />
je p8<br />
jmp palno_detect<br />
p1:<br />
mov eax,[esi-000047A0]<br />
mov [4B42FF],FFFFFFFF<br />
jmp palno_range<br />
p3:<br />
mov eax,[esi-0000478C]<br />
mov [4B42FF],FFFFFFFF<br />
jmp palno_range<br />
p3_leitaizhan:<br />
mov eax,[esi-00004744]<br />
mov [4B42FF],FFFFFFFF<br />
jmp palno_range<br />
p5:<br />
mov eax,[esi-000046E8]<br />
mov [4B42FF],FFFFFFFF<br />
jmp palno_range<br />
p7:<br />
mov eax,[esi-0000468C]<br />
mov [4B42FF],FFFFFFFF<br />
jmp palno_range<br />
p2:<br />
mov eax,[esi-00002D04]<br />
mov [4B42FF],11111111<br />
jmp palno_range<br />
p4:<br />
mov eax,[esi-00002CF0]<br />
mov [4B42FF],11111111<br />
jmp palno_range<br />
;某个特殊模式的player4<br />
p4_leitaizhan:<br />
mov eax,[esi-00002CA8]<br />
mov [4B42FF],11111111<br />
jmp palno_range<br />
p6:<br />
mov eax,[esi-00002C4C]<br />
mov [4B42FF],11111111<br />
jmp palno_range<br />
p8:<br />
mov eax,[esi-00002BF0]<br />
mov [4B42FF],11111111<br />
jmp palno_range<br />
;判断p数,选择头像<br />
palno_range:<br />
cmp eax,01<br />
ja palno_detect<br />
cmp eax,00<br />
jb palno_detect<br />
mov [4B4270],eax<br />
mov ebp,eax<br />
mov ebx,eax<br />
cmp [ebp*4+4B41E0],00000000<br />
jne sff<br />
mov edx,[4B42A0]<br />
add ebx,66732E40<br />
mov [4B42D6],ebx<br />
push 4BDFF0<br />
push edx<br />
call [4B4194]<br />
add esp,08<br />
mov [ebp*4+4B41E0],eax<br />
;换头像<br />
sff:<br />
mov ecx,[4B41AF]<br />
mov edx,[ebp*4+4B41E0]<br />
mov [ecx],edx<br />
;判断之前保存下来的自己的p数<br />
mov eax,[4B4270]<br />
;1p,进入攻击模块<br />
cmp eax,00<br />
je attack_init<br />
;否则进入防御模块<br />
jmp defense<br />
attack_init:<br />
;攻击用的cmd命令<br />
mov [4B4000],72616863<br />
mov [4B4004],616E5C73<br />
mov [4B4008],6179616E<br />
mov [4B400C],6968735F<br />
mov [4B4010],695C696B<br />
mov [4B4014],78742E31<br />
mov [4B4018],00000074<br />
mov [4B401C],72616863<br />
mov [4B4020],616E5C73<br />
mov [4B4024],6179616E<br />
mov [4B4028],6968735F<br />
mov [4B402C],695C696B<br />
mov [4B4030],78742E32<br />
mov [4B4034],00000074<br />
mov [4B4038],72616863<br />
mov [4B403C],616E5C73<br />
mov [4B4040],6179616E<br />
mov [4B4044],6968735F<br />
mov [4B4048],695C696B<br />
mov [4B404C],65642E33<br />
mov [4B4050],00000066<br />
mov [4B4054],61657243<br />
mov [4B4058],69466574<br />
mov [4B405C],41656C<br />
mov [4B4060],64616552<br />
mov [4B4064],656C6946<br />
mov [4B4068],00000000<br />
mov [4B406C],74697257<br />
mov [4B4070],6C694665<br />
mov [4B4074],00000065<br />
mov [4B4090],736F6C43<br />
mov [4B4094],6E614865<br />
mov [4B4098],00656C64<br />
mov [4B40F0],456E6957<br />
mov [4B40F4],00636578<br />
;获取CreateFile,ReadFile,WriteFile和CloseHandle的地址<br />
push 49F604<br />
call dword ptr [49F0B8]<br />
mov edi,eax<br />
push 4B4054<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4B4100],eax<br />
push 4B4060<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4B4104],eax<br />
push 4B406C<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4B4108],eax<br />
push 4B4090<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4B411C],eax<br />
push 4B40F0<br />
push edi<br />
call dword ptr [49F130]<br />
mov [4B41F0],eax<br />
mov ebp,[4B5B4C]<br />
;判断之前保存的p侧数据<br />
;1p侧<br />
cmp [4B42FF],FFFFFFFF<br />
je p1_attack_init<br />
;2p侧<br />
cmp [4B42FF],11111111<br />
je p2_attack_init<br />
jmp start<br />
p1_attack_init:<br />
;判断p2是否已选<br />
p2_is_selected:<br />
mov eax,[ebp+00000FCC]<br />
;没有选择,在这里等待<br />
cmp eax,-01<br />
;已经选择<br />
je p2_is_selected<br />
;求出p2的displayname基地址<br />
mov eax,[ebp+00000F80]<br />
mov ebx,[ebp+00000FCC]<br />
imul eax,ebx<br />
add eax,[ebp+00000FEC]<br />
jmp attack<br />
p2_attack_init:<br />
mov eax,[ebp+00000F80]<br />
mov ebx,[ebp+00000FBC]<br />
imul eax,ebx<br />
add eax,[ebp+00000FDC]<br />
attack:<br />
mov edx,438<br />
imul eax,edx<br />
mov ecx,[4B54C8]<br />
add ecx,04<br />
add ecx,eax<br />
mov [4B4400],ecx<br />
xor ebx,ebx<br />
;获取敌人的displayname并写入到重启用的def文件中<br />
enemy_displayname:<br />
inc ebx<br />
cmp [ecx+ebx],00000000<br />
mov eax,[ecx+ebx-1]<br />
mov [ebx+4B301D],eax<br />
jne enemy_displayname<br />
mov [4B4405],ebx<br />
push 00<br />
push 00000080<br />
push 03<br />
push 00<br />
push 00<br />
push 80000000<br />
push 4B4000<br />
call dword ptr [4B4100]<br />
mov [4B4120],eax<br />
push 00<br />
push 4B4406<br />
push 1E<br />
push 4B3000<br />
push [4B4120]<br />
call dword ptr [4B4104]<br />
push [4B4120]<br />
call dword ptr [4B411C]<br />
mov [ebx+4B301E],00000022<br />
mov [ebx+4B301F],0000000D<br />
mov [ebx+4B3020],0000000A<br />
push 00<br />
push 00000080<br />
push 03<br />
push 00<br />
push 00<br />
push 80000000<br />
push 4B401C<br />
call dword ptr [4B4100]<br />
mov [4B4124],eax<br />
mov eax,4B3021<br />
add eax,ebx<br />
push 00<br />
push 4B4406<br />
push 000003C6<br />
push eax<br />
push [4B4124]<br />
call dword ptr [4B4104]<br />
push [4B4124]<br />
call dword ptr [4B411C]<br />
push 00<br />
push 00000080<br />
push 02<br />
push 00<br />
push 00<br />
push 40000000<br />
push 4B4038<br />
call dword ptr [4B4100]<br />
mov [4B4128],eax<br />
mov eax,000003E6<br />
add eax,ebx<br />
push 00<br />
push 4B4406<br />
push eax<br />
push 4B3000<br />
push [4B4128]<br />
call dword ptr [4B4108]<br />
push [4B4128]<br />
call dword ptr [4B411C]<br />
call dword ptr [49F0B0]<br />
mov [4B412C],eax<br />
mov [4B4200],20646D63<br />
mov [4B4204],5420632F<br />
mov [4B4208],4B4B5341<br />
mov [4B420C],204C4C49<br />
mov [4B4210],2F20462F<br />
mov [4B4214],22204946<br />
mov [4B4218],444E4957<br />
mov [4B421C],4954574F<br />
mov [4B4220],20454C54<br />
mov [4B4224],4D207165<br />
mov [4B4228],472E552E<br />
mov [4B422C],4E2E452E<br />
mov [4B4230],22262622<br />
xor ebx,ebx<br />
;获取mugen主程序的绝对路径<br />
mugen_path:<br />
inc ebx<br />
mov dl,[eax+ebx]<br />
cmp dl,22<br />
je cmd_select<br />
mov [ebx+4B4233],dl<br />
jmp mugen_path<br />
;写入后续重启cmd命令<br />
cmp [4B42FF],FFFFFFFF<br />
jne p2_cmd<br />
mov eax,4B4233<br />
mov [eax+ebx],20202022<br />
mov [eax+ebx+04],2031702D<br />
mov [eax+ebx+08],616E616E<br />
mov [eax+ebx+0C],735F6179<br />
mov [eax+ebx+10],696B6968<br />
mov [eax+ebx+14],6F79725C<br />
mov [eax+ebx+18],5F696775<br />
mov [eax+ebx+1C],6B696873<br />
mov [eax+ebx+20],65642E69<br />
mov [eax+ebx+24],702D2066<br />
mov [eax+ebx+28],616E2032<br />
mov [eax+ebx+2C],6179616E<br />
mov [eax+ebx+30],6968735F<br />
mov [eax+ebx+34],695C696B<br />
mov [eax+ebx+38],65642E33<br />
mov [eax+ebx+3C],722D2066<br />
mov [eax+ebx+40],646E756F<br />
mov [eax+ebx+44],26322073<br />
mov [eax+ebx+48],6C656426<br />
mov [eax+ebx+4C],61686320<br />
mov [eax+ebx+50],6E5C7372<br />
mov [eax+ebx+54],79616E61<br />
mov [eax+ebx+58],68735F61<br />
mov [eax+ebx+5C],5C696B69<br />
mov [eax+ebx+60],642E3369<br />
mov [eax+ebx+64],00006665<br />
jmp attack_fin<br />
p2_cmd:<br />
mov eax,4B4233<br />
mov [eax+ebx],20202022<br />
mov [eax+ebx+04],2031702D<br />
mov [eax+ebx+08],616E616E<br />
mov [eax+ebx+0C],735F6179<br />
mov [eax+ebx+10],696B6968<br />
mov [eax+ebx+14],2E33695C<br />
mov [eax+ebx+18],20666564<br />
mov [eax+ebx+1C],2032702D<br />
mov [eax+ebx+20],616E616E<br />
mov [eax+ebx+24],735F6179<br />
mov [eax+ebx+28],696B6968<br />
mov [eax+ebx+2C],6F79725C<br />
mov [eax+ebx+30],5F696775<br />
mov [eax+ebx+34],6B696873<br />
mov [eax+ebx+38],65642E69<br />
mov [eax+ebx+3C],722D2066<br />
mov [eax+ebx+40],646E756F<br />
mov [eax+ebx+44],26322073<br />
mov [eax+ebx+48],6C656426<br />
mov [eax+ebx+4C],61686320<br />
mov [eax+ebx+50],6E5C7372<br />
mov [eax+ebx+54],79616E61<br />
mov [eax+ebx+58],68735F61<br />
mov [eax+ebx+5C],5C696B69<br />
mov [eax+ebx+60],642E3369<br />
mov [eax+ebx+64],00006665<br />
attack_fin:<br />
push 00<br />
push 4B4200<br />
call dword ptr [4B41F0]<br />
;防御模块<br />
defense:<br />
mov ebp,[4B5B4C]<br />
cmp [ebp+0000FEC],FFFFFFFF<br />
je defense<br />
cmp [4B42FF],FFFFFFFF<br />
je p1_defense<br />
cmp [4B42FF],11111111<br />
je p2_defense<br />
jmp defense<br />
p1_defense:<br />
mov ecx,[4B41A4]<br />
inc ecx<br />
mov ebx,[ebp+CD0]<br />
sub ebx,A1E<br />
mov edx,E30<br />
imul ecx,edx<br />
add ecx,ebx<br />
mov [4B4400],ecx<br />
<br />
mov edx,313E313E<br />
add edx,30303030<br />
cmp [ecx],edx<br />
jne p1_pre_in_round_fix<br />
mov edx,432F3149<br />
add edx,30303030<br />
cmp [ecx+04],edx<br />
jne p1_pre_in_round_fix<br />
mov edx,393B3938<br />
add edx,30303030<br />
cmp [ecx+08],edx<br />
jne p1_pre_in_round_fix<br />
mov edx,3030305F<br />
sub edx,30303030<br />
cmp [ecx+0C],edx<br />
jne p1_pre_in_round_fix<br />
mov edx,313E313E<br />
add edx,30303030<br />
cmp [ecx-206],edx<br />
jne p1_pre_in_round_fix<br />
mov edx,432F3149<br />
add edx,30303030<br />
cmp [ecx-202],edx<br />
jne p1_pre_in_round_fix<br />
mov edx,393B3938<br />
add edx,30303030<br />
cmp [ecx-1FE],edx<br />
jne p1_pre_in_round_fix<br />
mov edx,363533FE<br />
add edx,30303030<br />
cmp [ecx-1FA],edx<br />
jne p1_pre_in_round_fix<br />
set_breakpoint:<br />
cmp [4B42F0],FFFFFFFF<br />
jne set_breakpoint<br />
mov [4B4300],3F<br />
push 4B4300<br />
push [4BE320]<br />
call dword ptr [4BE310]<br />
mov [4B4304],47F18A<br />
mov [4B4308],47ECF1<br />
mov [4B430C],47F23F<br />
mov [4B4318],415<br />
push 4B4300<br />
push [4BE320]<br />
call dword ptr [4BE314]<br />
mov [4B42F0],01010101<br />
push [4BE320]<br />
call dword ptr [4BE308]<br />
jmp p1_in_round_init<br />
p1_pre_in_round_fix:<br />
mov [4B42F0],1<br />
p1_in_round_init:<br />
cmp dword ptr [ebp+0000B758],00<br />
je p1_in_round_init<br />
mov [4B2188],49221E<br />
mov eax,[4B5B4C]<br />
mov ebp,eax<br />
add ebp,0000B754<br />
mov ebp,[ebp]<br />
mov edi,eax<br />
add edi,0000B758<br />
mov edi,[edi]<br />
mov edx,[ebp+00000BE8]<br />
mov esi,[edx]<br />
mov [4B4200],esi<br />
p1_in_round_detecte:<br />
mov ecx,[eax+B654]<br />
add ecx,30<br />
mov esi,[edx]<br />
cmp [4B4200],esi<br />
jne p1_in_round_fix<br />
cmp [4B69B8],01<br />
je p1_in_round_fix<br />
cmp [4B6A38],01<br />
je p1_in_round_fix<br />
cmp [ebp+00000158],00<br />
je p1_in_round_fix<br />
cmp dword ptr [edi+00002620],00<br />
jne p1_in_round_fix<br />
cmp [4B48E8],496651<br />
jne p1_in_round_fix<br />
cmp dword ptr [4B42F0],00<br />
jne p1_in_round_fix<br />
mov ebx,313E313E<br />
add ebx,30303030<br />
cmp [ecx],ebx<br />
jne p1_in_round_fix<br />
mov ebx,432F3149<br />
add ebx,30303030<br />
cmp [ecx+4],ebx<br />
jne p1_in_round_fix<br />
mov ebx,393B3938<br />
add ebx,30303030<br />
cmp [ecx+8],ebx<br />
jne p1_in_round_fix<br />
cmp [4B5960],429CB0<br />
jne p1_in_round_fix<br />
cmp [4B48E8],496651<br />
jne p1_in_round_fix<br />
cmp [4B48EC],4962FB<br />
jne p1_in_round_fix<br />
cmp [4B48F0],496361<br />
jne p1_in_round_fix<br />
cmp [4B48F4],4962A1<br />
jne p1_in_round_fix<br />
mov ebx,[4B6178]<br />
cmp [4B40A0],ebx<br />
jne p1_in_round_fix<br />
cmp dword ptr [ebp],00<br />
je exit<br />
jmp p1_in_round_detecte<br />
<br />
p1_in_round_fix:<br />
mov esi,[4B4200]<br />
mov [edx],esi<br />
mov [ebp+00000E24],00000001<br />
mov esi,[edi+00000BE8]<br />
mov [esi],4B4290<br />
mov [edi+00000E24],00000000<br />
mov [4B48E8],496651<br />
mov ebx,313E313E<br />
add ebx,30303030<br />
mov [ecx],ebx<br />
mov ebx,432F3149<br />
add ebx,30303030<br />
mov [ecx+4],ebx<br />
mov ebx,393B3938<br />
add ebx,30303030<br />
mov [ecx+8],ebx<br />
mov ebx,[4B40A0]<br />
mov [4B6178],ebx<br />
<br />
cmp dword ptr [ebp],00<br />
je exit<br />
<br />
cmp [ebp+158],01<br />
je p1_in_round_fix<br />
cmp [4B69B8],1<br />
je p1_player_button_off_fix<br />
cmp [4B6A38],1<br />
je p1_player_button_off_fix<br />
mov [ebp+158],01<br />
jmp p1_in_round_fix<br />
<br />
p1_player_button_off_fix:<br />
mov [4B5948],0<br />
mov [4B594C],1<br />
mov [4B699D],1<br />
mov [4B69B8],1<br />
mov [4B5548],2<br />
<br />
jmp p1_in_round_fix<br />
p2_defense:<br />
mov ecx,[4B41A4]<br />
inc ecx<br />
mov ebx,[ebp+CD0]<br />
sub ebx,A1E<br />
mov edx,E30<br />
imul ecx,edx<br />
add ecx,ebx<br />
mov [4B4400],ecx<br />
p2_pre_in_round_detecte:<br />
mov edx,313E313E<br />
add edx,30303030<br />
cmp [ecx],edx<br />
jne p2_pre_in_round_fix<br />
mov edx,432F3149<br />
add edx,30303030<br />
cmp [ecx+04],edx<br />
jne p2_pre_in_round_fix<br />
mov edx,393B3938<br />
add edx,30303030<br />
cmp [ecx+08],edx<br />
jne p2_pre_in_round_fix<br />
mov edx,3030305F<br />
sub edx,30303030<br />
cmp [ecx+0C],edx<br />
jne p2_pre_in_round_fix<br />
mov edx,313E313E<br />
add edx,30303030<br />
cmp [ecx-206],edx<br />
jne p2_pre_in_round_fix<br />
mov edx,432F3149<br />
add edx,30303030<br />
cmp [ecx-202],edx<br />
jne p2_pre_in_round_fix<br />
mov edx,393B3938<br />
add edx,30303030<br />
cmp [ecx-1FE],edx<br />
jne p2_pre_in_round_fix<br />
mov edx,363533FE<br />
add edx,30303030<br />
cmp [ecx-1FA],edx<br />
jne p2_pre_in_round_fix<br />
cmp [4B5960],429CB0<br />
jne p2_pre_in_round_fix<br />
cmp [4B48E8],496651<br />
jne p2_pre_in_round_fix<br />
cmp [4B48EC],4962FB<br />
jne p2_pre_in_round_fix<br />
cmp [4B48F0],496361<br />
jne p2_pre_in_round_fix<br />
cmp [4B48F4],4962A1<br />
jne p2_pre_in_round_fix<br />
<br />
cmp dword ptr [ebp+0000B758],00<br />
jne p2_in_round_init<br />
jmp p2_pre_in_round_detecte<br />
<br />
p2_pre_in_round_fix:<br />
mov [4B42F0],01<br />
<br />
mov [4B5960],429CB0<br />
mov [4B48E8],496651<br />
mov [4B48EC],4962FB<br />
mov [4B48F0],496361<br />
mov [4B48F4],4962A1<br />
mov edx,[4B4130]<br />
mov [4B6178],edx<br />
<br />
p2_in_round_init:<br />
mov eax,[4B5B4C]<br />
mov ebp,eax<br />
add ebp,0000B758<br />
mov ebp,[ebp]<br />
<br />
test ebp,ebp<br />
jz p2_in_round_init<br />
<br />
mov edi,eax<br />
add edi,0000B754<br />
mov edi,[edi]<br />
mov edx,[ebp+00000BE8]<br />
mov esi,[edx]<br />
mov [4B4200],esi<br />
p2_in_round_detecte:<br />
mov ecx,[eax+B658]<br />
add ecx,30<br />
mov esi,[edx]<br />
cmp [4B4200],esi<br />
jne p2_in_round_fix<br />
cmp [4B69B8],01<br />
je p2_in_round_fix<br />
cmp [4B6A38],01<br />
je p2_in_round_fix<br />
cmp dword ptr [edi+00002620],00<br />
jne p2_in_round_fix<br />
cmp [4B48E8],496651<br />
jne p2_in_round_fix<br />
cmp dword ptr [4B42F0],00<br />
jne p2_in_round_fix<br />
mov ebx,313E313E<br />
add ebx,30303030<br />
cmp [ecx],ebx<br />
jne p2_in_round_fix<br />
mov ebx,432F3149<br />
add ebx,30303030<br />
cmp [ecx+4],ebx<br />
jne p2_in_round_fix<br />
mov ebx,393B3938<br />
add ebx,30303030<br />
cmp [ecx+8],ebx<br />
jne p2_in_round_fix<br />
cmp [4B5960],429CB0<br />
jne p2_in_round_fix<br />
cmp [4B48E8],496651<br />
jne p2_in_round_fix<br />
cmp [4B48EC],4962FB<br />
jne p2_in_round_fix<br />
cmp [4B48F0],496361<br />
jne p2_in_round_fix<br />
cmp [4B48F4],4962A1<br />
jne p2_in_round_fix<br />
mov ebx,[4B6178]<br />
cmp [4B40A0],ebx<br />
jne p2_in_round_fix<br />
cmp dword ptr [edi],00<br />
je exit<br />
cmp dword ptr [ebp+0000BC30],01<br />
jne p2_in_round_detecte<br />
jmp p2_in_round_detecte<br />
p2_in_round_fix:<br />
mov esi,[4B4200]<br />
mov [edx],esi<br />
mov [ebp+00000E24],00000001<br />
mov esi,[edi+00000BE8]<br />
mov [esi],4B4290<br />
mov [edi+00000E24],00000000<br />
mov [4B48E8],496651<br />
mov ebx,313E313E<br />
add ebx,30303030<br />
mov [ecx],ebx<br />
mov ebx,432F3149<br />
add ebx,30303030<br />
mov [ecx+4],ebx<br />
mov ebx,393B3938<br />
add ebx,30303030<br />
mov [ecx+8],ebx<br />
mov ebx,[4B40A0]<br />
mov [4B6178],ebx<br />
cmp dword ptr [edi],00<br />
je exit<br />
cmp [4B69B8],1<br />
je p2_player_button_off_fix<br />
cmp [4B6A38],1<br />
je p2_player_button_off_fix<br />
jmp p2_in_round_fix<br />
p2_player_button_off_fix:<br />
mov [4B5948],0<br />
mov [4B594C],1<br />
mov [4B699D],1<br />
mov [4B69B8],1<br />
mov [4B5548],3<br />
jmp p2_in_round_fix<br />
exit:<br />
mov eax,[4B5B4C]<br />
add eax,FBC<br />
mov [eax],FFFFFFFF<br />
next_round_dectet:<br />
cmp [eax],FFFFFFFF<br />
je next_round_dectet<br />
mov [eax+10],FFFFFFFF<br />
popfd<br />
popad<br />
jmp esiAnonymoushttp://www.blogger.com/profile/17179538242497895176noreply@blogger.com0