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 | このブログの読者になる | 更新情報をチェックする

2017年04月09日

捏造補助親変更

親捏造でparentvarset利用するの面倒じゃない?
というか親捏造自体が時代遅れ

​それは置いといて、parentvarset使うよりは別途アドレス取得しといて%nで弄ったほうが効率いいよね

ちなみに方法は
本体化
影のid調整
親アドレス修復
rootアドレス修復
ヘルパー化
だったかな

もっと効率いいのはafterimagetimeとpowersetで影のidだけ弄る方法かなー
まあ特に説明もいらないでしょ

結論:コードでやって

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

2017年03月26日

残像併用コード実行の注意点

今までコード実行後にP+1394(残像アドレス)の中身を0にしていたんですが、コード実行を連発する時に落ちることが発覚したので修正案をば
どうやら残像はパラメータのtimeが0だと表示されないみたいなので、コード代入の残像のtimeを0にするかafterimagetimeでtime=0にすれば安全に終了出来そうです
posted by めろんピエロ at 15:21| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年03月04日

コード実行をまた改良(追記あり)

よく考えたらわざわざ毎回DTCのtextでコードを文字コード変換してバイナリエディタで入力するよりも、最初に自己アドレスだけ取得して%sで引数を変数領域にして変数をコードに見立てた方が楽やわ

敵でもアドレスさえわかってればできるし

文字コード変換の問題点って、メモ帳とかで保存するとコードが崩れちゃうことなのよね
それを解決できる方法の一つはこれかなー、と

ここから追記
この手法、意外と変数領域が必要だし、敵の変数弄りたくないならバックアップ必要って事が判明した
そしてこれ残像利用でいいや
posted by めろんピエロ at 20:13| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年02月24日

飛び道具完全反射再現したい@

自分のアーマーに当たったprojを敵にそのまま返すシステムを作りたいなと
projメモリの位置はわかってるので、懸念としては
・自分に当たったprojの判別
・どうやって「そのまま」反射するのか
がある

まず一つ目のproj判別から
自分に当たったprojを引数として参照出来ればよかったんだけども、そんなトリガー情報はなさそう
gethitvar()で情報を取得した後に存在するprojと比較して判別するというのを思いついたが、多段ヒットに対応できなさそうなのでちょっと微妙

次に考えたのは敵のnumprojid()の引数を検索、保存しておいて、毎フレームprojcontacttime()で参照する
これなら多段ヒットにも対応できる(誤感知する?)
毎フレーム全projを参照してるので重くはなるかもしれんが、大したことは無いと信じたい

てなわけでこれから感知システムを組む予定
2番目の懸念に関してはまた他の記事で
posted by めろんピエロ at 23:23| Comment(0) | MUGEN | このブログの読者になる | 更新情報をチェックする

2017年02月20日

DEP回避したい(素案)

DEPを回避してコードを実行したい

DEPとは・・・コード実行可能領域でない場所でコードを実行した時にプログラムを強制終了するオプション(デフォルトはオフ)

これがあるとスタックやヒープでコードが使えなくなるので
・先日のスタック内コード
・4B0000周辺のコード
・自分の変数領域でのコード
とかもダメ

回避するにはdrab氏が既にやっているように、既存のコードでちょうどいいのを使ってLoadlibraryを呼ぶ
そして事前に用意したdllを読み込ませてコード実行する
詳しくはdrab氏のブログを見てください

で、他にもないかなーと考えたら
・VirtualProtectを呼ぶ
・VirtualAllocとかを呼ぶ

前者は指定した領域の保護種類を変更するというもの
これを使えば任意の領域をコード実行可能領域に変更できるのでDEPに引っかからなくなる

後者は新たにメモリ領域を確保するというもので、その際に好きな保護種類を選択できる

どちらの関数もメモリ上に展開はしてあるのできちんとした引数を積んだ上でそこに飛べば実行可能
ここで問題なのがきちんとした引数を積むこと

スタックに積まなきゃならん以上、スタックをある程度書き換えられなくてはならない
私が知ってる中でスタックを広範囲に書き換えられるのはdisplaytoclipboard(あとappendtoclipboard)しかない

DTCを実行してスタックを書き換えた後に関数を呼ぶ必要があるのでespを自分が任意に書き換えられる位置に変更する必要がある
既存のコードで
add esp,38
RETN
があったのでスタックバッファオバフロでRETN先を書き換えた上で38byte先のスタックを関数の引数とRETN先に書き換える
自分の環境だと38byte先は自分の出力したDTCtextの文字列があった(たぶん環境差はないと思う)のでそこの位置に当たるように文字を指定した

これで関数は呼べるようになったのだが、更に問題点があって
「引数に0がある」
こと

DTCでは文字列の終端判別にヌル文字を使っているので、textに00を入れてしまうとその後は出力されない

現状そこで詰まってて、解決するには既存のコード利用するしかないんだけど...
果たしてあるのだろうか

参考までに、VirtualProtectの引数は4種類

@保護の種類を変える領域の先頭アドレス
A何byte分変更するのか
B変えた後の保護の種類
C以前の保護の種類が入っている変数へのポインタ

まず、@とCについて
変更する領域が4B0000とかなら少なくとも4byte目に00が確実に入ってしまう
それより高位ならなんとかなるかも

次にA
ここは適当でいいと思う

最後にB
変更するのはPAGE_EXECUTE_READWRITEなので引数は0x40
確実に0が入っちゃうので困る

うまいことpushしてくれるコードがあればいいんだけど...

間違ってるかもしれないので何かあったら教えていただけると幸いです

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