2017年08月12日

drab氏の記事(追記あり)


文字数によって不具合が出るのはテンプレ出した当時からわかってたけど、
今までのDTCtextコードと似たような使い方をするためにはここのアドレスかスタックポインタ乗っけるしかなかったからなぁ

(あと正直、改善策が後々出てくることを期待して適当に作ったところはある)

私は残像先のアドレス使ってコード実行するテンプレもあるから別にあまり困ってない(コードの長さの制限はあるけど)

%f・%e・%gでも利用可能なのはコード読めばわかるわな

他にコード埋め込める場所で楽なのあったっけ?
変数/残像/DTCtextくらいしか浮かばんわ

追記
熄氏によってtext出力地点のespを実行先に指定すれば安全(?)に1ステコン実行ができるようになりました
posted by めろんピエロ at 13:46| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年07月29日

%fのやつ情報追加(随時更新あり)

追加でちょっと調べました
随時更新します

追記1 レジスタに補足
追記2 レジスタに補足

・修復
先頭に
push 317A9782
sub dword [esp],31313131
最後に
RET

・コード実行場所
4B48E8を書き換えるだけなのでアドレスさえわかれば残像や変数領域でも実行可能

・アドレス取得や4B48E8書き換え
ここは既存のtextコード実行の方がステコン数減って楽かも

・レジスタ
EBXに自己アドレスはない
[EDI-4]に自己アドレスが入ってると思われる
→確定で入ってます

・コード連続実行
%fの行頭にコードを置いて次のステコンでまた%fすれば可能→ステコン数減る

posted by めろんピエロ at 20:09| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

コード実行処理の重さ(追記あり)

コード実行 - Statedef 5150

実行するコードが重いわけではなく、スタックバッファオバフロするために1024バイト埋めるのが重いってことか

そう言われればそうだな

ってことで、できるだけコード実行形式を変えずに軽めのコード実行をできるようにした

使ってるのは%fのcall
この解説は過去記事にあるからわからなかったら見てください

必須なのはアドレス取得
[[char+0x345C]+4]を取得してね
これを取得したあとは、%nで4B48E8に取得した値を代入
その後コードのみをDTCで出力(1024バイト埋める必要はない)
で、その次のステコンで%fのDTCを実行する

テンプレはこんな感じ(var(0)=[[char+0x345C]+4])



[state ];ここから4個はコード実行箇所代入
type=displaytoclipboard
trigger1=1
text="%.*d%n%d"
params=(var(0)&255),0,4933864
ignorehitpause=1
[state ]
type=displaytoclipboard
trigger1=1
text="%.*d%hn%d"
params=(var(0)&(255*256))/256,0,4933865
ignorehitpause=1
[state ]
type=displaytoclipboard
trigger1=1
text="%.*d%hn%d"
params=(var(0)&(255*256*256))/(256*256),0,4933866
ignorehitpause=1
[state ]
type=displaytoclipboard
trigger1=1
text="%.*d%hn%d"
params=(var(0)&(255*256*256*256))/(256*256*256),0,4933867
ignorehitpause=1
[state ];ここから3個は修復
type=displaytoclipboard
trigger1=1
text="%.*d%n%d"
params=251,0,4933868;追記:ここのアドレスがガバってたので修正
ignorehitpause=1
[state ]
type=displaytoclipboard
trigger1=1
text="%.*d%hn%d"
params=98,0,4933869
ignorehitpause=1
[state ]
type=displaytoclipboard
trigger1=1
text="%.*d%hn%d"
params=73,0,4933870
ignorehitpause=1

[state ];これがコードステコン
type=displaytoclipboard
trigger1=1
text="瑞瑞瑞瑞";NOPを8個並べただけ、復帰処理がないので実行すると落ちます
ignorehitpause=1
[state ];コード実行ステコン
type=displaytoclipboard
trigger1=1
text="%f"
params=0.0
ignorehitpause=1

[state ];ここから3個は修復
type=displaytoclipboard
trigger1=1
text="%.*d%n%d"
params=81,0,4933864
ignorehitpause=1
[state ]
type=displaytoclipboard
trigger1=1
text="%.*d%hn%d"
params=102,0,4933865
ignorehitpause=1
[state ]
type=displaytoclipboard
trigger1=1
text="%.*d%hn%d"
params=73,0,4933866
ignorehitpause=1

こんな感じですね
%nでの代入は最初と最後に1回ずつ行えば大丈夫なので実質ステコン2個でコード実行できます
通常通り%cが使えるのか、コード内での修復処理はどうやるのか、などは未確認なので今度時間があったら調べてまたブログに書くと思います.
posted by めろんピエロ at 11:45| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年07月18日

前記事の追記+テンプレ公開

しました
DLは以下から可能です。
言わずもがなですがメモ帳等で保存するとコード崩れるんで注意してください。

テンプレDL
posted by めろんピエロ at 01:24| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年07月17日

もっとコード改良(追記あり)

代入先数値と参照元数値をキャラアドレスからの距離で指定できるように改良

コードの内容は
参照元で指定した領域に入っているアドレスの中身を、代入先アドレスに代入する
要するにvar(0):=[var(1)]みたいなやつ

前回の記事と同様に%cで数値指定してください

フラグの部分はビットごとに処理を分けています
1:参照元アドレス変位の上位1バイトが0
2:参照元アドレス変位の下位1バイトが0
4:代入先アドレス変位の上位1バイトが0
8:代入先アドレス変位の下位1バイトが0
16:各バイトが全て0ではない


pushad
pushfd
xor eax,eax
xor ecx,ecx
xor edx,edx
mov cl,;フラグ
test cl,10
je *0
xor ecx,ecx
*0 test cl,2
jnz *1
mov al,;参照元のアドレス下一桁
*1 test cl,1
jnz *2
mov ah,;参照元のアドレス上一桁
*2 test cl,8
jnz *3
mov dl,;代入先のアドレス下一桁
*3 test cl,4
jnz *4
mov dh,;代入先のアドレス上一桁
*4 mov edi,[ebx+eax]
mov edi,[eax]
mov dword [ebx+edx],edi
popfd
popad
add esp,8
pop esi
sub esp,0xFFFFFC01
inc esp
mov dword [esp],0xFFB8EC0C
not dword [esp]
retn


勘の良い方はお気付きだと思いますが、フラグと参照元と代入先の指定で既に引数を5つ使用しています。
これではバッファオーバーフローのために空白を埋める作業に必要な%1024d(一例)の引数を指定することができません。
そこで、persistent弄りを用いて引数を持ってくることでうまく引数不足を回避します。

記述の一例は後で追記します。

追記:コードを少し変更しました
加えてテンプレを公開しました。

追記2:コードに重大な欠陥があったので修正
posted by めろんピエロ at 12:59| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年07月10日

%cで変数指定

前回の記事でちょっと触れた、%cで変数指定ってのについて解説
textパラメータ内でのコード実行では、引数を直接指定できないので変数とかに引数を予め入れておく必要がある
テンプレではvar(0)を固定使用する手法が取られてたけど、%cを使えば変数を指定することができる

以下そのテンプレ(ある変数に入ってるアドレスの中身をその変数に出力する)
pushad
pushfd
xor ecx,ecx
xor edx,edx
mov dl,40
mov dh,0xE
mov esi,ebx
add esi,edx
mov cl,変数の引数(var(1)なら1、fvar(0)なら60)
lea eax,[esi+ecx*4]
mov edx,[eax]
mov dword [eax],edx
popfd
popad
add esp,8
pop esi
sub esp,0xFFFFFC01
inc esp
mov dword [esp],0xFFB8EC0C
not dword [esp]
retn

こんな感じかな
あとはこれを文字変換してclに代入してる数値を%cで入れられるようにしておしまい!

次は%sでコード圧縮の話でもしよっかなー
posted by めろんピエロ at 14:35| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年07月09日

最近

1ステコードが広まりつつあるのでうれしいよ!
sinoha氏の便利コードまとめも公開されたし、これからこのコード実行はメインになっていきそう

ところでSAMSARA氏が「%nはもういらない子」的なこと仰ってたけども、%nはまだまだ使える子だと思うよ

%hnで2バイト書き込みもできるし、アドレスがわかっててただ代入するだけなら%nの方が処理軽いから

あとコードテンプレ見てて感じたのは、どうせ汎用コード組むなら%cか%sフル活用してもっと汎用性高いコード組もう!ってことかな
あれがあれば使う変数指定とかも可能だよ
アドレス取得後ならコード圧縮にも使える

折角便利な技術作ったんだから、搭載したキャラ作りたいけどなー俺もなー
posted by めろんピエロ at 23:42| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年05月17日

親捏造,参照先弄り,%n,コード実行等まとめ

自分用メモも兼ねてまとめ

長いので続きから続きを読む
posted by めろんピエロ at 09:11| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年04月25日

5030で非凍結オバステができる理由

調べようと思って先延ばしにしてたのでこの際調べた
結論から言うとtimeだった

5030ステートに自動的に飛ぶ条件は
Lifeが0
aliveが0以外
nokoが使用されてない
です

プレイヤーの個別ステート処理終了後、上の条件を満たしているとaliveが0になって5030ステートに移動させられます
その際、timeは0になるのですが…

一般的にtimeは各プレイヤーの個別ステート処理が終わった後に1増加します

ここで注目したいのが処理の順番
5030移動&time=0となる処理が先か、timeの増加処理が先か

前者なら次Fをtime=1で迎えられるので非凍結オバステが可能
後者なら増加した後timeが初期化されるので不可能

もちろんMUGENの処理は前者です

これを使って!time貫通砲の撃破挑戦キャラでも作ろうかと思ったんだが案が浮かばなかったのでブログで報告することにした
posted by めろんピエロ at 14:06| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年04月23日

最近

最近やったこと

残像と併用したらステコン数増えちゃうのでコピペ可能な変数仕様型1ステコードを組んだ
それだけかなー

だんだんとMUGENのやる気がなくなりつつある…一通さん作りたいとは思ってるのに手が進まんなー

そういえばdrab氏が%hnを見つけたそうですね、あれは便利そう

私も%Zの処理解析をしてたんですが途中で詰まったから放置してる…
誰か解析して(他力本願)
posted by めろんピエロ at 10:03| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする