SimpleROHook : クライアントの構造体定義の修正を少々

2015年4月20日

all morroc地獄絵図です。

やや体調が戻りつつあるので、少しずつSimpleROHookのコードに手を加えていきます。

解析のアプローチ

CRenderObject::RenderShadowの関数の冒頭に以下のような場所がありCRenderObjectクラスの終端に定義されている変数が判明します。

.text:00790D60 ; int __stdcall CRenderObject::RenderShadow(int vtm, float zoom)
.text:00790D60 CRenderObject__RenderShadow proc near   ; CODE XREF: CGameActor::Render
.text:00790D60                 push    ebp
.text:00790D61                 mov     ebp, esp
.text:00790D63                 sub     esp, 5Ch
.text:00790D66                 push    esi
.text:00790D67                 mov     esi, ecx
.text:00790D69                 cmp     dword ptr [esi+104h], 235h ; dummy01???
.text:00790D73                 jz      loc_791065
.text:00790D79                 cmp     byte ptr [esi+9Ch], 0 ; m_shadowOn
.text:00790D80                 jz      loc_791065
.text:00790D86                 fld     dword ptr [esi+4Ch] ; m_shadowZoom
.text:00790D89                 fldz
.text:00790D8B                 fld     st

object.hに定義した以下の所は碌に解析もせずに void* dummy01等と適当な名前で定義していましたがobject classのような数字を比較して影を出さないような処理をしているっぽいなという事が見て取れます。

class CRenderObject : public CGameObject  {
public:
	struct vector3d m_pos;
	std::basic_string<char> m_bodyPaletteName;	// class std::basic_string<char,std::char_traits<char>,std::allocator<char> > m_bodyPaletteName;
	int m_baseAction;
	int m_curAction;
		.
		.
		.
		.
	unsigned char m_BodyAct;
	unsigned char m_BodyAniFrame;
	class CSprRes* m_sprRes;
	class CActRes* m_actRes;

	void* dummy01; // added for later HightPrieast.exe?
#ifdef JRO_CLIENT_STRUCTURE
	unsigned long m_gid;
#endif

リプレイ中の各々のCGameActorのオブジェクトにJobSet(0x0235)を実行(※)させてみたところ…

※CPlayerのクラスポインタが判明しているため、制御する関数のアドレスと引数が分かれば呼び出すことが出来ます。

change job to 0x0235

MVPの墓だったことが判明しました。これを除外するためにjob classのコピーをCRenderObjectに設置してハードコーディングしているというのもおかしな話ですが、それぞれのシーンで値を調査してもPCオブジェクト以外の場合にCGameActor::m_jobのコピーが設定されています。

これに伴い、CRenderObject::dummy01としていたものをCRenderObject::m_npcIdと改めました。

基本は以上の様に目視によるデータ差分、詳細が不明ならば機械語コードを読んで行き、動作を読み取っていきます。当サイトで紹介した IDA のようなツールを使ってラベル付けや構造体定義などをしていくと解析が容易になります。

SimpleROHook リポジトリの更新

流石に今の様ないい加減な定義では今後解析する人が辛いだろうと思い、CRenderObject、CAbleToMakeEffect、CGameActorの定義を更新しました。

変更箇所はgithubで確認できます。

https://github.com/sekishi1259/SimpleROHook/commit/cf160e2a1d32e1bc68369bf8d587dcea779632fd

おわりに

跡地の実行ファイル一式も更新してあります。

こまかな解説はまた別の機会にするとして、やる気のある方はデータとにらめっこして見ては如何でしょう?

jROのexeがUnpack出来ないという人はこの辺りを参考にして下さい。

当サイトでは諸事情により、この事に関する解説は出来ません。