キー入力2

Last-modified: 2018-12-14 (金) 17:57:33

チートコードのようなものを実装する方法です。
文字数によって書き方が少し異なります。

 

方法A(ADMA)

4文字まで

  • 3文字
    :key
    wait 0
    0@ = -229908
    008B: 1@ = &0(0@,1i) // キー入力履歴の1~4文字を取得
    0085: 2@ = 1@        // 抽出のために別の変数にコピー
    1@ /= 0x1000000      // 1@に「不要な値だけを残す」ための処理
    1@ *= 0x1000000      // 今回は3文字の比較なので、1@を4文字目だけにする
    0062: 2@ -= 1@       // 2@(元の値)から1@(不要な値)を引いて、2@を必要な値だけにする
    if
    2@ == 0x475441       // "GTA"
    jf @key
    &0(0@,1i) = 0        // ループ防止のためにキー入力履歴の一部を潰す
    最低でも4文字ずつしか取り出せないので、6~8行目で不要な文字数分を取り除いています。
    10行目の右辺でコマンドを指定します。Googleで「Ascii 変換」などで検索して、指定したい文字列をASCIIコードに変換してください。
    2文字以下にしたい場合は6,7行目の0x1000000を変更します。1文字なら0x100、2文字なら0x10000にすればOKです。
  • 4文字
    :key
    wait 0
    0@ = -229908
    if
    &0(0@,1i) == 0x4841434B // "HACK"
    jf @key
    &0(0@,1i) = 0           // ループ防止
    4文字の場合はそのまま比較するだけで済みます。

5文字以上

1文字と4文字を合わせた形。6文字なら2+4、7文字なら3+4...となります。
4文字ごとに0@に格納する値を+1するのを忘れずに。-229908のままだと最後に入力された4文字としか比較してくれず、成り立たなくなります。
以下は5文字のコマンド「SANNY」を取得する場合の例です。

:key
wait 0
0@ = -229907             // 入力履歴の5~8文字が欲しいので-229908に+1
008B: 1@ = &0(0@,1i)
0085: 2@ = 1@
1@ /= 0x100
1@ += 0x100
0062: 2@ -= 1@          // 5文字目だけを取り出す
if
2@ == 0x53              // "S"
jf @key
0@ = -229908            // 1~4文字目を指定
if
&0(0@,1i) == 0x414E4E59 // "ANNY"
jf @key
&0(0@,1i) = 0           // ループ防止

8文字

:key
wait 0
0@ = -114954
if
&0(0@,1s) == '4321TSET' // "TEST1234"
jf @key
0@ = -229908
&0(0@,1i) = 0

16文字

:key
wait 0
0@ = -57477
if
&0(0@,1v) == "8765432187654321" // "1234567812345678"
jf @key
0@ = -229908
&0(0@,1i) = 0

方法B(read_memory)

方法Aと比べると、3文字以下の比較が非常に簡潔に済むのが特徴です。
基本的にはこちらの方が使いやすいかと思います。

4文字まで

0A8D: 0@ = read_memory 0x969110 size 4 virtual_protect 0
のsizeを取り出したい文字数(1-4)にして、それをifで比較するだけです。

  • 3文字
    :key
    wait 0
    0A8D: 0@ = read_memory 0x969110 size 3 virtual_protect 0
    if
    0@ == 0x475441 // "GTA"
    jf @key
    0A8C: write_memory 0x969110 size 1 value 0 virtual_protect 0 // ループ防止
    抽出処理を丸々省けるので、方法Aと比べると行数も変数も少なくて済みます。
  • 4文字
    :key
    wait 0
    0A8D: 0@ = read_memory 0x969110 size 4 virtual_protect 0
    if
    0@ == 0x4841434B // "HACK"
    jf @key
    0A8C: write_memory 0x969110 size 1 value 0 virtual_protect 0 // ループ防止
    こちらは方法Aとほぼ同じで、使う命令が変わったくらいです。

5文字以上

1-4文字+4文字のように組み合わせるだけです。
4文字ごとに0A8Dのアドレスに+0x4するのを忘れずに。
例えば「SANNY」なら

:key
wait 0
0A8D: 0@ = read_memory 0x969114 size 1 virtual_protect 0 // 5文字目を拾いたいので+0x4
if
0@ == 0x53       // "S"
jf @key
0A8D: 0@ = read_memory 0x969110 size 4 virtual_protect 0 // 1~4文字目
if
0@ == 0x414E4E59 // "ANNY"
jf @key
0A8C: write_memory 0x969110 size 1 value 0 virtual_protect 0 // ループ防止

となります。

CLEO4の場合

専用のOpcodeが追加されたので、まだるっこしいことをしなくてよくなりました。

:key
wait 0
if
0ADC: test_cheat "BLOWUP"
jf @key