呪われた土地-より良いランニングとチームメイトとの経験







多くの人がこの素晴らしいゲームをプレイしました。 興味深いプロット、良い音楽、良いゲームプレイ。 気に入らない点がいくつかあります。 キャラクターの走りはほんの数秒で非常に限られており、力の供給は長い間回復します。 経験を蓄積するシステムは、経験をすべての人に平等に分配するため、パートナーの取得を刺激しません。すべての経験を自分のものにするために単独で実行する方がよいためです。 デバッガーを取り、修正してみてください。



ArtMoney、IDA、Hiewが必要になります。



アクションには複雑なものはありません。主な結果はここにあります。 バージョン1.07のオフセットが提供されます。



IDAを実行し、game.exeファイルをロードして、分析が完了するまで待ちます。 スターターを起動し、設定「フルスクリーンモード」を削除します。 デバッガーでゲームを開始し、既にパートナーを取得できる場所にセーブをロードします。 パートナーを連れて地図に行きます。









ランニング



キャラクターにどれだけの力があるかを調べます。 ここでは54です。ArtMoneyを起動します。 この値を探しています。 「4バイトのポイントで」と入力します。 少し実行して、新しい値を取り除きます。 必要なだけ繰り返すと、すぐに1つの値が残ります。







ランニング中に筋力の供給が回復した場合、フリーズしようとしていますが、それは正しく見つかりました。 後で削除するだけです。 実行モードをオンにします。 ゲームを一時停止(スペース)にします。



IDAのエントリのこのアドレスにブレークポイントを配置します。 この前に、「一時停止プロセス」を実行する必要があります。そうしないと、クラッシュが発生します。 ゲームに切り替え、キャラクターをある時点まで送り、一時停止を解除します。



ブレークポイントがトリガーされます。



.text:00548315 loc_548315: .text:00548315 fld dword ptr [edi+14h] .text:00548318 fld dword ptr [edi+18h] .text:0054831B fmul ds:dbl_73F088 .text:00548321 fsubp st(1), st .text:00548323 fst dword ptr [edi+14h] .text:00548326 > fcomp ds:flt_73B858 .text:0054832C fnstsw ax .text:0054832E test ah, 1 .text:00548331 jz short loc_548388
      
      





記録は、命令fst dword ptr [edi+14h]



ます。 オペランドタイプ-浮動小数点をこのアドレスと隣接する[edi+18h]



ます。







値から判断すると、そこに保存されます。



[edi+14h]



-現在の値

[edi+18h]



-最大値



キャラクターの最大パワーリザーブに定数dbl_73F088



が乗算され、結果が現在の値から減算されていることがdbl_73F088



ます。 したがって、すべてのキャラクターは同じ方法で実行されます。



 .rdata:0073F088 dbl_73F088 dq 6.666666666666666e-3 ; 6.666666666666666e-3 = 0.006666666666666666 = 1/150
      
      





つまり、キャラクターは約150の「ステップ」を実行できますが、減算はより頻繁に発生するため、これらはアニメーションで表示できる正確なステップではありません。 部隊の全予備力は9〜10秒で消費されます。つまり、減算は毎秒15〜16.66回と呼ばれます。



ほとんどの場合、これらはパスを示す緑の点です。









バイトで、この定数は次のように記述されます。



 4E 1B E8 B4 81 4E 7B 3F
      
      





Hiewでgame.exeを開き、アドレス「.73F088」に移動します。







このような値を持つ定数は他にありません。その値へのリンクは、考慮されるコード内にのみあります。 必要な値に変更できます。 自分を3倍小さくしました。

(1/150)/ 3 = 1/450 = 0.002222222222222222222



float / doubleを16進数表現に変換するには、オンラインコンバーターを使用できます(例:)



参考のため
 0.0066666666666666667 - 0x3F7B4E81B4E81B4F 0.006666666666666666 - 0x3F7B4E81B4E81B4E 0.0022222222222222222 - 0x3F623456789ABCDF 0.002222222222222222 - 0x3F623456789ABCDE
      
      







美しい数字0x3F623456789ABCDF







 DF BC 9A 78 56 34 62 3F
      
      





置換、保存、実行。 まあ、それははるかに良いです。



体験



これはもう少し複雑です。 明示的に保存されません。 関連する値を検索する必要があります。 ただし、同じ方法で開始します。



キャラクターにどれだけの経験が表示されるかを確認します。 これはカード間で行うことができます。 116個あります。









この値を探しています。 ここでは、「整数4バイト」タイプが必要です。



これはソース変数ではなく、intにキャストされた計算値です。 エクスペリエンス自体はフロートに保存されますが、別の意味があります。詳細は以下をご覧ください。



今、あなたは誰かと戦うことができます。 経験を見るためにカードを離れることはできません。また、メモリが再び割り当てられるため、再起動もできません。また、カードを再入力すると、他のアドレスがあります。 心に追加する必要があります。 この場合、丸めを考慮する必要があります。 つまり、対戦相手に5ポイントの経験値が与えられ、チームに2人のキャラクターがいる場合、画面に経験値2が表示されますが、2.5を追加して全体を占める必要があります。









