制作日記

こういうの作った方が、逃げにくいじゃない

taginの解析

静的解析してたら、taginの警告文がおかしいことに気付いた
statenoに負数指定しても、negative state云々の警告文が出ない
partnerstatenoに負数を指定すると、negative anim云々の警告が出る
理由は下の方にアセンブラ載せてるので、そっち参照

そんでもって、pertnerstatenoを省略した場合、negative animの警告が垂れ流されることから、
pertnerstatenoの初期値は負数であると推測できる

[state ]
type = tagin
stateno = 8902
partnerstateno = 8901
ignorehitpause = 1
persistent = 256
trigger1 = !PlayerIDExist(id - 1)

このステコンは、メモリ上では以下のようになる

083F09E4-083F0A47: 64h(100)Byte [Windows ANSI]
Address : +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
083F09E4 : 20 11 42 08 01 00 00 00 00 01 00 00 01 00 00 00 B
083F09F4 : 43 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C'
083F0A04 : C6 22 00 00 00 00 00 00 00 00 00 00 C5 22 00 00 ニ" ナ"
083F0A14 : 00 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00 
083F0A24 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
083F0A34 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
083F0A44 : 00 00 00 00

083F09E4から4byteずつ
trigger情報のアドレス
ステコンの存在フラグ
persistent
ignorehitpause
ステコンの種類の識別番号(taginは0x2743、tagoutだと0x2744)
その後12byteは多分使ってない
083F0A04から12byteはstatenoのパラメータ
(今回は直接数字を指定してるので先頭4byteだけ使用、トリガー使ったり計算式にすると変わってくる)
その次12byteがpartnerstateno、概要はstatenoと同じ

ってな感じ


それを理解した上で、↓のステコンがメモリ上ではどうなっているか見てみる

[state ]
type = tagin
stateno = 8902
ignorehitpause = 8901
persistent = 256
trigger1 = !PlayerIDExist(id - 1)


こんな感じ

08466ED4-08466F37: 64h(100)Byte [Windows ANSI]
Address : +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
08466ED4 : 80 54 89 08 01 00 00 00 00 01 00 00 C5 22 00 00 €T・ ナ"
08466EE4 : 43 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C'
08466EF4 : C6 22 00 00 00 00 00 00 00 00 00 00 FF FF FF FF ニ" 
08466F04 : 00 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00 
08466F14 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
08466F24 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
08466F34 : 00 00 00 00

partnerstatenoは08466F00から12byteなので、
0xFFFFFFFF,0x00000000,0x00000000
ということは、partnerstatenoは省略時-1であることがわかる

滅多にそんなことしないと思うけど、負数の時は警告文垂れ流しになるので、
partnerstatenoには極力0もしくは正数を指定しましょう

逆に、statenoには負数を指定しても警告文的には問題ないです

↓がtagin処理のメイン部分
ちなみにEAXが1でreturnすると、ステート移動したものと見做されます
あと、00440B60がステート番号書き換えたりする処理、ここはselfstateとかchangestateとかでも使用されてる
フラグとかで処理内容分岐させてるだけで、使用してる関数は全部同じなんですねー

004715AA |> 3BEA CMP EBP,EDX ; Case 2743 of switch 0046E830
004715AC |. 0F84 81000000 JE winmugen.00471633
004715B2 |. 8BBC24 A010000>MOV EDI,DWORD PTR SS:[ESP+10A0]
004715B9 |. 8D56 18 LEA EDX,DWORD PTR DS:[ESI+18]
004715BC |. 6A 01 PUSH 1
004715BE |. 52 PUSH EDX
004715BF |. 57 PUSH EDI
004715C0 |. E8 1B60F9FF CALL winmugen.004075E0
004715C5 |. 83C4 0C ADD ESP,0C
004715C8 |. 85C0 TEST EAX,EAX <<<<<<<<<<<<<<<<<<<<<<<<< statenoに指定されている値が負数か否か調べてる
004715CA |. 7C 0A JL SHORT winmugen.004715D6 <<<<<<<<<<<<< 負数ならstateno書き換え処理を飛ばす
004715CC |. 50 PUSH EAX
004715CD |. 57 PUSH EDI
004715CE |. E8 8DF5FCFF CALL winmugen.00440B60
004715D3 |. 83C4 08 ADD ESP,8
004715D6 |> 83C6 24 ADD ESI,24
004715D9 |. 6A 01 PUSH 1
004715DB |. 56 PUSH ESI
004715DC |. 57 PUSH EDI
004715DD |. E8 FE5FF9FF CALL winmugen.004075E0
004715E2 |. 8B8F 90010000 MOV ECX,DWORD PTR DS:[EDI+190]
004715E8 |. 8BF0 MOV ESI,EAX
004715EA |. 8B85 90010000 MOV EAX,DWORD PTR SS:[EBP+190]
004715F0 |. 83C4 0C ADD ESP,0C
004715F3 |. 3BC1 CMP EAX,ECX
004715F5 |. 74 09 JE SHORT winmugen.00471600
004715F7 |. 55 PUSH EBP
004715F8 |. E8 23FDFCFF CALL winmugen.00441320
004715FD |. 83C4 04 ADD ESP,4
00471600 |> 85F6 TEST ESI,ESI <<<<< partnerstatenoに指定されている値が負数か否か調べてる
00471602 |. 7D 1B JGE SHORT winmugen.0047161F <<<<< 正数もしくは0なら下の警告文を出す処理を飛ばして、stateno書き換え処理へ行く
00471604 |. 68 5CBE4A00 PUSH winmugen.004ABE5C ; ASCII "attempted change to negative anim" <<<<< 試合画面左上の警告文
00471609 |. 57 PUSH EDI
0047160A |. E8 E13FFAFF CALL winmugen.004155F0
0047160F |. 83C4 08 ADD ESP,8
00471612 |. 33C0 XOR EAX,EAX
00471614 |. 5F POP EDI
00471615 |. 5E POP ESI
00471616 |. 5D POP EBP
00471617 |. 5B POP EBX
00471618 |. 81C4 8C100000 ADD ESP,108C
0047161E |. C3 RETN
0047161F |> 56 PUSH ESI
00471620 |. 55 PUSH EBP
00471621 |. E8 3AF5FCFF CALL winmugen.00440B60
00471626 |. 83C4 08 ADD ESP,8
00471629 |. C785 60340000 >MOV DWORD PTR SS:[EBP+3460],0
00471633 |> 5F POP EDI
00471634 |. 5E POP ESI
00471635 |. 5D POP EBP
00471636 |. B8 01000000 MOV EAX,1
0047163B |. 5B POP EBX
0047163C |. 81C4 8C100000 ADD ESP,108C
00471642 \. C3 RETN

コメントの投稿

非公開コメント

プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク