日常の戯言とかなんとか

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- : スポンサー広告 :
Pagetop

Alive偽装その3

その2では、偽装の範囲を4バイト目まで拡張しました。今回はそれを踏まえたうえで負の数に偽装する方法を解説します。

まず、16進数では負の数をどう表現するかというと、2の補数という方法を用います。
2の補数については各自で調べてください。(説明してもいいけどもっとわかりやすい既存の解説がある上に1記事分くらい必要になるのでやりたくない)

負の数は必ず最上位ビットが1になります。これは、128以上の数値を書き込まなければいけないということを意味します。つまり普通にpersistentを付けただけでは負の数にすることはできません。
ところが、changestateは例外的に「persistentの値によらず、数値をpersistentで指定した値に書き換える」という処理になります。
では、Alive偽装ステートの553個目を以下のようにしてみましょう。
[state 553]
type = changestate
trigger1 = 1
value = 0
ignorehitpause = 1
persistent = 128

1回読み込むとAliveが0になり、もう一度読み込ませると128になりました。
では、553個目をignorehitpause付きのnull、556個目を上のようにしてみましょう。すると今度は-2147483648になったはずです。これを16進数で表すと0x80000000、2進数で表すと0b10000000,00000000,00000000,00000000となります。

では、これの応用でAliveを-1にしてみましょう。まずは超即死を読み込んでAliveを0にします。
-1は16進数だと0xFFFFFFFFです。0xFF=255なので553~556個目をchangestateにして、persistent=255とします。
そして、255に書き換えたところをまた通過してしまうと0になってしまうので一度しか実行されないようにトリガーを工夫するとこのようになります
[state 553]
type = changestate
trigger1 = alive = -256
value = 0
ignorehitpause = 1
persistent = 255
[state 554]
type = changestate
trigger1 = alive = -65536
value = stateno
ignorehitpause = 1
persistent = 255
[state 555]
type = changestate
trigger1 = alive = -16777216
value = stateno
ignorehitpause = 1
persistent = 255
[state 556]
type = changestate
trigger1 = alive = 0
value = stateno
ignorehitpause = 1
persistent = 255

Alive偽装についての解説は以上です。
あとは各自で偽装したい値について考えてみてください。
また、今回使ったステコンオーバーフロー中の挙動は親変更などの際に非常に重要になりますので、覚えておいて損はないかと思います。

スポンサーサイト
2012-12-16 : MUGEN解説 : コメント : 0 : トラックバック : 0
Pagetop
コメントの投稿
非公開コメント

Pagetop
« next  ホーム  prev »

プロフィール

@ひたち

Author:@ひたち
「@」を忘れるべからず
読みは普通に「ひたち」でいいんじゃないの

検索フォーム

アクセスカウンター

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。