mugen日記

ステ移動せずにステ実行

CATEGORYmugen記述
COMMENT0
常時監視の実行してる箇所見つけたわ
ここパクれば行けるね
004414EE:PUSH 3
004414F0:PUSH -3
004414F2:PUSH ESI
004414F3:CALL 0047F7D0
004414F8:PUSH 7
004414FA:PUSH -2
004414FC:PUSH ESI
004414FD:CALL 0047F7D0
00441502:ADD ESP,18
00441505:CMP DWORD PTR DS:[ESI+23C],EBX
0044150B:JNE SHORT 0044151A
0044150D:PUSH 3
0044150F:PUSH -1
00441511:PUSH ESI
00441512:CALL 0047F7D0
00441517:ADD ESP,0C


抜粋するとこんな感じ?
arg3の数値はイマイチわからんけど
push 7
push 読み込みたいstateno
push 自己アド
call 47f7d0
add esp,c


ただこれだと実行先のステートで更にステ移動してると実行してくれないんじゃないかな
そこまで試してないから知らんが
ここの直下で個別ステ実行してるからそっちをパクった方がいいかもね

<追記>
多分引数3はこれでいいはず
arg3&1:ステート読込先判定(0:現在読込中のステート,1:自分自身のステート)
arg3&2:自分のステート読込中に実行するか(0:しない,1:する)
arg3&4:ステート奪われている最中に実行するか(0:しない,1:する)


<追記2>
0x47f7d0の戻り値はeaxで、ステ移動してるなら1、してないなら0が入ってる?
test eax,eaxとかでループすればよさそうかな

trans、palfxアドレス

CATEGORYmugen記述
COMMENT0
explodでsubalphaできないかなと調査してた
ひとまず本体のアドレスは特定したからメモ
まあ本体でやるならステコンで普通にsubalphaできるから捏造使う意味ないけどね

trans
[自己アド+0x1388]:透過種類
[自己アド+0x138c]:明度
[自己アド+0x1390]:透過度
0x1388=-1 :default
0x1388=0 :none
0x1388=1 :add
0x1388=2 :sub
0x1388=3 :add1,addalpha

palfx
[自己アド+0x25dc+0x0]:不明(実行フラグ?0以下で有効、1以上で無効)
[自己アド+0x25dc+0x4]:time
[自己アド+0x25dc+0x8]:color
[自己アド+0x25dc+0xc]:add(R)
[自己アド+0x25dc+0x10]:add(G)
[自己アド+0x25dc+0x14]:add(B)
[自己アド+0x25dc+0x18]:mul(R)
[自己アド+0x25dc+0x1c]:mul(G)
[自己アド+0x25dc+0x20]:mul(B)
[自己アド+0x25dc+0x24]:sinadd(R)
[自己アド+0x25dc+0x28]:sinadd(G)
[自己アド+0x25dc+0x2c]:sinadd(B)
[自己アド+0x25dc+0x30]:invertall
[自己アド+0x25dc+0x34]:不明(0が入ってた)

var系ステコンめも

CATEGORYmugen記述
COMMENT0
去年ぐらいに軽く調べてたけど放置してたのを思い出したからメモっとく
動作まで確認してないから間違ってる可能性あり
randomとparent系は気が向いたら調べる…多分

続 ExplodのRemapPal再現

CATEGORYmugen記述
COMMENT0
前ちょこっと書いて自信なかったから即消したけど多分大丈夫だろうと思うので正式に記事にしとく

めも

CATEGORYmugen記述
COMMENT0
スプライトバグを修正できないかなーと調べてたら任意のプレイヤーとパレ共有できたのでメモ
根本的解決にはならんけどね…

trigger1=1||var(0):=自己アドレス
trigger1=1||var(1):=共有先プレイヤーのアドレス
trigger1=1||var(var(0)+5036):=var(var(1)+5040)
trigger1=1||var(var(0)+5044):=var(var(1)+5044)
trigger1=1||var(var(var(0)+5052)):=var(var(var(1))+972)
trigger1=1||var(var(var(0)+5052)+4):=var(var(1)+5040)
trigger1=1||var(var(var(0)+540)+4):=var(var(var(1))+972)
trigger1=1||var(var(var(0)+540)+8):=var(var(1)+5044)


自分自身、共有先プレイヤーの両方がownpal=1の場合のみ動く
まだ調査不足だけど飽きたので放置

カラパ変更

CATEGORYmugen記述
COMMENT0
そういえば記事にまとめてなかった

http://sinomugen.blog.fc2.com/blog-entry-196.html
こんな面倒なことせんでもいいね
新mugenを見習ってSFFに登録しておいた画像のパレットアドレスに置き換える方が楽

trigger1=var(var(4939696)+76):=gametime&&0||1
trigger1=var(0):=var(var(var(自己アドレス+5040)+8)+20)+8&&0||1
trigger1=var(2):=var(var(0)+604*4)&&0||1
trigger1=var(var(0)+604*0):=var(2)&&0||1
trigger1=var(var(0)+604*2):=var(2)&&0||1

小悪魔に乗せてるけどこんな感じ
「var(0)+604*###」って奴がSFFに登録済み画像のパレットアドレス
SFFの先頭から5番目のパレットのアドレスを取得して、1番目と3番目のパレットを置き換えてる
3番目も置き換える理由はSFFの登録順が9000,0→9000,1→0,0になってて、9000,1を独自パレットにしてるから(?)
よくわからんからアレだけど、小ポトレと本体ドットをパレット共有してても内部的には別のパレット扱いされてるんかね

<追記>
http://mugen744.blog.fc2.com/blog-entry-116.html
JQKJ氏が詳しく調べたようです

DBOA無効化

CATEGORYmugen記述
COMMENT0
上手いこと既存コード弄ってやれば可能ですねこれ
まだ調査中だけどひとまず無効化できることを確認した
どんなコードに書き換えようかねー

<追記>
0x47ec1c:lea edi,[ebx+1]
0x47ec1f:or ecx,ffffffff
0x47ec22:xor eax,eax
0x47ec24:repne scas byte ptr es:[edi]

あんま自信ないけど多分この辺かもね
もうちょい調べてからまとめるつもりだったけどモチベが虚無と化した

<追記2>
ここのコードで確定でした
[edi+9]からdef番号が入ってるっぽい
def番号に11桁以上記載されてたら「5d 00 00 00 ~」みたいな感じでオーバーフローが発生しないよう書き換えてやれば無効化可能
まあ他にも方法はあるだろうけど

キャラのパス

CATEGORYmugen記述
COMMENT0
[[0x4B5B4C]+0xCD0]+0x40C+0xE30*0~0xE30*3
これ、キャラのパスがあるって言ったんだけど同キャラが居るとズレるっぽいんだよね
同キャラが居る = キャラファイルの読み込む種類が減る ってことなんだろうけど

具体的に言うと
1p:Nothingness
2p:Nothingness
3p:kfm

と指定した時は
[[0x4B5B4C]+0xCD0]+0x40C+0xE30*0:Nothingnessのパス
[[0x4B5B4C]+0xCD0]+0x40C+0xE30*1:kfmのパス
[[0x4B5B4C]+0xCD0]+0x40C+0xE30*2:何もなし

になるっぽい
この辺のズレを考慮しないとダメなんで面倒だわ
別の場所見つけた方がいいのかもね…

続 カラパ変更

CATEGORYmugen記述
COMMENT0
https://dl.dropboxusercontent.com/s/9liw3t264cx6g3u/changeAct.7z
雑だけどコード組んだ
同キャラ対策してないからアレだけど一応動くはず
とりあえずDLL未使用でファイル入出力できるようになったので満足

多分うまいことやればRemapPal再現できるんだろうけどねぇ…
sffの登録順によって変にズレるっぽいからイマイチな感じ
調査するのも面倒だから別にいいや

カラパ変更

CATEGORYmugen記述
COMMENT2
http://samsara01.blog.fc2.com/blog-entry-22158.html
そういやそんなのもあったなーと思いつつ手元で適当に弄ってみたけど結構面倒だね…
さすがに1パレットずつ手動で書き込むのは面倒にも程があるので改善案

https://msdn.microsoft.com/ja-jp/library/cc429198.aspx
https://msdn.microsoft.com/ja-jp/library/cc429679.aspx
https://msdn.microsoft.com/ja-jp/library/cc429605.aspx
この辺の関数をVirtualProtectと同じ方法で呼んでやればactファイル読み込めるんじゃないかな?
読み込んだactファイルの中身を適当に[[[[自己アドレス+0x13B0]+0x8]+0x14]+0x8]+0~256*4にコピーすれば楽できそう

続 triggerで直死

CATEGORYmugen記述
COMMENT0
http://samsara01.blog.fc2.com/blog-entry-22004.html
大体言いたいことはオキ氏が言ってるけど、私の方でも説明しとくとvar(60)やfvar(40)の発展型ですね
アレって()内で指定した数値をチェックする処理が間違ってるのが原因なんですけど、そもそもチェック処理自体を消せばvar(100)やらvar(-100)やらを指定できるようになる

なので
[state ]
type=null
trigger1=var(-7):=0
とすると自分のaliveに0が書き込まれる

欠点としては、自分のvar(0)を基準にしか見れないことだけど、上手く引数に渡す値を調整してやれば一応任意のアドレスも見れる
もっと言うと0x407E8Eをmov [ebx],ediに置き換えれば引数に渡した値をそのままアドレスと見なせる
そこまでやると普通の用途には使いづらいけどね

続きで実現方法について雑に解説

<追記>
任意アドレス見るならdrab氏が言ってる奴の方がいいかと
http://drabs.blog40.fc2.com/blog-entry-1670.html

triggerで直死

CATEGORYmugen記述
COMMENT0
http://drabs.blog40.fc2.com/blog-entry-1667.html
http://melon-eat-pierrot.seesaa.net/article/460033522.html
そういや可能ですねこれ

http://drabs.blog40.fc2.com/blog-entry-1456.html
で、前デバッガでこの辺りのコード書き換えて遊んでたのを思い出した

20180617013646.png
ってことでtriggerで直死ができました
もう全部これでいいや


<追記>
var:=
0x407E81:TEST EBX,EBX
0x407E83:JL SHORT 00407EA0
0x407E85:CMP EBX,3C
0x407E88:JG SHORT 00407EA0
0x407E8A:MOV EDX,DWORD PTR SS:[ESP+4C]
0x407E8E:MOV DWORD PTR DS:[EBX*4+EDX+0E40],EDI

favr:=
0x407F86:EST EBX,EBX
0x407F88:JL SHORT 00407FA9
0x407F8A:CMP EBX,28
0x407F8D:JG SHORT 00407FA9
0x407F8F:FLD DWORD PTR SS:[ESP+10]
0x407F93:MOV EAX,DWORD PTR SS:[ESP+4C]
0x407F97:FSTP DWORD PTR DS:[EBX*4+EAX+0F30]

var
0x47B7DF:TEST EAX,EAX
0x47B7E1:JL SHORT 0047B7F8
0x47B7E3:CMP EAX,3B
0x47B7E6:JG SHORT 0047B7F8
0x47B7E8:MOV EDX,DWORD PTR DS:[EAX*4+ESI+0E40]

fvar
0x47B842:TEST EDX,EDX
0x47B844:JL SHORT 0047B85B
0x47B846:CMP EDX,27
0x47B849:JG SHORT 0047B85B
0x47B84B:FLD DWORD PTR DS:[EDX*4+ESI+0F30]

ここ弄っとけば単純な参照、代入は変数で可能

<追記2>
fvar:=で少数を代入しようとすると何故か()内で指定した値がズレる
0x407f7bの「call 004922ac」で呼んでる処理が原因?

<追記3>
http://drabs.blog40.fc2.com/blog-entry-1685.html
とのこと
[esp+24]に()内で指定した値が入ってたから「mov ebx,[esp+24]」とかやっておけば多分問題ないと思われる

DBOAメモ

CATEGORYmugen記述
COMMENT3
いい加減覚えるかーってことで改めて調べてたら理解した
参考になりそうな記事が見つからなかったんで実行手順をメモっとく
ついでに意味もなく解析手順も書いとく

続 DLL

CATEGORYmugen記述
COMMENT0
前少し触って放置してたDLLを暇つぶしに弄ってた
大体どうすればいいかは理解したからメモっとく

[[[0x4B5B4C]+0xCD0]+0x40C]:defが存在するフォルダのパス(1p)
[[[0x4B5B4C]+0xCD0]+0x123C]:defが存在するフォルダのパス(2p)


調べてないから入ってるパスがdefのパスなのかは知らんけど、少なくともパスが入ってることは確か
ひとまず実行対象のdllのパスはコイツを基準にすればよさそうだね
LoadLibraryの呼び方はdrab氏がブログで書いてる通り、dllパス格納位置の先頭アドレスをpushしてcall [0x49F12C]するだけ

強制ステ返し

CATEGORYmugen記述
COMMENT0
stateno弄れば次の行動時に自動でステ移動されるのは知ってたけど、相手のステート読んでる最中だと相手のステート間を移動するっていうchangestateの挙動取るよね
それだと困る場合もあるんで強制的にselfstateする方法を調べてた

