FC2ブログ
2017/06/29

ステータス上限の設定まとめ

TWCI_2017_6_27_9_1_22.jpg

前の記事でEXPテーブルの読み込み数いじろうとしたら今までバックアップとってた起動ファイルが全て起動できなくなってたのでまた一からいじり直す羽目に・・・。今後もこのようなことがあると思われるので下記にまとめておきました。

MAX重量の書き換え

81 7D 10 0F 27 00 00 7E 07 C7 45 10 0F 27 00 00 83 7D 10 00

MAXHPの書き換え

81 7d 10 0f 27 00 00 7e 2d 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 b4 92 14 00 83 c4 10 6a 03 68 5d 0b 36 08 68 10 0f 42 08 53 ff d0 83 c4 10 c7 45 10 0f 27 00 00

81 7d 10 0f 27 00 00 7e 2d 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 3d 92 14 00 83 c4 10 6a 03 68 5d 0b 36 08 68 10 0f 42 08 53 ff d0 83 c4 10 c7 45 10 0f 27 00 00

MAXMPの書き換え

81 7d 10 e7 03 00 00 7e 2d 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 c6 91 14 00 83 c4 10 6a 03 68 21 0d 36 08 68 10 0f 42 08 53 ff d0 83 c4 10 c7 45 10 e7 03 00 00

81 7d 10 e7 03 00 00 7e 2d 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 4f 91 14 00 83 c4 10 6a 03 68 21 0d 36 08 68 10 0f 42 08 53 ff d0 83 c4 10 c7 45 10 e7 03 00 00

MAXSPの書き換え

81 7d 10 0f 27 00 00 7e 2d 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 d8 90 14 00 83 c4 10 6a 03 68 87 ca 35 08 68 10 0f 42 08 53 ff d0 83 c4 10 c7 45 10 0f 27 00 00

81 7d 10 0f 27 00 00 7e 2d 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 61 90 14 00 83 c4 10 6a 03 68 87 ca 35 08 68 10 0f 42 08 53 ff d0 83 c4 10 c7 45 10 0f 27 00 00

MAXDEFの書き換え

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 9a a3 14 00 83 c4 10 6a 03 68 22 ac 35 08 68 10 0f 42 08 53 ff d0

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 0a a3 14 00 83 c4 10

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 9a a2 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 0a a2 14 00

81 b8 44 01 00 00 ff 00 00 00 7e 09 c7 45 f4 ff 00 00 00 eb 47 8b 45 08 83 b8 44 01 00 00 00 79 09 c7 45 f4 00 00 00 00 eb 32

MAXMRの書き換え

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 30 a1 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 a0 a0 14 00

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 30 a0 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 a0 9f 14 00

81 b8 4c 01 00 00 ff 00 00 00 7e 09 c7 45 f4 ff 00 00 00 eb 47 8b 45 08 83 b8 4c 01 00 00 00

MAXSTABの書き換え

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 c6 9e 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 36 9e 14 00

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 c6 9d 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 36 9d 14 00

66 81 b8 8c 01 00 00 ff 00 7e 09 c7 45 f4 ff 00 00 00 eb 48 8b 45 08 66 83 b8 8c 01 00 00

MAXHACKの書き換え

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 5c 9c 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 cc 9b 14 00

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 5c 9b 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 cc 9a 14 00

66 81 b8 90 01 00 00 ff 00 7e 09 c7 45 f4 ff 00 00 00 eb 48 8b 45 08 66 83 b8 90 01 00 00

MAXINTの書き換え

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 f2 99 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 62 99 14 00

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 f2 98 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 62 98 14 00

66 81 b8 2c 01 00 00 ff 00 7e 09 c7 45 f4 ff 00 00 00 eb 48 8b 45 08 66 83 b8 2c 01 00 00

MAXDEXの書き換え

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 88 97 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 f8 96 14 00

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 88 96 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 f8 95 14 00

66 81 b8 30 01 00 00 ff 00 7e 09 c7 45 f4 ff 00 00 00 eb 48 8b 45 08 66 83 b8 30 01 00 00

MAXAGIの書き換え

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 1e 95 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 8e 94 14 00

81 7d 10 ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 1e 94 14 00

3d ff 00 00 00 7e 26 83 ec 08 68 10 0f 42 08 8b 5d 08 53 e8 8e 93 14 00

66 81 b8 34 01 00 00 ff 00 7e 09 c7 45 f4 ff 00 00 00 eb 48 8b 45 08 66 83 b8 34 01 00 00

置き換え機能で赤文字の所を変更する。

あと書き換えたjtalesファイルを起動するとPermision Deniedと言われて起動できない場合、権限を変更すれば できると思うので

chmod 700 /tw404/jtales0/jtales
chmod 700 /tw404/jtales1/jtales
chmod 700 /tw404/jtales2/jtales

を実行した上げて下さい。

もうLvの上限は諦めようかな・・・Lvの上限変えられてもEXPで扱える値が32ビットだから本鯖基準で考えると280くらいまでしか上げることが出来ないんですよね。もう根本的に起動ファイルの構造を変えないと駄目っぽい。さすがに素人がそこまでできるわけがないのであ~どっかの社員がまた鯖流出してくれないかな~

そう言えば手動振りの部分まとめるの忘れた・・・080cd475 <_c_LevelManager__increaseUserVital_vitalType_value_>:付近のをいじれば手動で振れるようになります。



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

2017/06/29

EXPテーブルの読み込み数を変えてみようと思ったけど挫折した。

3b 05 64 d2 57 08 cmp 0x857d264,%eax

↑の命令MAXLevelが格納されてそうなアドレスと比較しており、アドレスの参照先がどうやらalレジスタを 使用してそうな感じがしました。

0857d264 :
857d264: 00 00 add %al,(%eax)

参照先がこんな感じになっておりここを最初変えようかなと思ったのですがよく分かんないので参照元の 命令コードをcmp 0x857d264,%eax からcmp $0xffff,%eax みたいな感じにしようかと思います。

3bが命令コードで 05 64 d2 57 08が0x857d264だから・・・

3d 00 00 00 00 cmp $0x0,%eaxを参考にすると

3d ff ff 00 00 cmp $0xffff,%eaxってことでいいのかな??

物は試し。実行ファイルのバックアップを取ってから 3b 05 64 d2 57 08 を 3d ff ff 00 00 に上書き・・・。

結果はLevelup table has dup level

ふえぇぇ・・・。

あと0x857d264参照してるのが

a3 64 d2 57 08 mov %eax,0x857d264
ff 35 64 d2 57 08 pushl 0x857d264

上記をそれぞれ下記のように置き換える。(バックアップを忘れずに)

b8 ff ff 00 00 mov %eax,$0xffff(多分)
68 35 ff ff 00 00 pushl $0xffff(多分)

結果はLevelup table has dup level

ふえぇぇ・・・・・

そしてなんかバグった・・・バックアップとってた起動ファイルで鯖起動しても 駄目だった・・・あれ?やり直し?



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

2017/06/22

ステータスSTABの上限を変更することに成功!

今回の実験はステータスSTABの上限値を255を超せるように設定できるようにしてみます。

まず_i_User__setStab関数を変更してみる。

81 7d 10 ff 00 00 00 cmpl $0xff,0x10(%ebp)

81 7d 10 ff ff 00 00 cmpl $0xffff,0x10(%ebp)

特に変化なし・・・。

次に_i_User__addStab関数を変更してみる。

3d ff 00 00 00 cmp $0xff,%eax

3d ff ff 00 00 cmp $0xffff,%eax

特に変化なし・・・。

次に_i_User__setOrgStab関数を変更してみる。

81 7d 10 ff 00 00 00 cmpl $0xff,0x10(%ebp)

81 7d 10 ff ff 00 00 cmpl $0xffff,0x10(%ebp)

特に変化なし・・・。

次、_i_User__addOrgStab関数を変更してみる。

3d ff 00 00 00 cmp $0xff,%eax

3d ff ff 00 00

特に変化なし・・・。

はい、お次は<_i_User__stab>関数を変更。

66 81 b8 8c 01 00 00 cmpw $0xff,0x18c(%eax)
ff 00

ff ff

特に変化・・・・あれ?

ステSTAB4のはずがSTAB255になってる!(4から+251されたことになってる)

TWCI_2017_6_22_22_26_13.jpg

むむ・・・ここはいじっちゃだめそうだ。いや・・・待てよ?操作してるレジスタ自体は 1バイトレジスタじゃないはずだし・・・リトルエンディアン方式だから

66 81 b8 8c 01 00 00 cmpw $0xff,0x18c(%eax)
ff 00

66 81 b8 8c 01 00 ff
ff 00

おお!!255から手動振りできないけどレベルアップかステータス強化系のアイテムを使う ことで255を越すことに成功できたぞ!!

TWCI_2017_6_22_22_43_12.jpg

ふむ・・・しかし手動振りはどうすればいいのだろうか・・・?254までは振れるからレベル アップと同じような感じで探していけば良さそうかな?それにしてもset,add,setOrg,addOrg いじったけど何も変化が見られませんでしたね。もしかして装備の上限値をいじってたのだろうか・・・・ 今度共通武器の補正をいじって確かめてみます。



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

2017/06/20

最大HPMPSP重量を変更できました

相変わらずLevelup.jtalesの読み込み数を変える箇所が分からないのでまた脱線して他の数値を変えてみました。

HPMPSPの最大値を9999から上げられるだけ上げてみようと$0x27f、で探してみました。だいたい 81 7d 10 0f 27 00 00 みたいなバイナリが少数ヒットしたので下記のように置き換えました。

81 7d 10 0f 27 00 00 → 81 7d 10 ff ff ff ff

しかし地域鯖の移動で最大重量が0になったりとバグってしまいました。2バイト(65535)までしか扱えないっぽいので下記のように置き換えてみました。

81 7d 10 ff ff ff ff → 81 7d 10 ff ff 00 00

重量1

今度は成功・・・と思いきや65535を超えようとすると・・・・・

重量2

9999に上書きされてしまう模様です。(上記の画像では9999に上書きされてからもう1回使った状態) まあその辺は、アイテムを使った時に65535を超えないようにすればいいんですかね。そもそも通常のプレイでここまで上げさせるつもりもありませんが・・・・。

下記は最大HP、MP、SPをいじった画像です。

TWCI_2017_6_20_18_47_2.jpg

まあバランス的には上限変えなくても問題ないのでほぼやりこみ要素的なものになるのかな?覚醒してる時に上限変えるとかって変え方がよく分からないし・・・・誰かLimitBreaks.jtalesで最大値設定できるようにしてくれる人いないかな?(他力本願)

そういえばSTABとかもいじれるのかな?時間あったら試してみよっと。



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

2017/06/15

久々に本鯖ログインしてみた

色々インターフェースが変わっててもTalesWeaverではなくはや別次元の何かと化していました・・・いや、今に始まったことではないですが。それでイスピン専用のShow Arrmorが手に入るシークレットチャプターなるものをやってみました。チャプターで入手できるドレスは期限付きなので注意。現在やってるイベント期間をすぎると無期限に変更できなくなるのでまだ手に入れてない人はお早めに!

TWCI_2017_6_15_13_7_44.jpg

イスピンでログインしてそうそう不安になりました。・・・エフェクト以外アクア装備しか持ってないからイスピン何も装備できねぇ・・・。一応カムバック装備があるにはあるけど・・・・。

とりあえずやってみましたが戦闘は一切ありませんでした。(フラワーゼリーx3とハリネズミの針x3を集めるお使いはあった)


TWCI_2017_6_15_14_11_14.jpg

チャプター中にイスピンのドレス姿が見れます。男装もいいけどこういうドレス姿もなんかこうグッとくるものがありますね。

飛ばしまくったら数分で終わるこのチャプターですが私は敢えて飛ばさないで見てました。理由はこのゲームで唯一の楽しみだからです。レベル上げは反復のみ、狩りは全く旨味がない、そんな楽しみのなさに過疎化していくオンラインゲーム。さらに過疎化が進むということは露店も少なくなり欲しいアイテムは全て自力で手に入れなければならない。それじゃオフゲーとほとんど変わらないですよね。私としては今後の新コンテンツは200Lvくらいのキャラ、装備でもクリアできるくらいのチャプターやら外伝やらを増やしていってくれたほうがプレイする気になれます。報酬は装備でもいいですが、もう装備が一本化してるせいで全然魅力じゃないんですよね。今回みたいにShow Arrmorとかの方が俄然やる気が出ます。(もちろん無期限でね)


TWCI_2017_6_15_17_54_29.jpg

ちなみにドレスはこんな感じです。変身マントみたいに攻撃モーションがひとつしかないのがちょっと残念でした。あと今の髪型と絶望的に合ってない気がする。


TWCI_2017_6_15_18_1_20.jpg

これいつも付けてるアバター装備ですがドレスがほぼ隠れて見えない件について。 イスピンあんまりやってないからアバター装備持ってないんだよな・・・。


TWCI_2017_6_15_19_2_34.jpg

唯一持ってるアバター装備で合いそうなのはこんな感じ?と久々に本鯖にログインしてやったことはシークレットチャプターやってそれ以外にやることがないという現実を確認して終了しましたとさ。

ところでLunaの作者さんってもう開発してないのかな?2chスレにも書いてあったけど最近のtexファイルが見れないのでプライベートサーバーに反映させたいと思った時に困っちゃう。まあ反映させる気はないけど。



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

2017/06/13

経験値の最大保持数を変更してみた

2chより下記のヒントをもらいました。

Levelupを読み込んでいる処理で、
1byteで処理している箇所を2byteや4byteにすれば良い。

LV256以上にした時にログインできなくなる現象は、
エラーメッセージを出している処理で
LV255を超える場合エラーにしている箇所を変えればいける。

うん。理屈は分かります。おそらく8bitレジスタを使ってる箇所を32bitレジスタに するとかcmpの箇所だとか見ていけばいいんでしょうが

00 00 add %al,(%eax)

例えば上記の命令の引数の%al、これはaxレジスタの下位4bitの値を扱ってるそうなので これをaxレジスタに加算するように書き換えたいのですが機械語だと00 00になってるんですよね。 これどのようにバイナリを変えれば良いのか?という問題が出てきました。

このままだと読み込み関連の読み込み数が変えることが出来ません。進展しないとモチベが 下がるので何か現時点でに変えることが出来ないか考えてみました。

最大EXPを変更してみました。最大EXPは2,000,000,000で、16進数に直すと77359400です。 これをjtalesで検索してみると何箇所かあります。使ってるレジスタは全て32bitっぽいので FFFFFFFFに変えてみました。自分は面倒くさいので置き換え機能で置き換えてみましたら下記の通りになりました。

TWCI_2017_6_13_8_7_56.jpg

32bitで扱える数値は4,294,967,295までですので2,000,000,000からそんな保持できてる気が しません。しかも4,294,967,295より多くの経験値を保持しようとすると

TWCI_2017_6_13_8_8_0.jpg

なんとオーバーフローを起こします。欲を言えばもっと扱える数値を増やした いしオーバーフローを起こさないようにするにはどうすればいいのか・・・。

ところで255に関係する条件分岐って下記の通りですよね?

