çµããã®ãªãç ãã¬å€ãããŸããŸãªå Žæã§ç ãã«ã€ããåã°ãç§ã¯èªåã®èå³ã®èŒªã®äžéšã§ããå°ããªããšã«æ°ã¥ããŸããã ç¡æããŠã³ããŒããããªãã¿ã®äŒç€Ÿããããããã¯ããããã®ææã³ã³ãã³ããããããšãæå³ããŸãã äžæ¹ã圌ãã¯ããããç¡æã§äœããããã§ãããã æãããªçµè«ãåºããŠãç§ã¯ã²ãŒã ãããŠã³ããŒãããŸãã...ãããŠãåŠå¥³ã®çœãç»é¢ãèŠãŸããã
ãã以äžã®è°è«ã¯ãã³ãŒãã倱ã£ãããæŽæ°ãèšé²ãããããªãã·ã£ãŒã®é倱ãåŒãèµ·ãããææ ãæºãã¶ããã®ã§ã¯ãªããããããªçµ¶æã®ç¶æ³ã§æãã§ãããã®ãæã«å ¥ããããšã«ã€ããŠã§ãã
説æãèªãã§ãæã«ã¯ããã§ãããããã®ããããšã¯ã2ã€ã®ãã¥ãŒã¹ããããããŸããïŒ
- iOS 9ãšã®äºææ§ã¯ãããŸãããæªåé«ãçœãç»é¢ã衚瀺ãããŸãã
- ã²ãŒã ã¯ãµããŒããããªããªãã8æã«ã¹ãã¢ããåé€ãããŸããã¢ããªå è³Œå ¥ã¯ã§ããŸããã
ãŽãŒãžã£ã¹ã ããããããã©ãããã©ãŒã ãx86ã§ã¯ãªããã²ãŒã ããããããªããªã©ã®çç±ã§ãå€ãã®äººã¯ãã®åŸæ€åããã§ãããïŒãã ããåŸã§ã¡ã«ããã¯ãæ¬åœã«å¥œãã§ãããïŒã ããããç§ã¯å人çãªin蟱ãåããç¿æãæ£è ã蚺å¯ããããšã«ããŸããã
掻æ§å
æåã®ã¹ãããã¯èŠãããšã§ãããã¢ã³ã¹ã¿ãŒã¯äœããèšé²ããŠããŸãããïŒ sshã§è¡ã£ãŠã syslogã¢ãã¿ãªã³ã°ãéããã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã ããã«ç»é¢ã次ã®åœ¢åŒã®ã¡ãã»ãŒãžã§ãã£ã±ãã«ãªããŸãã
bird [1792] <ãšã©ãŒ>ïŒèšå®ãšã©ãŒïŒ<NSErrorïŒ0x15df7ba0ïŒBRCloudDocsErrorDomainïŒ5ïŒ-{ NSDescription = "URLã«ããã¥ã¡ã³ãããããŸãã"; NSFilePath = "/ private / var / mobile / Library / Mobile Documents / JZKSZCX743ãcomãsquare-enixãtact / oks_savedata.bin"; NSUnderlyingError = "<NSErrorïŒ0x15df7b60ïŒNSPOSIXErrorDomainïŒ2ïŒ-{\ n NSDescription = \"ãã®ãããªãã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªã¯ãããŸãã\ "; \ n}>"; }>
ãã£ãšããã«ãºã¢ã€ã iOS 9ã¯iCloudã®ããã¡ããå£ããäœããã®çç±ã§ä¿åãšèšå®ã®ãããã¡ã€ã«ã¯äœæããããèµ·åã¯ç¡éã«ãŒãã«å ¥ããŸããã äœæããŠã¿ãŸãããã
touch "/ private / var / mobile / Library / Mobile Documents / JZKSZCX743ãcomãsquare-enixãtact / oks_savedata.bin"
ãããŠãããã0_oã€ã³ã¿ãŒãã§ãŒã¹ã§ãã èœã¡çããç§ã¯ã¹ããŒãªãŒã«ç»ããåæã«ããããã©ã³ãã€ããŸããã ããã«ç§ã¯èŠãïŒãŸã äœããªãïŒïŒ
ãã¡ã€ã«ãäœããã®æ§é ãæã£ãŠããå¿ èŠãããããšã¯ç解ã§ããŸãã ãã¡ã€ã«åã§ããã«æ€çŽ¢ãããšã次ã®2ã€ã®å Žæã«ç§»åããŸãã
find / private / var -name oks_savedata.bin /private/var/mobile/Containers/Data/Application/long-uuid/Documents/oks_savedata.bin / private / var / mobile / Library / Mobile Documents / JZKSZCX743ãcomãsquare-enixãtact / oks_savedata.bin
ããããæ²ããããªãæåã®ãã¡ã€ã«èªäœã¯2çªç®ã®ãã¡ã€ã«ãªãã§ã¯äœæãããŸããã ãã£ãšæ·±ãããå¿ èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ããã³ãããipaã解åããŸãïŒããã¯éåžžã®zipã§ãïŒãã¢ããªã±ãŒã·ã§ã³ãã³ãã«ã®å 容ã確èªããŸãã
- Info.plist
- PkgInfo
- ResourceRules.plist
- Shader.fsh
- Shader.vsh
- _CodeSignature
- archived-expanded-entitlements.xcent
- en.lproj
- ããããŸãã
- oks_icon_a.png
- oks_sqex copy-Info.plist
- oks_sqex.entitlements
- pre_build.sh
- ããã³ffdf8df97e7c9bcb7f42d1cc8ad09b08ãšãã圢åŒã®ååãæã€ä»ã®1,500åã®ãã¡ã€ã«ã
Info.plistã®CFBundleExecutableã«ãããšãå®è¡å¯èœãã¡ã€ã«ã¯oksã2ã€ã®ã¢ãŒããã¯ãã£ãåããFAT binarã§ãã
jtool -h OK ãã¡ãããã€ããªãããã°ãšã³ãã£ã¢ã³ã2ã¢ãŒããã¯ãã£ïŒarmv7ãarmv7s -archã¹ã€ããã§ãããã®ã¢ãŒããã¯ãã£ã®ãããããæå®ããããARCHç°å¢å€æ°ããšã¯ã¹ããŒãããŸã
ã»ã
Jtoolã®åºå
jtool --ent -arch armv7s oks èŠåïŒã³ã³ãããªã³ãã¡ã€ã«./oks.ARMïŒäžæïŒ.69981636-7F33-3C43-BD58-7F5BBE2A6CCAãèŠã€ãããŸãã <ïŒDOCTYPE plist PUBLIC "-// Apple // DTD PLIST 1.0 // EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version = "1.0"> <dict> <key> keychain-access-groups </ key> <é å> <string> JZKSZCX743.com.square-enix.tact </ string> </ array> <key> com.apple.developer.ubiquity-container-identifiers </ key> <é å> <string> JZKSZCX743.com.square-enix.tact </ string> </ array> <key>ã¢ããªã±ãŒã·ã§ã³èå¥å</ key> <string> JZKSZCX743.com.square-enix.tacthd </ string> </ dict> </ plist>
ããã«èãã蚪ããŸãããããããå¿ èŠãã©ããã ãžã§ã€ã«ãã¬ã€ã¯ïŒå眲åïŒããã«ã¢ããªã±ãŒã·ã§ã³ãåŸã§ããã€ã¹ã«é 眮ãããšãiCloudã¯åäœããªããªããåäœããªãå Žåã¯ããã«åæãããå¯èœæ§ããããŸãã åæã«ãçªç¶åäœãå§ããŸããïŒ èšããã-å®äºïŒ è³æ Œãæå®ããã«èªå·±çœ²å蚌ææžã§å眲å ïŒ codesign -f -s mycert oks ïŒ ãããšåæã«ãiTunesçµç±ã§ããã¯ã¢ããããã¯ã¢ããã®ããã«Info.plistã«UIFileSharingEnabledããããã£ãè¿œå ãïŒãããŠçªç¶äŸ¿å©ã«ãªãïŒãã¢ããªã±ãŒã·ã§ã³ãipaã«ããã¯ããããã€ã¹ã«ã€ã³ã¹ããŒã«ããŸãã
ãæ³åã®ãšããããã®åŸæ°åéæºè¶³ããŠãã¬ã€ããŸããã ã©ãºããªãŒãã¢ããªå è³Œå ¥ã«ãã£ãŠæ®é ·ã«ã«ãããããæåã®4ã€ã®ã¬ãã«ãééããçŽåã [ã¹ãã¢]ã»ã¯ã·ã§ã³ã«ç§»åãããšãäŸ¡æ Œãé«ãã ãã§ãªããäŸ¡æ Œãéåžžã«é«ãããšãããããŸãã ããŒã³ãã修埩ãããšãã«ã¹ãã¢ãå£ããã®ã¯ãæ¬åœã«ãããå Žåã§ãæ©èœããªãããã§ãã ãã®æãŸã§ã«ãç§ã¯ãã§ã«å ã®IPAãåé€ããŠããã®ã§ãããŠã³ããŒãããããããŸããã§ããã ç§ã¯æããããŸããŸããç§ã¯ããã«inappsã«ããããé©çšããçµããã«å¯ŸåŠããŸãã
ãžã£ã³ãçªå·1ãä¿®æ£
Objective-Cã¯ã©ã¹ã®ãªã¹ãã調ã¹ãåé¡ã«é¢é£ãããã®ãæ¢ããŸãã
ã¯ã©ã¹ãªã¹ã
jtool -dã«ObjC OKS oksAppDelegate oksExtendView EAGLView oksViewController SeqLogo SeqTitleã·ãŒã±ã³ã¹ã®Seqmanã¹ãã©ã€ãSprMan SndOne SndMan SeqIngame Dataoneã®DataManã®TouchEff TouchOne KEYMAN ChartObj ResultIconOne ResultIcon楜å£ChobjEndEffOne ChobjEndEff FadeMan NumberSpr SeqResult MenuStatusãããã¢ããSeqMainMenu SeqStory SptMan SptCharaOne SptChara SptMsgLog SptMsg SptBg SptStill SptCol SptShake SptSnd SeqSelConcert MenuCmnBtn OnpuEffOne OnpuEff SelStoryChap SelStoryLine SeqSelStory StaffData SeqStaffRoll MusicStill SeqMusicã¡ãã¥ãŒãªãã·ã§ã³SeqDownload MyStoreObserverãã¥ãŒããªã¢ã«FontMan VerificationController Reachability
ååããå€æãããšã SeqStory ã SelStoryChapããŸãã¯SeqSelStoryã® ããããã«ãªããŸãã ãããŠããã§ã«2幎çã§ã幞éã¯ç§ãã¡ã«åŸ®ç¬ã¿ãŸãã
ãã³ãæ¹æ³
jtool -d SelStoryChap -arch armv7s oks èŠåïŒã³ã³ãããªã³ãã¡ã€ã«./oks.ARMïŒäžæïŒ.69981636-7F33-3C43-BD58-7F5BBE2A6CCAãèŠã€ãããŸãã //ãã³ãã¯ã©ã¹45ïŒSelStoryChapïŒ @interface SelStoryChapïŒCoreFoundation :: _ OBJC_METACLASS _ $ _ NSObject //ããããã£ã¯ãããŸãã.. // 11åã®ã€ã³ã¹ã¿ã³ã¹å€æ° / * 0 * / unsigned intãã©ã°ã //ç§ / * 1 * / int storyId; //ç§ / * 2 * / int prio; //ç§ / * 3 * / float oriPosx; // f / * 4 * / float oriPosy; // f / * 5 * / float posx; // f / * 6 * / float posy; // f / * 7 * / float plate_w_2; // f / * 8 * / float plate_h_2; // f / * 9 * / sprAry; // ^ @ / * 10 * / int sprNum; //ç§ // 25ã®ã€ã³ã¹ã¿ã³ã¹ã¡ãœãã / * 0 * / 0x38f01-isUnlock; //ãããã³ã«c8 @ 0ïŒ4 / * 1 * / 0x38f15-isHave; //ãããã³ã«c8 @ 0ïŒ4 / * 2 * / 0x38f29-canPlay; //ãããã³ã«c8 @ 0ïŒ4 / * 3 * / 0x38f3d-canSelect; //ãããã³ã«c8 @ 0ïŒ4 / * 4 * / 0x38f81-isTouch; //ãããã³ã«c8 @ 0ïŒ4 / * 5 * / 0x38fd5-plateTye; //ãããã³ã«i8 @ 0ïŒ4 / * 6 * / 0x3900d-isKeyDisp; //ãããã³ã«c8 @ 0ïŒ4 / * 7 * / 0x39031-isPlayingDisp; //ãããã³ã«c8 @ 0ïŒ4 / * 8 * / 0x39045-isChapTitleDisp; //ãããã³ã«c8 @ 0ïŒ4 / * 9 * / 0x39085-ã¢ã«ãã¡; //ãããã³ã«f8 @ 0ïŒ4 / * 10 * / 0x390d9-isDisp; //ãããã³ã«c8 @ 0ïŒ4 / * 11 * / 0x39135-ã¯ãªã¢; //ãããã³ã«v8 @ 0ïŒ4 / * 12 * / 0x391d5-ãªã»ãã; //ãããã³ã«v8 @ 0ïŒ4 / * 13 * / 0x392a5-ããŒã; //ãããã³ã«v8 @ 0ïŒ4 / * 14 * / 0x396d1-initWithPrioïŒ; //ãããã³ã«@ 12 @ 0ïŒ4i8 / * 15 * / 0x39725-dealloc; //ãããã³ã«v8 @ 0ïŒ4 / * 16 * / 0x397a1-setStoryIdïŒ; //ãããã³ã«v12 @ 0ïŒ4i8 / * 17 * / 0x39859-updatePos; //ãããã³ã«v8 @ 0ïŒ4 / * 18 * / 0x3991d-setOriPosïŒyïŒ; //ãããã³ã«v16 @ 0ïŒ4f8f12 / * 19 * / 0x3994d-setOfstPosïŒyïŒ; //ãããã³ã«v16 @ 0ïŒ4f8f12 / * 20 * / 0x3996d-setDispïŒ; //ãããã³ã«v12 @ 0ïŒ4c8 / * 21 * / 0x39aa1-startSelEff; //ãããã³ã«v8 @ 0ïŒ4 / * 22 * / 0x39c7d-storyId; //ãããã³ã«i8 @ 0ïŒ4 / * 23 * / 0x39c8d-posx; //ãããã³ã«f8 @ 0ïŒ4 / * 24 * / 0x39c9d-è±æ; //ãããã³ã«f8 @ 0ïŒ4 @end
ã¡ã³ããŒã·ããã¡ãœããisUnlock / isHaveãåªãããã³ãïŒãããèŠãå¿ èŠããããŸãã ç§ã®ä»£ããã«æèœãªäººãFlexããããæžããã
ãã®ããã«
â
â
ããã€ã¹ã®å®è¡å¯èœãã¡ã€ã«ã®å€èŠ³ãæŽæ°ããåŸãisUnlockã¯ããšããœãŒããã²ãŒã ã§å©çšå¯èœãã©ãããã§ããããisHaveãã¯è³Œå ¥ã¹ããŒã¿ã¹ã§ããããšãããããŸããã 以åéãããšããœãŒããéããšãã¬ãŒãã«ä¹ã£ãŠããããšãããããŸãã
äžèº«ã確èªããå¿ èŠããããŸãã armã¯ç§ã«ãšã£ãŠæã銎æã¿ã®ããã¢ãŒããã¯ãã£ã§ã¯ãªãã®ã§ãç¹ã«æ©èœãçããããŸãæéããããããªãã®ã§ãå¿ èŠãªãã¢ã»ã³ãã©ã³ãŒãã䜿çšããŸããã ã³ãŒãisHave / isUnlockãèŠãŠãã ãã ïŒ
char __cdecl -[SelStoryChap isHave](struct SelStoryChap *self, SEL a2) { return (self->flag >> 1) & 1; } char __cdecl -[SelStoryChap isUnlock](struct SelStoryChap *self, SEL a2) { return (self->flag >> 2) & 1; }
ããããããã®ã¡ãœããã¯æ¢ã«èšå®ãããŠããå€ã®ã¿ãèªã¿åããŸããããããã©ããå¥ã®å Žæã§å®éã«ãã§ãã¯ããŸãã XREF ãã©ã°ã䜿çšããŠã ãã©ã°ã«æžã蟌ãã¡ãœãããèŠã€ããŸãïŒä»¥éãèªã¿ãããããããã«ååãéšåçã«æåã§è¿œå ããŸãïŒã
// SelStoryChap - (void)setStoryId:(int) void __cdecl -[SelStoryChap setStoryId:](struct SelStoryChap *self, SEL a2, int story_id) { self->storyId = story_id; self->flag &= 0xFFFFFF80; if ( checkStoryFlag1(self->storyId) ) self->flag |= 1u; if ( checkStoryFlag2(self->storyId) ) // isHave self->flag |= 2u; if ( checkStoryFlag4(self->storyId) ) // isUnlock self->flag |= 4u; ... }
2çªç®ã®ãããããã§ãã¯ããå¿ èŠãããããšãç¥ã£ãŠã checkStoryFlag2ã®å 容ãèŠãŠãå¿ èŠã«å¿ããŠèª¿æŽããŸãã
ããå°ã詳现
int __fastcall checkStoryFlag2(int a1) { return checkStoryStatus(a1, dword_7D84C); } signed int __fastcall inRange(int value, int start, int end) { signed int result; // r0@1 result = 0; if ( start <= value && value <= end ) result = 1; return result; } signed int __cdecl checkStoryStatus(int story_id, int *table) { signed int ret; // r4@1 ret = 0; if ( table ) { ret = 0; if ( inRange(story_id, 0, 63) ) { ret = 0; if ( sub_xxxx(global_entry1, story_id, table, 's') ) { if ( !memcmp(global_entry1, &table[8 * story_id + 6], 0x20u) ) ret = 1; } } } return ret; }
äœããã®çš®é¡ã®å€ããŒãã«ãdword_7D84C ïŒåŸã§SHA-256ããã·ã¥ãããããšãããããŸããïŒã«æ ŒçŽãããŠãããçŸåšã®IDã«å¯ŸããŠæ°ããèšç®ããããã®ããã§ãã¯ãããããã§ãã ãã®å Žåãç« ãéããŸãã ããã¯ãã¹ããåé€ããå Žæã§ãããèããªãå Žæã ãšæããŸãã ãŠãããã®ç¡æ¡ä»¶åŸ©åž°ã¯ãã®ä»äºãæãããç§ã¯ãã¹ãŠã®16ç« ãééããŸãã:)ã
ãžã£ãçªå·2ãä¿®æ£
ãã®ã¹ããŒãªãŒã¯ã1ã€ã§ã¯ãªãã«ããŠãå®äºã§ããŸããã
æ®ãã®24ãã©ãã¯ã¯ã©ãã«ãããŸããïŒ ããã§ãã圌ãã¯å¥ã ã«è³Œå ¥ãããŸãã ããã§ç§ã¯ããã¡ããå°ãå«ãã«ãªãå§ããŸããããäœããåã®æé ã¯ç°¡åãããŸãããäœãä»ã®ãã®ãããã«éããããŸããã ããããç§ã¯åã³å¹žéã§ããã ããã«ãsetupSelMusicãšãã䟿å©ãªååã®ã¡ãœããã®1ã€ã§ããã©ãã¯ãå埩åŠçããããã€ãã®é¢æ°ãåŒã³åºãã³ãŒããèŠã€ãããŸããïŒD
v3 = 0; memset(self->ctrl_music_idx, 0, 0x200u); v1 = 0; self->music_max = 0; do { if ( sub_36C24(v1) ) self->ctrl_music_idx[v3++] = v1; ++v1; } while ( v1 != 128 ); self->music_max = v3;
ã€ãŸã
i = 0; memset(self->ctrl_music_idx, 0, 0x200u); track_id = 0; self->music_max = 0; do { if ( trackCheckingFunction(track_id) ) self->ctrl_music_idx[i++] = track_id; ++track_id; } while ( track_id != 128 ); self->music_max = i;
ãã§ãã¯ã®ã³ã³ããã¹ãã«åºã¥ããŠãæ©èœã4ã€ã®ç¢ºèªã®ã»ãããšããŠè§£éããŸããïŒãã©ãã¯ã¯èš±å®¹ç¯å²ïŒ0ã127ïŒã«ããããã©ãã¯ã¯ã²ãŒã ã®ããŒã¹ã«ååšãããã©ãã¯ã¯è³Œå ¥ãããå°ãªããšã1ã€ã®ã¬ãã«ãã²ãŒã ã§å©çšå¯èœã§ãã
æ¬äŒŒã³ãŒã
signed int __fastcall trackCheckingFunction(int track) { signed int ret; // r5@1 int lvl; // r6@4 char open; // r0@6 ret = 0; if ( inRange(track, 0, 127) ) // { ret = 0; if ( trackExists2(track) ) // { ret = 0; if ( checkTrackStatus(track, dword_7D84C) ) // { lvl = 1; do { ret = 0; if ( lvl > 4 ) break; open = checkTrackPassedLevel(track, lvl++); // ret = 1; } while ( !open ); } } } return ret; }
checkTrackStatusã«æ¡ä»¶ãªãã§ãŠããããè¿ãããã«åŒ·å¶ãã...å°ã£ãããšã«ãªããŸããã è³Œå ¥å¯èœãªãã©ãã¯ã¯ã¹ãã¢ã«è¡šç€ºãããªããªããŸããããã²ãŒã ã¡ãã¥ãŒã«ã衚瀺ãããŸããã§ããã ããã§ããã°ããã®éãé ã骚æããŸãããæåã¯ã¬ãã«ãäœãããŠããã¹ãŠã解é ããããšããŠãããšèããŠããŸããã ããããç§ã®äžã®åç䞻矩è ã¯ãå°ãåŸã§ãåãã©ãã¯ã«ã¯æ倧4ã€ã®é£æ床ã¢ãŒããããããããããåã®ãã©ãã¯ã«å¯ŸããŠååã«é«ãããŒã¯ãåŸããããšãã«éãããšãæãåºããŸããã ã€ãŸãããã®é¢æ°ã®lvlå€æ°ã¯ãã¬ã€ã€ãŒã®ãã€ã³ããšã¯é¢ä¿ãªããå°ãªããšã1ã€ã®é£æ床ã¢ãŒãã®ãéæŸæ§ããåçŽã«æ±ºå®ããŸãã ã³ãŒãã®ãããªãç 究ã«ãããããã確èªãããŸããã
ããå°ã
BOOL __fastcall isEntryAvailble(int *table, signed int index) { return (table[index >> 5] & (1 << (index & 0x1F))) != 0; } // - ... signed int __fastcall checkTrackStatus(int track, int *table) { signed int ret; // r4@1 ret = 0; if ( table ) { ret = 0; if ( inRange(track, 0, 127) ) { ret = 0; if ( loadEntryHash(hash, track, table, 'm') ) { if ( !memcmp(hash, &table[8 * track + 522], 0x20u) ) ret = 1; } } } return ret; } BOOL __fastcall checkTrackPassedLevel(int track, int level) { BOOL ret; // r6@1 ret = 0; if ( inRange(track, 0, 127) ) { ret = 0; if ( inRange(level, 1, 4) ) { ret = 0; if ( checkTrackStatus(track, dword_7D84C) ) ret = isEntryAvailble(&track_status_list, level + 4 * track - 1); } } return ret; }
ããŒãšã蚺æã¯äžãããŸãããç§ãã¡ã¯ã©ãããŸããïŒ checkTrackPassedLevelã«ããããåœãŠãããšãã§ããŸãããããã»ãŒãžã«é¢ä¿ãªãããã¹ãŠã®ãã©ãã¯ãšé£æ床ã¢ãŒããå©çšå¯èœã«ãªããŸãã ãã®ãªãã·ã§ã³ã¯å人çã«ã¯ããŸãã«ã倱瀌ãªããã«æããã®ã§ãç§ã®å®æ家ã¯åæååãæ¢ãããã«ãªããŸããã track_status_listã«é©åãªXREFããªãã£ãã®ã§ ãç§ã¯ãã§ã«ãã®ãããªæãããŠããªããããã¬ãŒã䜿ããããšæã£ãŠããŸããã æåŸã®ç¬éãç§ã¯ã¢ã€ãã¢ãæãã€ããŸãããç¹å®ã®ããŒãã«ã§çæãããããã·ã¥ã«è³ãå Žåãããã«äœãã眮ãã¹ãã§ãããããã·ã¥ãã©ãã«ãããã¯ã¹ããŒã¿ã¹ã§ãã éçºè ã2ã€ã®ç°ãªãé¢æ°ã䜿çšããŠïŒãã®æçš¿ã®2ã3ã®èšç®ããã§ãã³ããŒãšè²Œãä»ãã«é¢ãããã¹ãŠãæããã§ããïŒãèšç®ããããšã¯ã»ãšãã©ãããŸãããXREFloadEntryHashã調ã¹ãŸããã æåéãæ°åæ€çŽ¢ããåŸããã®ã³ã³ãã³ãã§æ©èœãèŠã€ãã£ããšæããŸãã
int *__fastcall sub_xxxx(int track) { int *result; // r0@1 result = inRange(track, 0, 127); if ( result ) { performLoadHashForTrack(track); sub_36EC0(track, 1); result = dword_7D84C; unk_7D860[0] |= 1u; } return result; }
ç§ã®æèŠã§ã¯ãååãå€æŽããã«ãããããã©ãã¯ã®è³Œå ¥/ééåŸã«åŒã³åºãããäžçš®ã®ãªãŒãããŒã§ããããšã¯æããã§ãã ãããã«ããããããã®å°ããªãã®ã¯åã«ããã«ã€ããŠå«ã³ãŸãã-XREFã«é¢ããäžèšã®[MyStoreObserver complete_subïŒ]ã¯ç§ã«åæããŸãã:)æè¡çãªåé¡ïŒãããã䟿å©ãªå Žæã«ãã®é¢æ°ã®åŒã³åºããæ¿å ¥ããããšã¯ãããããåããŠã¢ã»ã³ãã©ãŒãç§ã«ãšã£ãŠæ¬åœã«åœ¹ã«ç«ã¡ãŸããã checkTrackStatusã§ãã©ãã¯ã®IDãçŽæ¥ãã§ãã¯ããæãç°¡åãªæ¹æ³ã§ããªãã¯ãè¡ããããã¹ãŠãéåžžã«è¯ããªããŸããã
ããªãã¡
â
â
çµè«ã®ä»£ããã«
æããã«ããã®ãããªå°ããªå€æŽã¯ãäœãã®ãµããããããšã¯ã»ãšãã©ãããŸããã ç§ã¯ãã¯ããã«å³ãããè²»çšã®ãããç¶æ³ãããããšãç¥ã£ãŠããŸãã ã¯ããããšãã°ããã§ãããã·ã¢èªïŒããã¹ãããŒã¿ã¯UTF-16 LEãšã³ã³ãŒãã®èŠããäžåçŽãªåœ¢åŒã§ä¿åãããäžè¬ã«ã°ã©ãã£ãã¯ããŒã¿ã¯PNGã§ä¿åãããŸãïŒãŸãã¯iTunesã©ã€ãã©ãªããã®åçãªèªã¿èŸŒã¿ã§ç¬èªã®ãã©ãã¯ãè¿œå ããããšãã§ããŸããã ããã«ãåŸè ã®å Žåãã²ãŒã ãªãœãŒã¹ã«ã¯ãã€ããªæ§é ã ãã§ãªããããããåä¿¡ããããã®ãœãŒã¹ãã¡ã€ã«ããããŸããã
ãã®ãããªãã¡ã€ã«ã®äŸ
/****************************************************************************** * wav-file : jupiter.mp3 * midi-file : jupiter.mid * create at 2012/8/17 20:54 ******************************************************************************/ //////////////// ãããæ
å ± //////////////// ST_CHDATA_HEAD s_chdata_head = { "OKCH", // åºå®å€"OKCH" 7 , // ã¡ãžã£ãŒããŒãžã§ã³å€(åŒãç¶ãäžå¯æŽæ°) 1ïœ 0 , //ãã€ããŒããŒãžã§ã³å€(åŒãç¶ãå¯æŽæ°) 0ïœ 294.40034f, // æ²å°º [ç§] 625, // ãªããžã§ã¯ãç·æ°154.00015f, // åæã¹ã¯ããŒã«ã¹ããŒã[dot / sec] 154.00015f, // åæBPM [beat / minutes] E_HAKU_2_4, // åææå0, // ïŒããã£ã³ã°çšãããŒïŒ 0, // ïŒããã£ã³ã°çšãããŒïŒ 0, // ïŒããã£ã³ã°çšãããŒïŒ 0, // ïŒããã£ã³ã°çšãããŒïŒ 0, // ïŒããã£ã³ã°çšãããŒïŒ 0, // ïŒããã£ã³ã°çšãããŒïŒ 0, // ïŒããã£ã³ã°çšãããŒïŒ 0, // ïŒããã£ã³ã°çšãããŒïŒ 0, // ïŒããã£ã³ã°çšãããŒïŒ }; //////////////// æ¬äœããŒã¿ //////////////// ST_CHOBJ_HAKU s_chdata_main_0000[] = { {E_CHOBJ_HAKU , 16 , 0.00000f , 0.00000f , E_HAKU_2_4}, }; ST_CHOBJ_BPM s_chdata_main_0001[] = { {E_CHOBJ_BPM , 20 , 0.00000f , 0.00000f , 120.00000f , 500000}, }; âŠ
ããã¯å¯èœã§ãããããããã®è¶£å³ã«ã¯æéãšæ³ååã®äž¡æ¹ã«éçããããç§ã«ãšã£ãŠã¯æ°æéãè²»ãããŸããã ãã®èšäºã®ç®çã¯ãã¢ãã€ã«ãã©ãããã©ãŒã ãæããªãããã«ããããšã§ããã¢ãã€ã«ãã©ãããã©ãŒã ã«ã¯å€ãã®å¶éããããŸãããTEXTã«ãã€ããåçã«æžã蟌ãããšã¯ãªããããã°ãã©ã¶ãŒãšéãã¯ãããŸããã ä»ã®äººã®ã³ãŒããæãäžããããšãheããªãã§ãã ãããããã»ã©é£ããã¯ãªããæã«ã¯éåžžã«åºæ¿çã§ãïŒç§ã®ããã¹ãã®NFSã«é¢ããæè¿ã®äžé£ã®èšäºãšã¯ç°ãªããããã¯ã»ãšãã©æããããŸããïŒã
PSæåŸã«ãªã£ãŠãããŠããããšãã
PPS販売çµäºåã«ãã£ã¹ããªãã¥ãŒã·ã§ã³ãé åžããããšã¯ãæ³åŸäžã®çç±ãã䟡å€ããªããšæããŸãããããŠããªãã誰ãã«ãšã£ãŠããã¯å®è·µãã絶奜ã®æ©äŒã§ãã
å 責äºé ïŒãã®èšäºã§ã¯ãã©ã€ã»ã³ã¹å¥çŽã®éåããããã³ã°ããŸãã¯ãœãããŠã§ã¢ã®äžæ£äœ¿çšãäžåæ±ããŠããŸããã ãã®ããã¹ãã¯ãçŽç²ã«æè²ããã³æ å ±æäŸã®ããã«æ瀺ãããŠããŸãã