使用できる変数を増やす

Last-modified: 2018-12-14 (金) 04:02:37

参考サイト:
ttp://samc.blog123.fc2.com/blog-entry-485.html#more (現在アクセス不可)
バッファオーバーランを使用

0A9F: 1@ = current_thread_pointer
000A: 1@ += 0x10
0A8D: 0@ = read_memory 1@ size 4 virtual_protect 0
000A: 0@ += 4
000A: 1@ += 0x2C
000E: 0@ -= @EXT_VAR
0062: 0@ -= 1@ // (int)
0016: 0@ /= 4
     :
000A: 0@(0@,1i) += 1
     :
:EXT_VAR
hex
00000000 // padding
00000000 // 0@(0@,1i)
00000000 // 1@(0@,1i)
00000000 // 2@(0@,1i)
00000000 // …
00000000 // …
00000000 // …
00000000 // …
00000000 // …
00000000 // …
00000000 // 9@(0@,1i)
00000000 // padding
end

最初の0A9Fから0016までで求まった0@を大事に取っておくことで、この例の場合だと0@(0@,1i)から9@(0@,1i)という変数を新しく使えるようになります。
もちろん本来の1@や9@などを書き換えることはありません(というかそうでなければ意味がありません)。

 
旧式変数拡張(非推奨)

ローカル変数の制限突破にもある方法です。

                     :
for 0@ = 0 to 9
    0093: 1@ = integer 0@ to_float
    04C4: store_coords_to 5@ 6@ 7@ from_actor $PLAYER_ACTOR with_offset 0.0 1@ 0.0
    0107: 2@ = create_object #KNIFECUR at 5@ 6@ 7@
    gosub @get_pointer
    0085: 4@ = 0@ // (int)
    0012: 4@ *= 4
    005A: 30@ += 4@ // (int)
    0A8C: write_memory 30@ size 4 value 2@ virtual_protect 0
end
wait 2000
for 0@ = 0 to 9
    gosub @get_pointer
    0085: 4@ = 0@ // (int)
    0012: 4@ *= 4
    005A: 30@ += 4@ // (int)
    0A8D: 2@ = read_memory 30@ size 4 virtual_protect 0
    if
    03CA:   object 2@ exists
    then
        0108: destroy_object 2@
    end
end
                     :
                     :
:get_pointer
0A9F: 30@ = current_thread_pointer
000A: 30@ += 0x10
0A8D: 30@ = read_memory 30@ size 4 virtual_protect 0
000E: 30@ -= @pool
return
:pool
hex
//2@ - knife pool - 40byte
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
end