255と等しい。
255と等しくない。
255より大きい。 256以上
255以上(等しいまたは大きい)
255より小さい = 254以下
255以下(等しいまたは小さい)

アセンブリコードで表すと例えば 255と等しいなら
cmpl $0xff,%eax
je $0xほにゃらら

みたいな感じで見ていくと他にも変えられそうな箇所があるかと思います。アセンブリコード は結構難しいですが頑張っていきましょう。う~ん・・・ファイル読み込みの処理をもう少し調べてみるか。



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

2017/06/09

Lv256にしようとするとLv0になる!?

アセンブリの基礎勉強だけしててもしょうがないのでとりあえず一通りアセンブリコードを眺めてみました。

Levelを255で止めてるんじゃなく254までは上のレベルに上げられるという処理で追える・・・ というヒントを元に、一応LVボタンでは上げられるようになりました。

cmp $0xfe,%eax

この行がまさに254と比較しているので多分これじゃないかと思ってfe→120c(300) に変更してみました。ただし・・・

Lv255から1Lv上げると256にならずに0になる。(以降Lv上げれない)という 状況に陥ります。

EXPテーブルの読み込みが255Lvまでなので同じく300まで追加しておかないといけないので 300Lvまで追加してみました。しかしそのままじゃ起動できないのでこれもなんとかしないとなりません。

LV257の経験値設定の行を追加すると起動できないのでcmp $0x101,%eax みたいな感じで探してけば いいのかな?これはちょっと難しそう・・・。ただこれが分かればスキルや武器なども読み込める数が 増やせるようになるはずなのでがんばりたいです。(ただもうちょっとヒントが欲しい)



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

2017/06/06

jtalesを解析してみる その3

前回の続き。アセンブリコードを解析するとは言っても英単語を覚えたてで長文読解をするようなもんで、イディオムのように単語の組み合わせで意味が初めて分かるようにコードの組み合わせを理解しておくべきではないかなーと思ってよく遭遇しそうな組み合わせをまとめてみました。

If 文のコンパイル

if 文は je 命令を使って実現される。C言語などでif文を表現すると下記の通り。

if (i > 0)
  i = 1;
else
  i = 2;
return i;

このプログラムをコンパイルすると下記のようなアセンブリコードが吐き出される。

cmpl $0, %edx
je L1 
jmp L2
L1:
文 i = 2 (else 部分) のコンパイル結果
L2:
return i (if の次の文) のコンパイル結果

比較演算子の計算結果もレジスタ %edx に書き込まれる。そこで %edx と 0 を比較して同じなら else に分岐し、そうでなければ then 部を実行する。C 言語では 0 が false で、0 以外が true である。

配列変数のコンパイル

局所変数として int a[10]; と宣言した場合、a[i] の内容をレジスタ %edx に読み出すためのコードは、下記の通り。

movl 変数 i の値, %edx
shll $2, %edx # 左へ 2bit シフトで 4 倍
movl %ebp, %ecx
subl $44, %ecx
addl %ecx, %edx
movl 0(%edx), %edx

上のコードははじめの2行で、配列の添字 (offset) の値を4倍して、a[0]用に割り当てられたメモリのアドレスから、何bytes離れたところに a[i] 用のメモリが割り当てられているか計算する。3-5 行目は、a[i]用に割り当てられているメモリのアドレスを求めている。例では a[0] はスタック・フレームの末尾から 12 番目なので、 $ebp - 44 の値が a[0] のアドレスである。a[i] はこれに i の 4 倍を足し合わせたものである。

ループのコンパイル

while 文のコンパイルは if 文のコンパイルとそれほど違いはなく、分岐がわずかに複雑になるだけである。

while (i < n) {
  i = i + 1;
}
return i;
このプログラムは例えば次のようにコンパイルすればよい。

L1:
式 i < n のコンパイル結果 (%edx に結果が保存される)
cmpl $0, %edx
je L2
文 { i = i + 1; } のコンパイル結果
jmp L1
L2:
文 return i のコンパイル結果
L1, L2 はラベルである。while 文の制御構造をそのまま分岐命令に置きかえているので分かりやすそう。

もうひとつのwhile文のコンパイル方法
jmp L2
L1:
文 { i = i + 1; } のコンパイル結果
L2:
式 i < n のコンパイル結果 (%edx に結果が保存される)
cmpl $0, %edx
jne L1
文 return i のコンパイル結果

分岐命令 jne は jump on not equal の意味で、0 (zero) と %edx のが等しくなければ L1 に分岐する。

for文のコンパイル
for (i = 0; i < n; i = i + 1) {
 j = j + 1;
}
return i;

このプログラムは例えば次のようにコンパイルすればよい。
文 i = 0; のコンパイル結果
L1:
式 i < n のコンパイル結果 (%edx に結果が保存される)
cmpl $0, %edx
je L2
文 { j = j + 1; } のコンパイル結果
文 i = i + 1 のコンパイル結果
jmp L1
L2:
文 return i のコンパイル結果

基本は while 文のコンパイルと同様である。また while 文でしたような工夫をすれば、for 文もループ一回あたりの分岐命令の数を減らすことができる・・・らしい

OS/Programmingより引用)

う~ん・・・ここまで載せた情報を踏まえて適当にjtales流し読みしてみると、レジスタ計算して値を比較して条件にあったらジャンプ命令を実行する・・・みたいな箇所が多いですね。dateコマンドを使わないと数秒で蔵落ちしてしまう問題はおそらくtickの値を入れてる変数が扱える値(ビット数?)が小さいのが原因だと考えてるので検索を掛けてみたのですが・・・tickで調べると該当箇所が多すぎ(笑) む~・・・これは骨が折れそうだ。

ひとまずtickのことは置いておいて・・・2chスレでちらっと話題に出てたLevelManagerにでも手を出してみようかとおもいます。



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

2017/06/06

jtalesを解析してみる その2

アセンブリ言語の解析をやる上で押さえておいたほうが良さそうなことをまとめてみました。

レジスタ
ebp : 関数のアドレスを確保するのに使用する主なレジスタ
esp : 関数のアドレスをebpに移すために一時的に使うレジスタ
eax/ax/al/ah : アキュムレータレジスタ。算術演算操作の結果が格納される。
ecx/cx/cl/ch : カウンタレジスタ。シフトローテート命令?とループ命令に使用される。
edx/dx/dl/dh : データレジスタ。算術演算操作とi/o操作?に使用される。
ebx/bx/bl/bh : ベースレジスタ。セグメントモードでのds(データへのポインタ)に格納されたデータを指し示すために使用される。
esi/si : ソースレジスタ。ストリーム操作でのソースへのポインタとして使用される。
edi/di : デスティネーションレジスタ。ストリーム操作でのデスティネーションへのポインタとして使用される。

レジスタによって扱えるビット数が違うらしい
32ビット: eax、ecx、edx、ebx(80386以降で拡張され使用可能)
16ビット: ax、cx、dx、bx
8ビット: al、cl、dl、bl(ax、cx、dx、bxのlsb?側8bit)
8ビット: ah、ch、dh、bh(ax、cx、dx、bxのmsb?側8bit)

(上記レジスタの情報はWikiより)

うん、ポインタとか懐かしい響き。

各種命令

ロードとストア

movl (%<src>), %<dest>
レジスタ %<src> の値に offset を足したアドレスのメモリの内容 32bit (1 word)分を、レジスタ %<dest> に読み込む。オフセット付きレジスタ間接アドレッシングによる

movl %<src>, (%<dest>)
レジスタ %<dest> の値に offset を足したアドレスに、レジスタ %<src> の内容 32bit (1 word)分を書き込む。オフセット付きレジスタ間接アドレッシングによる

