参考サイト:
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