0x46e98a周辺で必要そうなコード
mov dword ptr ds:[edi+0xbec],edx
mov dword ptr ds:[edi+0xbf0],-1
mov eax,dword ptr ds:[edi]
add eax,0x3b4
mov dword ptr ds:[edi+0x964],eax
mov dword ptr ds:[edi+0x13c0],edx
mov ecx,dword ptr ds:[edi]
mov edx,dword ptr ds:[edi+0x13bc]
mov eax,dword ptr ds:[ecx+0x3cc]
mov dword ptr ds:[edx],eax


0x440ba9周辺で必要そうなコード
mov eax,dword ptr ds:[esi+0xbf4]
mov dword ptr ds:[esi+0xbf4],edi
mov dword ptr ds:[esi+0xbf8],eax
mov dword ptr ds:[esi+0xdfc],0


まとめるとこう
[アドレス+0xbec]:0
[アドレス+0xbf0]:-1
[アドレス+0x13c0]:0
[アドレス+0x964]:[アドレス]+0x3b4
[[アドレス+0x13bc]]:[[アドレス]+0x3cc]
[アドレス+0xbf4]:返す先のステート番号
[アドレス+0xbf8]:現在のステート番号
[アドレス+0xdfc]:0


上記のアドレスを汎用コードで弄ってみて問題なくステート返せることは確認できた
0x440ba9周辺のはstatenoとtimeだから必要ないんなら弄らんでもOKかな
どっか弄り忘れててステート返した後にバグるかもしれんけど、簡単に動かした限り問題なさそう

<追記>
盛大にコピーミスってて色々抜けてたのを修正

続 消去召喚の回避

CATEGORYmugen記述
COMMENT0
http://sinomugen.blog.fc2.com/blog-entry-103.html
完全に記事書くの忘れてたけど残像アドレスもリセットされるっぽいね
まあよく考えたら強制タゲで任意領域のタゲ取れるから強制destroyいらんわな

以下、リセット部分のコード抜粋
mov eax,dword ptr ss:[ebp+1394]
mov dword ptr ds:[eax+18],0
mov dword ptr ds:[eax+8],0
mov dword ptr ss:[ebp+1394],0
mov dword ptr ss:[ebp+13b4],0
mov dword ptr ss:[ebp+13ac],0

消去召喚の回避

CATEGORYmugen記述
COMMENT0
息抜きも兼ねて調べてた
具体的には0x471051の辺り
雑に眺めたけど+0x13ACと+0x13B4が初期化されるのが原因なんかな
他のところも初期化されるっぽいけど少なくともdestroyself実行後にヘルパーかexplod出すと落ちるのは回避できた

ってことで混線設置の強化できそうね
今まではヘルパーもexplodも出さないヘルパーから設置せざるを得なかったんだが本体からでも強制destroyできるわけだし
ヘルパーの占領を回避しつつ開幕混線が可能になったんで中々の調査結果だわ

現在elemの判定のアドレス

CATEGORYmugen記述
COMMENT0
[[[アドレス+0x13BC]+0x10]+0x28]:攻撃判定
[[[アドレス+0x13BC]+0x10]+0x2C]:被弾判定
Clsn付け消ししたら数値入ってたり0だったりするから多分あってる
anim検索の速度上げられるね

ってことでコードまとめも再更新
var(0)&1で攻撃判定、var(0)&2で被弾判定の有無を調べられるように変更

現在elemの被弾判定

CATEGORYmugen記述
COMMENT0
[[[[[アドレス+0x13BC]+0x10]+0x2C]+0x8]+0x4~0x13]
多分ここでよさそう
Clsn2[1]がある場合は0x14~0x17を飛ばして0x18以降にあるっぽいね

具体的にはこう


で、実験に使ったairがこれ


調べた場所は0x004350DD~0x0043522Aの辺り
ようやく放置してたアマ貫を搭載できそうですなぁ

<追記>
clsn2自体がない場合[[[アドレス+0x13BC]+0x10]+0x2C]が0みたい
その辺考慮しとかないとダメだね

<追記2>
汎用コードまとめ更新
指定プレイヤーの被弾判定を調べてくれるのを作った

コードで使用する変数の置き換え

CATEGORYmugen記述
COMMENT0
画像つきで説明した方が分かりやすいかな?
ということでもう少し真面目に解説