movl $<integer>, %<dest>
をレジスタ %<dest> に書き込む。 load immediate (ロード即値)命令。

movl %<src>, %<dest>
レジスタ %<src> の値をレジスタ %<dest> に書き込む。

pushl %<r>
レジスタ %<r> の値をスタックに積む。 つまり、レジスタ %esp の値 - 4が指すアドレスにレジスタ %<r> の値を書きこみ、%esp の値を -4 増やす。

演算命令

addl %<r>, %<s>
レジスタ %<r> とレジスタ %<s> の値を加算した結果を、レジスタ %<s> に書き込む。

subl %<r>, %<s>
レジスタ %<s> からレジスタ %<r> の値を減算した結果を、レジスタ %<s> に書き込む。 引かれる数がレジスタ %<s> であることに注意。

imull %<r>, %<s>
レジスタ %<r> とレジスタ %<s> の値を乗算した結果を、レジスタ %<s> に書き込む。

cmpl %<r>, %<s>
レジスタ %<r> とレジスタ %<s> の値を比較し、結果を条件レジスタに書きこむ。 %<r> > %<s> なら less、%<r> < %<s> なら greater である。

分岐命令

je

jl

jmp

call

ret
次の命令のアドレスをスタックから pop し、そこへ分岐する。 Return 命令。

leave
%ebp の値を %esp にコピーし、スタックから pop した値を %ebp に保存する。

関数呼び出しに必要な命令

スタック(PUSH・POP命令)
スタック は、引数やローカル変数の保持など一時的に保存するのに使われる。
スタックに対してできる操作は、PUSHとPOPの2つ。 PUSHで、データをスタックに積み(スタックではデータを格納することを「積む」ともいう)、POPで、データを取り出す(一番最後に格納したデータが取り出されることです。)
イメージしやすい一例として四角い箱(スタック)にちょうど収まるような大きさの紙(データ1から順に1,2,3とします)を順に積んでいきます。(PUSH)そしてその四角い箱から紙を2枚取り出す(POP)場合、四角い箱の一番上に入ってる紙はデータ1です。

アセンブリの記述方法
SolarisはLinuxなのでAT&T記法と呼ばれる方法で記述される。
[ニーモニック] [操作元] [操作先]

ところでアセンブリ言語を解析しようとしている人がもしいたならまずC言語などのプログラミング言語をある程度できるようになってから挑戦した方がいいと思います。変数ってなに?条件分岐?関数??アドレス???となってしまうのはよくあることなので(汗)

とりあえずこれくらい覚えておけば多少は読めるかな~。解析してる最中わからない所があればまたグーグル先生にでも聞くとします。



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!

2017/06/05

404蔵で未実装キャラを追加してみた


やり方は動画内に書いてあるのでやってみたい人は自分で試してみて下さい。(あとで編集する気力があればこの記事に追加するかも分かりません)

今回実装したキャラクター
クロエ、ランジエ、イザーク、ハゲイス、ベンヤ

まあ、実装したと言ってもフィールドで歩行走行、魔法スキルが撃てるくらいなもんですが・・・まだ誰もスキルエフェクトIDを追加する方法を公開できていないので、しばらくはハリボテ状態になってしまいますね。

どのキャラも魔法スキル撃つだけなら戦えますのでエフェクトID追加ができなかったら最悪、劣化テチ、真魔プレイを余儀なくさせられるでしょう。(実装した5キャラのうち唯一ベンヤのみが中級以上の魔法が使えない)

さて最近はjtalesの解析の方に力が行っていますがこれと言った成果がまだありません。それもそのはず、アセンブリコードが全くと言っていいほど分かってませんからね(汗) しばらくはアセンブリコードの勉強です・・・ただ命令1個1個覚えても解析できるかって言われると多分無理だと思うので要所要所をかいつまんでいくようにします。(例えば関数の始まりの部分だとか)



もしよろしければ私のモチベーションアップの為にチャンネル登録お願いします!