数回繰り返した後、同期的に変化する6つの値が残っています。







各アドレスのレコードにブレークポイントを設定してみましょう。 「一時停止プロセス」を忘れないでください。



最初のアドレスが適切です。 残りはrep movsd



によってトリガーされます。



 .text:00522D00 fld dword ptr [ebx+700h] .text:00522D06 fadd dword ptr [ebx+4] .text:00522D09 fsub dword ptr [ebx+8] .text:00522D0C fstp [ebp+var_10] .text:00522D0F fld [ebp+var_10] .text:00522D12 fistp [ebp+var_C] .text:00522D15 mov edx, [ebp+var_C] .text:00522D18 mov [edi+8], edx .text:00522D1B > mov eax, [ebx+10h] .text:00522D1E mov [ebp+var_10], eax
      
      





走ったり、キャラクターと戦ったりするとトリガーされます。 したがって、混乱しないように、グループではなく1つだけを管理することをお勧めします。 ebx



では、キャラクターのオブジェクトのアドレスです。 [ebx+700h]



0です。



値を見てみましょう。







387-271 = 116



これは得られた経験であり、現在の経験がそれらの差として計算されると仮定できます。



ゲームが数回クラッシュしたため、コードにブレークポイントを設定し、保存からロードしました。 したがって、120ではなく116です。しかし、これは推測を確認するだけです。



[ebx+4]



新しいブレークポイントを設定します。



グループ全体を選択して、敵を攻撃します。









ブレークポイントは、画面に表示される前にトリガーされます。



 .text:005239D7 fld ds:dbl_73E128 .text:005239DD fld dword ptr [esi+20h] .text:005239E0 fsub ds:flt_73E124 .text:005239E6 call __CIpow .text:005239EB fmul [ebp+arg_4] .text:005239EE fadd dword ptr [esi+700h] .text:005239F4 fcom ds:flt_73B858 .text:005239FA fst dword ptr [esi+700h] .text:00523A00 fnstsw ax .text:00523A02 test ah, 41h .text:00523A05 jnz short loc_523A19 .text:00523A07 fadd dword ptr [esi+4] .text:00523A0A mov dword ptr [esi+700h], 0 .text:00523A14 fstp dword ptr [esi+4] .text:00523A17 > jmp short loc_523A1B
      
      





[esi+4]



、経験の新しい意味。 [ebp+arg_4]



数値は2.0です。 若いイノシシの場合、4.0が与えられます。つまり、除算は関数が呼び出される前です。



Ctrl + F7で機能を終了します。 これはラッパーです。もう一度登場します。



少し高く見えますが、そのようなコードがあります。



 .text:00591521 loc_591521: .text:00591521 fild [ebp+var_18] .text:00591524 xor esi, esi .text:00591526 cmp eax, edi .text:00591528 mov [ebp+var_14], esi .text:0059152B fdivr [ebp+arg_4] .text:0059152E fstp [ebp+arg_4] .text:00591531 jle short loc_5915A5 .text:00591533 jmp short loc_591537
      
      





ブレークポイントを00591521



設定して、再び戦闘に参加します。



fdivr



は引数をst(0)



除算し、結果をst(0)



書き込みます: st(0) = arg / st(0)



st(0)



は値[ebp+var_18]



、これには2-文字数が含まれます。 [ebp+arg_4]



は4.0です-敵の経験。 ミッションを完了すると、ここでも発生が発生します。



また、参加者数による区分はより高くなります。



 .text:00591324 fdiv [ebp+var_18]
      
      





しかし、このコードがいつ実行されているかはわかりませんでした。 そこでは触れません。



これで、Hiewを通じて部門のコードを削除できます。 fdivr



fdivr



により、3つのコマンドすべて(9バイト)をnop



fdivr



置き換えます。



 ;  .00591521: DB45E8 fild d,[ebp][-018] .00591524: 33F6 xor esi,esi .00591526: 3BC7 cmp eax,edi .00591528: 8975EC mov [ebp][-014],esi .0059152B: D87D0C fdivr d,[ebp][00C] .0059152E: D95D0C fstp d,[ebp][00C] .00591531: 7E72 jle .0005915A5 .00591533: EB02 jmps .000591537 ;  .00591521: 909090 nop .00591524: 33F6 xor esi,esi .00591526: 3BC7 cmp eax,edi .00591528: 8975EC mov [ebp][-014],esi .0059152B: 909090 nop .0059152E: 909090 nop .00591531: 7E72 jle .0005915A5 .00591533: EB02 jmps .000591537
      
      





キャラクターは正常に動作し、電力の供給は無限ではなく、スペルは通常どおり消費され、ゲームの仕組みは維持されます。 また、パートナーは独自の経験を得て、開発に費やすことができます。



行こう!



All Articles