Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Pldare/d153531cca20fe180171db86136c0d88 to your computer and use it in GitHub Desktop.
Save Pldare/d153531cca20fe180171db86136c0d88 to your computer and use it in GitHub Desktop.

Junk code collection

resource_fetch.php

batch export card image


api_decrypt.php

attempt to decrypt api response
About api: The first two (GetNativeToken & Login) are encrypted with embedded key, then RequestEnvironment switched to sharedSecret mode, which should come from first two response
(Not well researched)

POST body ["pm"]: stringBuilder.append("{0}{1}{2}", bridgeToken, keyIndex, data)
response body: pure encrypted message


MD_AssetbundleDLPackVer.php

decrypt & deserialize MD_AssetbundleDLPackVer.snd, for resource download lookup


abip.php

decrypt .abip asset bundle


MD_Costume.php

deserialize MD_Costume.snd, for card name mapping

<?php
$dat = file_get_contents('cr0026_c005_0.abip');
$key = implode('', array_reverse(str_split(base64_decode('Y2VJOCQpWSNZcyRyNVJGNVd8NFctXzE7Kkw7KVZVenc='), 1)));
$iv = implode('', array_reverse(str_split(base64_decode('ZTBnJDJuUnAmIWRBUVJXP2pxeCxXPn1FI2ZKRzFEKkw='), 1)));
$head = substr($dat, 0, 0x400);
$body = substr($dat, 0x400);
$headdec = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $head, MCRYPT_MODE_CBC, $iv);
file_put_contents('cr0026_c005_0-dec.abip', $headdec.$body);
<?php
$key0 = ([
'mfQMG92mJ6R',
'D2L1L1aLJSBjLlLQ3fCdS8at',
'52hHwSInpbOVRq',
'M88yny3dvB5ZTVHpQD',
]);
$key1 = ([
'MW1LkPfxIrDB7PNTdupvw',
'jAWLuydO',
'sIQPwGnXVkOhMqks0p',
'W7rkDhakfa1PI0',
]);
function getApiKey($idx) {
global $key0;global $key1;
return $key0[$idx] . $key1[$idx];
}
function getApiKeyNext($idx) {
global $key0;global $key1;
$idx = ($idx +1) % 4;
return $key0[$idx] . $key1[$idx];
}
$dat = json_decode('{"pm":"QO0YGgQ+N4oueI425HLaYoYu8E0UOj1GS4S6AAByOgvPM9UC9I2yZCTE0ObdjsekAcIjfElVUhybI4En\/6gT2THEC4XUYaGkNZ6f4PMkzw2Oc1hrX9R4LPkb6\/TmX9VfMDiMdhZaEGYqsB0YkT+VbWs1FIyAr6B2GV\/k+bzrTFGRelV+5hEA2vZA2cCdn2fgDbmUU3czJw7bMJK7fk+OtrWf63gc2V9THxdgXLASWUXoj37\/LI5HV4wWKfvi5vrRQ12EaVTMpviJPstV8fk7lQlKCkS8MBIpG2AgfaVglhXvh7AH+cy5gYZjv0h7bjFBjW1HTq32IjfOtjmUasMt1pXGMCWRA4alw2to\/FWv1a3cHvkspWVHqP2Lxac58aamc+WLTsejhCEDCNJ+k6vlAMOi6DeHI9N\/iwLoDsZCY51w3BKG1YtyN8OJuP4RAVlSoK+xjkfwRLRrTJmC3+H32kUE+OIDQ0Dawg4xkbinHyrsiG8FUV+57eFSVEKmsddhiGTWz1MBi45bdUIaBfgdv1aS9sQtezaFwTLZgFy1dyhun8DKr\/MuzJp5YVkxRrQx\/b2ccbRdGUCCkZKX5DD+Yb0+XUxSMkwkdY\/MNCBoHjFLRy5vCb40qFi0bbYHIVTIfbQaZVoef7BtGozFkNL8M08Z3NIFCQdF+0ZajsnwW\/DY1s3GPRYVTsAl+vBE7YIJrRsjf6Y671T8SMi1BP\/tFZS67dJ785VWKEyQcG4S5u4\/X31FlCsh\/YG7uXBzLLIhX79X1szu+PFG504a7k3h4inBvBh7Ij+z\/bcuhdCHsUHRtj68gKJzc5TXZM\/Kc+IyX1CezvpOClSg6yjBJOhRY6EnjWpwIBEJEFKO4bme7wMpX+SkH9EsBmf8Azm5zqYX\/ZziJ0PxqwHEbli8\/uOd1QamD6oUw51WLTPROuJl+X4cB3blSqkenptLeP8WPUqhAo9FDvi3SPXzx92rcTKU7lLl0YWsB7YITdVuUJwzip69BaCS9eRO+LJiH6bLqjDEtoUz08iJLDAapd9rbImVDLju22WONiCVmSbDrOvC747otCJb1MmjN0ywQ86TMf+i+tIwLBRCw3GpVC4Ica3G1GUkR7vHrtFbLUv8qH0cR9pwoEqsh\/R7eyeWDgVb2ipPweEl8NJPc6KKLKoOZlmci1bTcE0znCykV5lwN4jlYFh5NIAYuXOZFDM9LRjD4Ef34SPYaa8AIUMTWNLp4L7E+mKY+JmsFb5tvrK7v4m45uOJ8OeOaor9qn+qzkSks6dCmPhvlcG\/MJ5IaO3KKZgE2PeWLHAC\/zeXlUOVlOA05EGYuNCaEpAVdhrEQn4+rWNSObaxRyoBkHt5NYR9K6Ro+c5xlhOQQXfWfwIO2mIHhcCSgnlz7hJq1jCaqz9IJX91DH6vXeZOmqUR46AykkVCLFgWL8cX5\/ld8Hjl4gtIMbkXP1f8kfXuODuCodSoYDS6FMqEPUASEe6cPdxtTTo6jhI0cXW9+W77cL23XyqLUIchYuJd2YwPjbftPjbAEHRhmafJwRmK3TGXV7rjPtArH51oRzJlMdmCEMx4HJaxJ6CajltYhWZdos+O8VUAJSawhrieZ+XtsUjCjWuPHqwd9\/+a1J72eXB3Hwol2+RYIIPr5sHKkoCmqVd5K6V+3o7G1wG9hO1qRtbqMNZ2DpQsMPfEbbyXSZ3A399PcZjsTldiB0yyRInERQwodY2IpnyBeA87WgxTjny5FwOaFpyj60w89vGuqkY9fsOe0xyuCuSjpCg7oaBn0jqi0wB\/m+ZpY2TR1uA4XBSUNKSdyEoh8d9jcg9wO\/yFQQeBiTF6KxWTo5bPMU830+NWO+qBVsubAvy738leKoaYA8PVhj8QG9JvQnz4DeLZOOmYT\/b6h4eieW4xMDwzb9+1kJQ9ZQn29jM\/Z+4RPRe7W5odfTXtUqm3t4WLnvmpGYGXBc6d8iWBOMb17za5a5eZEdf22Yhcwclzw5TpUfI44BjwLSaFTFK7XOqlAelVmsZvn08YydBmchWYVc5HIHLacjg4MIkLB9mYSEoC\/ApuTg7gzMMYrWnTHBLzxk57k7xLR6oFee7chhlTKQBf2+dr8TzBBQs0BMHt7I0RNiU2xA5SfF2dRmpl1DfPXkpi36mJSweweh7RSQUGd5lVU8Eebh9IPK6plZbmWsFnMN1Zgo8a9S3PQqXbUMlBhPFNyGkPSFo80BL6vosPbE+nm7yqwPOm1fgllBkmgrRbWFTk0QqrZ4tx+R9E0kD7CESI+69EMsCFGo0IiUMWevG4fydv48tCFE+Vm\/XEbrSq+VYtnw3PZGfotCZUiPnUgYizmc94euhc07tMX8eNVR1WUVjblwyA3ps6jaRj2g1oomA32dVR9uEYScL3jPWI+lT8ehM5HRmblHwgy4l1NSnlzGUVENFAa4wFxTPyIvfz9ozMuyf20epG9+Wdj7O1A+FG7mf8Grya4\/Oh5bmKppEzaSqwOax0sLigPKDpijQolXyaFVnxyD\/GjpCnTwx\/AntARAtctaXatZuLn9kBWUe0CWS8YmXww2XOurRqYLlPXcrSxrAhUFKdcyOWQCu5KtrIh3YudnufG2dYCeQWPSE9NPolIHQ6fyaA2So3TPHP\/b+QFlvMrhrVBaZoaN7i4vrMQkGNrQD10C75uYpodgq9HkKgXZc4ttlsRKuZviZxIf9MT+rASeE1aK7Fn7zlaI4jUMXc0\/WPuP2w4H\/1EVsX3xJOz+X6dkBKU8sL88NwYlc1xPVpax1empbgbzSUU8FPGpsQ6\/dSJ4P2eliael4179wZ\/1IldwT04riEjyYL5Iv5y3\/HM3omE+uJvW9ZmRqlkNgFzGTKC2ZV\/3aGzCOD6BsSa3eX9klpp+c2xO3ARC0VUdzw6XTCy0qnsr4MeUoZ5\/8U6HreDYBMWjEuCtvUk\/rF\/UUMwoBWzcExbDiQPhoBICpcm6RZYMZsPT2iSsyCiuHm+4pSiztfvpjnEyohP2zgpeo38IrCryqcixzzPBjp283LjNYz915sgEdchbUnqPJpNTmZHSjVu\/vTiE8WRzm2UzynV\/3bdscA+pIDjP4jmOeYOCtdWbKNHmu7Sfo7HwJV6OviOheLRnJHZSTyV4\/Zf2O\/7elAXTHs4mq+G7XwiOSQao4fAi3EzhBwJtUHUqbaNYSlFqQ2ezz8epclg\/8wTW5VLPUgRPU++Erj2spxChHPZkAW23HIPh3sxy56NOdJwBp9jBw68DPp9mQdH+jpi064FxTLGpKQDxxR2tfz+WGUzAHIZz\/K5TgdqqinEVoIE+M895WGIkTh8VJmrJhmwkch5Rr+QAvflWY7l7gzvdrygEwOJfdKsmTW5WzYVHryQbkzAOKbSvMxY3ATV6aNKV4TBnkKdk0SufZH8AxRkp6bnshd3tRwcdYhKHjFfeIdkjokEx09UgJUf48pB7sHJvlIF5LD\/P6+6eCqdSpvb94ZggqdrZC42cUt4Yn3BLBWLqcFUK86HVKIDulv3d12UTx+iwpSvKCNHGcWL7JC3BOP0xwi7UaLBfRThl08vLExlxGEHfjHHi9X5V2WyH\/mT7XYu4NaY+dWrhIFwMiKbhnp5a\/VgLSN8W8CUKg0y5ydCR08b8obDADqNHp71x+S\/Ff5MsYHMNBr10vVOVGGEGeql\/rhtcxwAzRExBuHnot0xO5p2rbZgtGafKbxfUfmXqBqY7zDwGPQREcOuo6nAEI9e8+asVMQkxs\/QPBZHXoFI88bdVu9xG+o837UFRA7gECqsVn6N9JpVN+nE4LullN0Gr37niPk7F33DjCrq2tREVBiqoBIByIHGfxzI2LiVpAjFVEGAa\/JJJEAMgsw7y5wkFaxElhFZoOQ43YUKJyFvcuHE5yyzcKPEoefuvTazprg5f91mPGZ9KzNEvvwJkZviIEyomckzpKjPLA88lbyqM7VG\/JfFEOs2APUyGgV6+o2TrSCZQBYP6HNjNBhXIPUXuYHOwl6gG94DkrsMpe9druQP6VhOyySm9pblQxk+XFwobsljIq0lccMmrjMF8r1rT0+6MX4xYYDHPilxGhmILasistyFc7vLNAD+FjMJmufNweol0JyjIG2Kg1oJek\/U9aPRjgc6HjB5HFn6IeBrUp5MeNOQDNF1pD3OQl5YXwq2t3K3+sz1AX8pK8sb6lh45ni3m+QJojA8nz6FmsTNM\/xxa1ZL5KTml\/1ikazRaMZFi\/XQYI9N0K+\/alDEM8cdVnkn044Y6puAIRvguvOn8yHWE8vH3vMJO5gOY3FKvV6j0jNwsjS53gG+IP7Dv70EPFRO1zilBPR6rIlAuoGH9KGIu3WobHlACmjcR6UpUeSWUS1XhA+xe5WXJivWS84S\/2DRixbrchl1UmamYRBvcbB1CTrheS2SAvyAKF6LBHRrXE\/BrZXiFxkJjpi6J9siuadEkjyXGQjr+hOOKlCvloTgFSPsfwetesv6VSooGXO2xC04qQ2ymRVGDN\/ByZuD6nAA+NoIwT9rVzrjTVmzLnyMeli0U7qrS4BCOdjV6FvRU0p8QsYc1mvdiVCBhKfC5qCe2qipfVcngZ5WMGlDt6Ut\/VCmhi3y5BlgaPrDxY+BsRIIQOCIno9VACqqp5a9390EG9PHip0IcvgTxKPZ+nUxl2NcQnCsDIwXmgGh1XSk464tBkkmVcGgody0\/hfnuyXx557w+dIC2L14EuNAu1bWd6zv5NiCvi4cF1bB0CLny6MNXiNYWt\/rD8I+sSbTALPBxA8r2lVlC58EPi5DKW0WsnO3nLbRMvqtiDiPgASP8LNT07J1jeuSV0HxheBoks6ImAt3WjMrb6ruQsL78UZRs68oW9eT16WETHjHXhN2FBRqame\/mKTYuH+c3qHFcJUDc7QL2GdAloLFdbO+Vi21kmuwesJimEqYd\/G7PGTxpgm+5ccQXUq5Qr\/21bgflZFYchGi4d7fCMMIMbLxSyFLHmXkDgYSMkLRQDZS402hBzQmtLyZbpaGPjOJnsMD0yrGG5J2ye7gh9ndIPauvu1k9E7JYkVNXHOiPNJ4\/ayMAbe4L9NnAM1qeCk9ziDSzUBWqw8V566Yq62iwjkM4DBpaBVphRK\/XrQLszIsyG3cv1kS5G1ad+cOlmNDQoeptdRfHQcY98KxWjn930q9q+16MW9KF\/EEwKSN1r4RSyIDeWlzh2VRVIvzTMgxyiPHo4tB+vSYi5VXDjnmo1JQ7+T42JN\/Lm7xZXfgXlPaMBPi3+uURVBb8OcFvctvXvmrhDchV7nnt1uL5noF7g8SHlkqQc3SJ9yGtY\/QwbtUPLrLe1sTuTA0yxRiu\/HHSA2oqzfYCHNIx3qZAJ0s9tGAzR5VoS2nbn9ge0CrJJLak9bzjPIJHY4IWWonU44uUycIS4B+PgbRM\/SzcADEX4lyWpzFTInEOwSUe30SktsTm6yu3ovHANPxoxVAXwYo6s55SJL\/cfpitC\/JMCtw4sYT59ubget8q7dKVMw5I9JS65J9ZdhGMkPqcMQ9YSbk0wcBWbL3dbvA9VCVZADNofwr8B5lZJgndducfmw3o8rY1KJQ07Bckos5cc3LtswgGIBuSUiv2pCHAxIBB0tAY9zP3r\/liIOYQ6fsOnC5wv3yAPy0l65r97\/CUlbwnHF+A6S8sfK0vevMBZCQjsYicCi3GXjYDbMt\/YOuJhW2xBiSdOsWsonNTLZeZ0LTWRCQnBnkHRJxOz3KvwIPducMvgOpQFQJtpbXzdlhKJogerWQxg9wEnZ9ANMJn+lSWdE69I9UK2sZCbZZ4MmXf2faoT9mFieDC27yeqebR\/A\/OU32pIL6oakg\/54U66SV5uJxAquKUjafM381lDXCPmof\/2y9bI8us3euIITSeNag9fnWdvUzsO8iRGas42fGrkj0eAU5xW012eq57QcXsSHLRQSShewhefD9+gLkQbiEnLMtoyUIczl9ekPNjKOSQNVTzH6ky\/JtD+hoCwPgITFE1lwRJ2OFjwJ+SPckwoLupifYtveI0xY\/MNxmo7p0oPN0EoMDYElW6rmrGCsKx2eS2HpT8o6OhoJbk0UE3CNNsfmC6ZakFMfnIXDfaGd3nBexMJNW5ybNgzfd\/f7Nwjjm38FYe1OcvFwKfEtwjlicfWtwzLtWltynj73dKKYcTMBoqIUh32NR99R9lMRxb9w1eb4\/BpsQg3FztN4RJwuT0T47nIMAoyhoCnjcOPU5q7MrVGBecWeyZE9D1ArAB0Bi6iBCken1fIxJ5bu9+HJywvhcfW9zpFcKPV0w7611RUUOgD9XJs75gMJGhACOYHrsWltC\/fshd77To2eVxq3+I9yQvl70OhXlMz7g3OPv9K86mgCKgEfOzwOd8rAl5hu1S2slGtORzeZ7YjgYV\/AjniANMZVNg1BX0xQE2\/YVgYhixU3umuzep5Q8ENJvYLmjhnbtnfgPORf053P1WDzxe2\/ZKVvV\/N9X+qlmL+yky5+0Ecpz6YqiaB0weip8T6ch5BaSSScL0S0fKVycjpA44cqh1XOJptxrtcoWc37lfkD0O4uLrrfdd9vq6SugRRNRgdo+Y83ihRzdvAnsJjXSWNQczcAf3Ma4uFkoiUzHrVOMnW1iucwO7EbzIOHJqkYBmEZM7WlMeM\/QMMbQdt10UwhdATWEgTQBwLDkEwkiPvKAAyQHO9yGqnakZ+HTWNHj9ZrUVusS1hKyVmbN\/QSPs2qaJH3mwO3NPm4+7TbWJsuOFvzv4YXaKnNNDye+y3kTGvt7srodddo9tpbBAnYMGiQmG8plVFjULdcebdQhWdtGxOm9ac4KE6bVUaLrvTefsQDj43yz6p3od7BTsFkh5vkG8rQ7Wrt1mp7LfqfFx7ToStl4eBoVlQYor6sV+UpSkWF137YzpjqyIYqJ6RCy5zo7SaY09yYVBEH\/dBF1lOwJDf6MU0UsfosuGN7Hh03tcMnYVyDuq5URJRtYC\/z0KxKPPHn\/amwGbDXWU7CsfecnYFHLiTS6LUkP5bVYtKNXNnJUzpq8AsjQY95d8BhbFFOp6h7nlqHfdFW4G5qXJsbcdy\/dPo1LaIFkAJ8BOJGkYHVd3B2REJnUysfwDsgu0wNm8z19y\/9oL2Q8DJ4ywNo+37bZIvGaWCEOIbdMpAeNl9HaOBcOqHAHKd2Ur1AmV9xTIsw7qPGrd4yX6ZecuecCJHHvcxMtdjO+Vmd14pqwQNJbD0DRuZweDtN3akE09m7ju9shien40b\/QB3ET038ms11tDj9Yq7yC5bOYg5mndKkI9qfoaAuukyp3iw4knE\/OxiVyHLaHDCdjDf99VoHtHnrPLERlv8l9Rjjo8cfEmvRuX3RI6ancgkQi9wh0BHCtwhsIz\/RFOXR761b\/6nqeyEEbnzgm3gnUX7HoyQDdO\/F9hVrO+XzDjfxJhKfOZTOSvY4RNf6lneuhN96tDSzGTMM2eTWuhTK0m+t9waUnUio0r7aHKmet+E4JIDIfSRAoZe\/Hbp+Td3FggOXhuv3F4kziB2eRmSo5HwfzC3weS2C3TdXvQ0N8Wolm0qy3RyDeSihJ8TTv3kXW+T9iB4JNqob5l31UwaKTdVzjVSFMzO\/3vxguCOdyPgJy++qSRV\/BYN9YBbYsEyvroc7eU7crzQGEWEb744aOgsw0jZsMK840ISnGDmGMZ0NcGPMCbsUodpdnqZVldgTJ1UKhlgHTqHXDvQAsbFyz1f\/FGET\/QdaajH0RwfMDBAbFmRyydRjkTBQ63S+nPsGI+Qch0rdGoOQvnJk9k4lHz0hFJpl\/CnoPIce1c5PfOTka6KSYMV49r+UNxY4\/O32UbexEvOodoZNbUHWbpR4Zq4gHzVVwLg6hH7VYDY=","hs":"f705a0773e3ecc0a6348575f0f9bbd722cec908f66e270d053154217b1956133"}', true)['pm'];
//$dat = json_decode(file_get_contents('api_login.json'), true)['pm'];
//$dat = json_decode('{"hs":"3dee303b57bbbeefccb66b25c72e9243","pm":"2l/U6spKzAv2hKfXKDlUc494hjoi64+N8yHu0A9c5NkSVGHFI3hP88OFseRP6YsaWiPDiUVnwNNnLARyisHUo/DVyj2FDxje57XWbO+5C/uW7ectqmXbPqlo4gv3XuPAhVUWQZMNxYmf3hfXVP2aI+6avMUr63sN3FFYr/ebSmWKq08ugyRZGnzFitRqC8+3+zIwXOt++70gAfkeWDKzTNMpPChtjlxn5miOCArDs0znhugqD4bMmSSoye2eLzStVRRtCwbaUWp5wdskyrfiNjjBI1WAmwYR9TQt8YWf5PwFZm3jXWpPDYZcRP5hm1ERIcMBK2Ph91hluy2dwPJaTclTYVr05DNVRB46IhONUsMK/mkgvJB8KOFGpuCa1EvvqOpsLwpXjTL4qsTPw+y/AKJ4TypD3sdooixR+5DryUmc="}', true)['pm'];
//$dat = substr($dat, 1);
//$dat = json_decode('{"pm":"fAmrnW9WfKScSM+JsfWR40YzA76cFXkpybPgrhNXs+48Wi0M8Pmn5MLqcrCU4mRV\/6z888IgugL3CiJgjSyHrtlOflAh\/nUz9Xlds0suRx8U3vIzH50+XVUoPuK4heEFe0ZxUcVA7fehONlYTaikwJjKIgpJRsJo7EFpL4XaMqQmV9iksmJdyRvDYtfpDnAyETqhcJTbatjnrXE0FWLaQlvbb9Cnegdn7N9ribXxJmliOyghCHptNHwgeWOjZn9TfShlqBW8AAwF5A\/NSffBxOWyPOyGmnZMC7JR9Wa+I5h2qPJQXBHQ+Ufs8xR+HRAAt4aW9d1xQibpC6nlmo57bgqgoARGwmeBETFJX96gGME=","hs":"3d650d307ed2903ef40101743c4043f01dba302eeddc526705e89b2035fbf5bf"}', true)['pm'];
//$dat = $dat['pm'];
//var_dump(strlen(base64_decode($dat)));
for ($i=2; $i<3; $i++) {
$dec = openssl_decrypt(base64_decode($dat), 'AES-256-CBC', getApiKeyNext($i), OPENSSL_RAW_DATA+OPENSSL_ZERO_PADDING, substr(getApiKey($i), 0, 16));
$data = gzdecode(base64_decode($dec));
file_put_contents('response_login.json', $data);
//var_dump(getApiKeyNext($i), substr(getApiKey($i), 0, 16));
//$dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, getApiKeyNext($i), base64_decode(($dat)), MCRYPT_MODE_CBC, substr(getApiKey($i), 0, 16));
//var_dump((base64_decode($dec)));
//var_dump($dec);
//echo bin2hex($dec);
//$end = base64_decode(trim(substr($dec, 16), "\0"));
//var_dump(bin2hex(base64_decode(substr($dec, 16))));
//echo bin2hex(substr($dec, 0, 2))."\n";
}
<?php
// https://github.com/esterTion/unity-texture-toolkit
require 'UnityBundle.php';
$sndFile = 'MD_AssetbundleDLPackVer';
$dat = file_get_contents($sndFile.'.snd');
$mdkey = 'j6GWCVK9UMKKd3pnNDtxYFSZ4zHiQ9xD';
$mdiv = 'dQATZ4QY7gahQaT5';
$dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $mdkey, $dat, MCRYPT_MODE_CBC, $mdiv);
$pad = ord(substr($dec, -1, 1));
$dec = substr($dec, 0, -$pad);
file_put_contents($sndFile.'-dec.snd.gz', $dec);
file_put_contents($sndFile.'-dec.snd', gzdecode($dec));
$st = new FileStream($sndFile.'-dec.snd');
$st->littleEndian = true;
$st->long;
$entries = $st->long;
$st->long;$st->long;
$map = [];
echo "$entries\n";
for ($i=0; $i<$entries; $i++) {
$name = readString($st);
$val = [
$st->long, // size android
$st->long, // size ios
readString($st), // version_ios
readString($st) // version android
];
$resCount = readString($st);
$val[] = $resCount;
$resCount = intval(substr($resCount, 1));
for ($j = 0; $j<$resCount; $j++) {
$val[] = readString($st);
}
$map[$name] = $val;
echo "\r$i";
//var_dump($name);
//print_r($map[$name]);
//sleep(1);
}
//print_r($map);
file_put_contents($sndFile.'-dec.json', json_encode($map));
function readString($stream) {
$len = ord($stream->byte);
return $stream->readData($len);
}
<?php
if (!function_exists('mb_ord')) {
function mb_ord($v) {
$k = mb_convert_encoding($v, 'UCS-2LE', 'UTF-8');
$k1 = ord(substr($k, 0, 1));
$k2 = ord(substr($k, 1, 1));
return $k2 * 256 + $k1;
}
function mb_chr($num){
return mb_convert_encoding('&#'.intval($num).';', 'UTF-8', 'HTML-ENTITIES');
}
}
require 'UnityBundle.php';
$sndFile = 'MD_Costume';
$sndMemberType = parseMemberType('osososoioioiososoioioioioiosoioioioioiosososososososososososososososoioioioiososososososososososososoiososoioi');
$sndMemberName = ['_ID','_Name','_Detail','_IsShowCollection','_ShowCollectionNo','_Default','_GraphicID','_CanEquipCharacterIds','_Rarity','_WeaponKind','_ItemKindID','_InitMaxLevel','_MaxLevel','_ExpTableID','_Element','_HPLevel1','_HPLevelMax','_AttackLevel1','_AttackLevelMax','_ActiveSkillID','_ActiveSkillIDLB1','_ActiveSkillIDLB2','_ActiveSkillIDLB3','_ActiveSkillIDLB4','_ActiveSkillID2','_ActiveSkillID2LB1','_ActiveSkillID2LB2','_ActiveSkillID2LB3','_ActiveSkillID2LB4','_LeaderSkillID','_LeaderSkillIDLB1','_LeaderSkillIDLB2','_LeaderSkillIDLB3','_LeaderSkillIDLB4','_GainExp','_SellGameCoin','_SellDollsPoint','_SellRealCoinFree','_UnLockSubScenarioID','_SpecialID','_HeadAvatarID','_FaceAvatarID','_EarAvatarID','_UpBodyAvatarID','_LowBodyAvatarID','_AnotherHeadAvatarID','_AnotherFaceAvatarID','_AnotherEarAvatarID','_AnotherUpBodyAvatarID','_AnotherLowBodyAvatarID','_CostumeVersion','_LimitbreakBonusHPID','_LimitbreakBonusATKID','_MaxLimitbreakCount','_IsSubLimited'];
//$sndFile = 'MD_AssetbundleDLPackVer';
//$sndMemberType = 'siissas';
$dat = file_get_contents($sndFile.'.snd');
$mdkey = 'j6GWCVK9UMKKd3pnNDtxYFSZ4zHiQ9xD';
$mdiv = 'dQATZ4QY7gahQaT5';
$dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $mdkey, $dat, MCRYPT_MODE_CBC, $mdiv);
$pad = ord(substr($dec, -1, 1));
$dec = substr($dec, 0, -$pad);
file_put_contents($sndFile.'-dec.snd.gz', $dec);
file_put_contents($sndFile.'-dec.snd', gzdecode($dec));
$st = new FileStream($sndFile.'-dec.snd');
$st->littleEndian = true;
$st->long;
$entries = $st->long;
$st->long;$st->long;
$map = [];
echo "$entries\n";
for ($i=0; $i<$entries; $i++) {
$val = [];
for ($j=0; $j<count($sndMemberType); $j++) {
$name = $sndMemberName[$j];
$value = readValue($sndMemberType[$j], $st);
$val[$name] = $value;
}
$map[$val['_ID']] = $val['_Name'];
echo "\r$i";
}
file_put_contents($sndFile.'-dec.json', json_encode($map));
function parseMemberType($typeStr) {
$val = [];
for ($i=0; $i<strlen($typeStr); $i++) {
//$isArray = false;
$isObfuscated = false;
/*if ($typeStr[$i] == 'a') {
$isArray = true;
$i++;
}*/
if ($typeStr[$i] == 'o') {
$isObfuscated = true;
$i++;
}
$val[] = [
'type' => $typeStr[$i],
//'isArray' => $isArray,
'isObfuscated' => $isObfuscated
];
}
return $val;
}
function readValue($type, Stream $stream) {
switch ($type['type']) {
case 's' : {
$len = ord($stream->byte);
$str = $stream->readData($len);
if ($type['isObfuscated']) {
// SimpleModules__Shift(string source, int shift, int step)
$output = '';
$shift = 11; $step = 3;
for ($i=0; $i<mb_strlen($str, 'UTF-8'); $i++) {
$v9 = mb_ord(mb_substr($str, $i, 1, 'UTF-8'));
$v11 = ($v9 + $shift);
$output .= mb_chr($v11);
$shift += $step;
}
$str = $output;
}
return $str;
}
case 'i': {
$val = $stream->long;
if ($type['isObfuscated']) {
$val ^= 0x7fef;
}
return $val;
}
default: {
throw new Exception("unknown type {$type[$index]}");
}
}
}
<?php
if (isset($_SERVER['HTTP_HOST']))exit;
require 'UnityAsset.php';
define('RES_DIR', '/data/home/web/_redive/tokyodolls/card/');
$key = implode('', array_reverse(str_split(base64_decode('Y2VJOCQpWSNZcyRyNVJGNVd8NFctXzE7Kkw7KVZVenc='), 1)));
$iv = implode('', array_reverse(str_split(base64_decode('ZTBnJDJuUnAmIWRBUVJXP2pxeCxXPn1FI2ZKRzFEKkw='), 1)));
$manifest = json_decode(file_get_contents('MD_AssetbundleDLPackVer-dec.json'), true);
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_CONNECTTIMEOUT=>5,
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_HEADER=>0,
CURLOPT_FILETIME=>true,
CURLOPT_SSL_VERIFYPEER=>false
]);
foreach ($manifest as $fileName=>$info) {
if (!preg_match('/_Costume_/', $fileName)) continue;
_log("Downloading $fileName ({$info[0]})");
$url = MakeUrlCore("cache.projecttokyodolls.jp", "dolls.prd.cdn", $fileName.'.abip', $info[2], 'ios');
curl_setopt($curl, CURLOPT_URL, $url);
$bundle = curl_exec($curl);
if (strlen($bundle) !== $info[0]) {
_log('Size mismatch, received: '.strlen($bundle));
exit;
continue;
}
$bundle = new MemoryStream($bundle);
$bundle->littleEndian = true;
if ($bundle->readData(4) !== 'ppir') {
_log('Wrong header');
continue;
}
$bundle->long; $bundle->long;
$dataOffset = $bundle->long;
$bundle->long; $bundle->long; $bundle->long;
$dataLen = $bundle->long;
$bundle->position = $dataOffset;
$bundle = $bundle->readData($dataLen);
$head = substr($bundle, 0, 0x400);
$body = substr($bundle, 0x400);
$headdec = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $head, MCRYPT_MODE_CBC, $iv);
$bundle = $headdec.$body;
$assetList = extractBundle(new MemoryStream($bundle));
foreach ($assetList as $assetFile) {
$asset = new AssetFile($assetFile);
foreach ($asset->preloadTable as $item) {
if ($item->typeString == 'Texture2D') {
$item = new Texture2D($item, true);
$item->exportTo(RES_DIR.$item->name, 'webp', '-lossless 1');
}
}
$asset->__desctruct();
unset($asset);
}
array_map('unlink', $assetList);
}
function _log($s) {
echo date('H:i:s ').$s."\n";
}
function MakeUrlCore(string $domain, string $backet, string $fileName, int $version, string $platform) {
$hash = md5("${backet}/${version}");
return "http://${domain}/".md5(
substr($hash, hexdec($hash[0]))
)."/${platform}/${fileName}";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment