[Hack] IPSwitch

IPSwitch

移植はIDAかGHIDRAを使います。

タダなのでGHIDRAがお手軽で便利、オフセットはめんどくさいけれど。

Code

まだコード化してないので該当箇所っぽいところのバイナリを載せます。

メモみたいな感じなので、これを使ってみんななんとかしてくれ!!

ちなみにIPSwitch形式のアドレスに変換してあるのでGHIDRAでサーチする場合はアドレスをズラしてください。

多分このへんは4.6.1か4.5.0あたりのコード。

SpecialCost

loc_856A0
LDR             X1, [SP,#0x6C0+var_660]
ADRP            X2, #aSpecialcost@PAGE ; "SpecialCost"
SUB             X0, X29, #-var_C8
ADD             X2, X2, #aSpecialcost@PAGEOFF ; "SpecialCost"
STR             X19, [SP,#0x6C0+var_468]
BL              sub_19912E0
ADRP            X2, #aLock@PAGE ; "Lock"
SUB             X0, X29, #-var_C8
ADD             X1, SP, #0x6C0+var_468
ADD             X2, X2, #aLock@PAGEOFF ; "Lock"
STR             WZR, [SP,#0x6C0+var_26C]
BL              sub_1991178
MOV             W22, WZR

InkConsume

loc_13B1D20
MOV             W8, #0x12D0
ADD             X20, X19, X8
ADRP            X8, #aMinkconsumeCoo@PAGE ; "mInkConsume_Coop"
ADD             X8, X8, #aMinkconsumeCoo@PAGEOFF ; "mInkConsume_Coop"
STR             X8, [X19,#0x12E0]
ADD             X8, X21, #0x10
STR             X8, [X19,#0x12D0]
LDR             X8, [X19]
STR             XZR, [X19,#0x12D8]
STR             WZR, [X19,#0x12F8]
STR             XZR, [X19,#0x12F0]
STR             XZR, [X19,#0x12E8]
LDR             X8, [X8,#0x128]
MOV             X0, X19
MOV             X1, X20
BLR             X8
LDR             X8, [X19,#0x12D0]
LDR             X8, [X8,#0xD8]
LDR             W24, [X19,#0x12F8]
MOV             X0, X20
BLR             X8
TBNZ            W24, #9, loc_13B1E54

App Version

loc_95A28
MOV             W10, #0xC
MADD            X10, X20, X10, XZR
LDR             W8, [X19,#8]
LDR             X9, [X19,#0x10]
ADD             X10, X9, X10
CMP             X8, X20
CSEL            X24, X10, X9, HI
ADRP            X2, #aAppversion@PAGE ; "AppVersion"
ADD             X0, SP, #0xA0+var_70
MOV             X1, X24
ADD             X2, X2, #aAppversion@PAGEOFF ; "AppVersion"
BL              sub_19912E0

3.1.0

LocalDifficulty

sub_E5110 
CMP             W0, #0x63
MOV             W8, #5
MOV             W9, #0xA
CSEL            W8, W9, W8, GT
MOV             W9, #0xC8
ADD             W8, W8, W0
CMP             W8, #0xC8
CSEL            W8, W9, W8, GT
TST             W1, #1
CSEL            W0, W0, W8, EQ
RET
__int64 __fastcall Cmn::Def::Coop::UpdateLocalDifficulty(__int64 result, char a2)
{
  signed int v2; // w8
  signed int v3; // w8

  if ( (signed int)result <= 99 )
    v2 = 5;
  else
    v2 = 10;
  v3 = v2 + result;
  if ( v3 > 200 )
    v3 = 200;
  if ( a2 &amp; 1 )
    result = (unsigned int)v3;
  else
    result = (unsigned int)result;
  return result;
}

Tank

// starts at 35DB8
SUB             SP, SP, #0x20
STP             X29, X30, [SP,#0x10+var_s0]
ADD             X29, SP, #0x10
ADRP            X8, #off_4155FD0@PAGE
LDR             X8, [X8,#off_4155FD0@PAGEOFF]
ADD             X8, X8, #0x10
STR             X8, [SP,#0x10+var_10]
ADRP            X8, #aTnkCoop@PAGE ; "Tnk_Coop"
ADD             X8, X8, #aTnkCoop@PAGEOFF ; "Tnk_Coop"
MOV             X1, SP
STR             X8, [SP,#0x10+var_8]
BL              _ZNK3Cmn12MushTankInfo12searchByNameERKN4sead14SafeStringBaseIcEE ; Cmn::MushTankInfo::searchByName(sead::SafeStringBase<char> const&amp;)
LDR             W0, [X0]
LDP             X29, X30, [SP,#0x10+var_s0]
ADD             SP, SP, #0x20
RET

Costume

// starts at A4390
STR             X23, [SP,#-0x10+var_30]!
STP             X22, X21, [SP,#0x30+var_20]
STP             X20, X19, [SP,#0x30+var_10]
STP             X29, X30, [SP,#0x30+var_s0]
ADD             X29, SP, #0x30
ADRP            X21, #off_41565A8@PAGE
LDR             X21, [X21,#off_41565A8@PAGEOFF]
LDR             X8, [X21] ; Cmn::MushDataHolder::sInstance
MOV             X19, X0
LDR             X0, [X8,#0x38]
MOV             X20, X1
AND             X23, X20, #0xFFFFFFFF
MOV             X1, X23
BL              _ZNK3Cmn12MushGearInfo19searchIdCoopUniformENS_3Def8GearKindEi ; Cmn::MushGearInfo::searchIdCoopUniform(Cmn::Def::GearKind,int)
LDR             X8, [X21] ; Cmn::MushDataHolder::sInstance
LDR             X21, [X8,#0x38]
MOV             W22, W0
MOV             X0, X21
MOV             X1, X23
MOV             W2, W22
BL              _ZNK3Cmn20MushInfoWithKindBaseINS_8GearDataENS_3Def8GearKindEE7getByIdES3_i ; Cmn::MushInfoWithKindBase<Cmn::GearData,Cmn::Def::GearKind>::getById(Cmn::Def::GearKind,int)
CBNZ            X0, loc_A4430

Packet

// starts at 208D1C
MOV             W8, #2
STRB            W8, [X0]
ADD             X8, X0, #0x14
STRB            WZR, [X0,#0x11]
MOV             W2, #0x54
STUR            XZR, [X0,#9]
STUR            XZR, [X0,#1]
MOV             X0, X8
MOV             W1, WZR
B               .memset
{
  *(_BYTE *)this = 2;
  *((_BYTE *)this + 17) = 0;
  *(_QWORD *)((char *)this + 9) = 0LL;
  *(_QWORD *)((char *)this + 1) = 0LL;
  return memset((char *)this + 20, 0LL, 84LL);
}

GotIkura

タマヒロイが金イクラを回収していく挙動の関数。

// starts at 4F236C
LDR             W8, [X0,#0x9D4]
ADD             W8, W8, W1
STR             W8, [X0,#0x9D4]
CMP             W1, #1
B.LT            locret_4F23AC

SUB             SP, SP, #0x20
STP             X29, X30, [SP,#0x20+var_10]
ADD             X29, SP, #0x20+var_10
LDR             X0, [X0,#0x320] ; this
ADRP            X1, #aGotikura@PAGE ; "GotIkura"
ADD             X1, X1, #aGotikura@PAGEOFF ; "GotIkura"
MOV             X8, SP
MOV             W2, WZR ; bool
BL              _ZN2Lp3Sys5XLink13searchAndPlayEPKcb ; Lp::Sys::XLink::searchAndPlay(char const*,bool)
LDP             X29, X30, [SP,#0x20+var_10]
ADD             SP, SP, #0x20

locret_4F23AC
RET

Report

// starts at 5A7C68
ADRP            X9, #off_4155FD0@PAGE
LDR             X9, [X9,#off_4155FD0@PAGEOFF]
ADRP            X10, #aCoopLocalResul@PAGE ; "coop_local_result_event"
ADD             X10, X10, #aCoopLocalResul@PAGEOFF ; "coop_local_result_event"
ADD             X9, X9, #0x10
STP             X9, X10, [X8]
RET

まとめ

4.7.0向けに7つほどコード移植したんですけど、公開したほうがいいですか?

公開されているコードを移植しただけなので、勝手に公開するつもりではないです悪しからず。

シェアする