ということで、コーディングを進めました。
とりあえず、
① artLegacyMUL.uopのファイルマッピングページをVirtualQuery()でプロセスメモリ内から見つける
② 上記ページをVirtualProtect()でPAGE_WRITECOPY属性にする
③ artLegacyMUL.uopのインデックス情報を全て読みだしてみる&ちょこっと書き換えてみる
④ VirtualProtect()でページ属性を元の属性に戻しておく
⑤ ログイン
⑥ 終了
⑦ artLegacyMUL.uopが書き変わっていないことを確認
までは確認してみました。
あとは、どのインデックスを、どの情報に書き換えるか、を準備してhookdllに食わせるだけでうまくいくと思う。多分、、、
元のソースコードは言語はC#で、文字列→ハッシュ→辞書(連想配列)→UOPファイルとしており、C++ STLでいうところのmapを使用して実装しているのですが、hookdllはCで書いているためmapに該当するコードを書き加えるのがめんどっちいから、文字列からのハッシュ値で判定するようになると思います。
ハッシュ関数への入力文字列ですが、printfフォーマットで言うと"build/artlegacymul/%08d.tga" (よくこんなのみつけたな)で、このハッシュのシード(?)が舐めてますw 0xdeadbeef www
(しばらくプログラミングから離れていたので、用語が間違っているかもしれませんがご容赦ください)
追記: 上記は%08x.tga??? あれれ、該当するIDが見つからない><
2013年8月16日金曜日
2013年8月15日木曜日
画像変換のアルゴリズム
これでいける、かな???
(1) あらかじめ、被変換画像IDと変換画像IDを調べておく
(2) さらに、(1)の被変換画像IDと変換画像IDに対応するハッシュIDを調べておく
(3) さらにさらに、(1)の変換画像IDのエントリー情報をartLegacyMUL.uopから抜き出しておく
(4) uoclistのAttachボタンを押す
(5) hookdll内で、artLegacyMUL.uopのファイルマッピング位置を特定
(6) artLegacyMUL.uopの解析/書換開始
(7) ハッシュIDが(2)の被変換画像のハッシュIDと同じだったら、(3)で抜き出しておいたエントリー情報に書き換える
(8) artLegacyMUL.uopの解析/書換終了
(9) ログイン
ログイン前にartLegacyMUL.uopの内容をクライアントが読み出していてキャッシュに保存していなければ、これで成功しそうな気がするんだけど。。。
(1) あらかじめ、被変換画像IDと変換画像IDを調べておく
(2) さらに、(1)の被変換画像IDと変換画像IDに対応するハッシュIDを調べておく
(3) さらにさらに、(1)の変換画像IDのエントリー情報をartLegacyMUL.uopから抜き出しておく
(4) uoclistのAttachボタンを押す
(5) hookdll内で、artLegacyMUL.uopのファイルマッピング位置を特定
(6) artLegacyMUL.uopの解析/書換開始
(7) ハッシュIDが(2)の被変換画像のハッシュIDと同じだったら、(3)で抜き出しておいたエントリー情報に書き換える
(8) artLegacyMUL.uopの解析/書換終了
(9) ログイン
ログイン前にartLegacyMUL.uopの内容をクライアントが読み出していてキャッシュに保存していなければ、これで成功しそうな気がするんだけど。。。
ラベル:
UOClist開発
画像変換の学習
うらうらツールの画像変換、僕も使ってました。木とかサボテンを切り株に変換して動きやすくするために。
ところが、復帰してみたら使えなくなってました><
mulフォーマットがuopフォーマットに置き換わって、もうmulフォーマットでのアップデートはしないみたい。
なので、InsideUOなんかはもう動きませんね。
その後継ツールとしてのUoFiddlerは対応している模様。
UoFiddlerでart.mul/artidx.mulの内容を見ると、なるほど、過去のインデックス最大値だった0x3ffe(だったかな)の馬以降にもグラフィックが追加されています。要するにインデックス容量が足りなくなったので、(開発陣としては仕方なく?)フォーマット変更に踏み切ったというところでしょうか?
ではどうしたら?とちょこっと調べてみると
こちら
のLegacyMULConverter-v4.rarを利用しろ、ということらしいです。
幸いにも、ソース付きです^^
さすがRunUO!!!
ちょろっとソースコードを斜め読みしたところ、uoclistにも利用できそうです。
さて復習。
mulフォーマットの仕様はこちら。
artidx.mulのフォーマットを抜き出すと
うろ覚えなんだけど、artidx.mulのファイルサイズは12*0x4000で固定値、0から順番にインデックスを割り振り、各インデックスのバイト数は12、先頭4バイトがart.mulに格納されている画像データのオフセット値(上記Lookup)、次の4バイトがデータサイズ(Size)、になる。
なので、mulフォーマットベースで単純に切り株変換したい場合には、artidx.mulのLookupを変換させたい画像のオフセット値に書き換え、Sizeを変換させたい画像のデータサイズに書き換えるだけでよい、だったよな~?
あとはどうやって変換作業を実施するかだなぁ。うらうらツールと同じようにGUIで作業できることが理想だけど、無理っす><単純に被変換/変換のIDを書いたテキストファイルを実行時に読み込む、でいいよね???
ところが、復帰してみたら使えなくなってました><
mulフォーマットがuopフォーマットに置き換わって、もうmulフォーマットでのアップデートはしないみたい。
なので、InsideUOなんかはもう動きませんね。
その後継ツールとしてのUoFiddlerは対応している模様。
UoFiddlerでart.mul/artidx.mulの内容を見ると、なるほど、過去のインデックス最大値だった0x3ffe(だったかな)の馬以降にもグラフィックが追加されています。要するにインデックス容量が足りなくなったので、(開発陣としては仕方なく?)フォーマット変更に踏み切ったというところでしょうか?
ではどうしたら?とちょこっと調べてみると
こちら
のLegacyMULConverter-v4.rarを利用しろ、ということらしいです。
幸いにも、ソース付きです^^
さすがRunUO!!!
ちょろっとソースコードを斜め読みしたところ、uoclistにも利用できそうです。
さて復習。
mulフォーマットの仕様はこちら。
artidx.mulのフォーマットを抜き出すと
3.2 ARTIDX.MUL
This file contains an index into ART.MUL. To load a specific tile number in ART.MUL, simply seek BNum * 12, read in the index tile data and use Lookup to find the tile within ART.MUL.
ARTIDX.MUL
Index Record (12 bytes)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B |
| Lookup | Size | Unknown | |||||||||
DWORD Lookup - Is either undefined ($FFFFFFFF -1) or the file offset in ART.MUL
DWORD Size - Size of the art tile
DWORD Unknown - Unknown
DWORD Size - Size of the art tile
DWORD Unknown - Unknown
うろ覚えなんだけど、artidx.mulのファイルサイズは12*0x4000で固定値、0から順番にインデックスを割り振り、各インデックスのバイト数は12、先頭4バイトがart.mulに格納されている画像データのオフセット値(上記Lookup)、次の4バイトがデータサイズ(Size)、になる。
なので、mulフォーマットベースで単純に切り株変換したい場合には、artidx.mulのLookupを変換させたい画像のオフセット値に書き換え、Sizeを変換させたい画像のデータサイズに書き換えるだけでよい、だったよな~?
あとはどうやって変換作業を実施するかだなぁ。うらうらツールと同じようにGUIで作業できることが理想だけど、無理っす><単純に被変換/変換のIDを書いたテキストファイルを実行時に読み込む、でいいよね???
ラベル:
UOClist開発
2013年8月14日水曜日
2013年8月12日月曜日
休みに入ったので
この暑さだと、日中は外に出たくないのでこもりっきり><
UOClistのバグがモリモリあったので直してました。(まだ全部直しきれてないと思う)
ゲーミングマウスとして昔使っていたLogitechのMX510を引っ張り出してきて、サイドボタンを活用できるように改良したり。
あとは、BO対策として青りんごの時間制限に引っかからなければBO後すぐに食べるようにしたり、ルートアイテム対象をゴリゴリハードコーディングして追加したり、くらいですね。
開発は、自分の遊び方の範囲で拡張しているので、その遊び方の範囲が狭いと安定期に入ってしまいます。
私の白豚のアクセはcursedなため、失うのが怖いので、まだまだ活動範囲が狭いです。
久しぶりにDOOM対岸に行ってみたいのですがねぇ、、、劣化版アクセで行ってみようかしらん。
UOClistのバグがモリモリあったので直してました。(まだ全部直しきれてないと思う)
ゲーミングマウスとして昔使っていたLogitechのMX510を引っ張り出してきて、サイドボタンを活用できるように改良したり。
あとは、BO対策として青りんごの時間制限に引っかからなければBO後すぐに食べるようにしたり、ルートアイテム対象をゴリゴリハードコーディングして追加したり、くらいですね。
開発は、自分の遊び方の範囲で拡張しているので、その遊び方の範囲が狭いと安定期に入ってしまいます。
私の白豚のアクセはcursedなため、失うのが怖いので、まだまだ活動範囲が狭いです。
久しぶりにDOOM対岸に行ってみたいのですがねぇ、、、劣化版アクセで行ってみようかしらん。
ラベル:
UOClist開発
2013年8月4日日曜日
2アカでTデスパやってみた
ケンタウルス×2でボス戦に30分位かかった。
目的のDespicableQuiverが一回目で出たからよかった(物理+10だけど)^^;;;
次もやろうって気にならないなぁ。。。
目的のDespicableQuiverが一回目で出たからよかった(物理+10だけど)^^;;;
次もやろうって気にならないなぁ。。。
ラベル:
UOClist開発
登録:
投稿 (Atom)