Version: 1.0.0.1
Generated Key: 1ad894691092f45281f9e7a7ef8019f1
Decoded Company Name: TianJi Information Technology Inc.
Version: 1.0.0.1
Generated Key: 1ad894691092f45281f9e7a7ef8019f1
Decoded Company Name: TianJi Information Technology Inc.
arm64-v8a2 这个目录的 能在给抓下吗 感谢
发游戏链接这个函数结构不一样不确定能不能解密
Version: 2.1.0.0
Generated Key: bb0f5f0ae9d8d5fcb996b5d8d1aefec9
Decoded Company Name: TianJiTianJi Information Technology Inc.
Version: 2.1.0.0
Generated Key: f43599a8c6bf152329ac7e4a18d62b2a
Decoded Company Name: TianJi Information Technology Inc.
两个密钥试试先
就算能解密也发一下游戏链接这个函数的结构还有一些细节不大一样短名也被加密了
记得之前有个dmm的游戏拼接的两个字符串和这个一样
libcocos2dlua.zip (5.2 MB)
大佬,这也有一个TJ的但和之前的不太一样,找不到前缀后缀日期,帮看看,谢谢
游戏地址http://pocket.kaka.mba:84/
void __usercall cocostudio::FlatBuffersSerialize::serializeFlatBuffersWithXMLFile(
cocos2d::FileUtils *a1@<X0>,
__int64 a2@<X1>,
__int64 a3@<X2>,
__int64 a4@<X8>)
{
__int64 Instance; // x0
cocos2d::FileUtils *v9; // x0
__int64 v10; // x0
cocos2d::FileUtils *v11; // x0
__int64 v12; // x0
__int64 v13; // x0
tinyxml2::XMLDocument *v14; // x22
const char *v15; // x1
tinyxml2::XMLNode *ChildElement; // x0
__int64 SiblingElement; // x0
char *v18; // x22
tinyxml2::XMLNode *v19; // x23
tinyxml2::StrPair *v20; // x28
const char *Str; // x0
_QWORD *v22; // x21
const char *v23; // x0
char *v24; // x21
size_t v25; // x0
const char *v26; // x0
char *v27; // x0
flatbuffers::FlatBufferBuilder *v28; // x0
flatbuffers::FlatBufferBuilder *v29; // x24
_QWORD *v30; // x25
unsigned int v31; // w24
tinyxml2::XMLNode *i; // x27
int AnimationInfo; // w0
char *v34; // x8
char *v35; // x21
size_t v36; // x0
char v37; // w21
unsigned __int64 v38; // x8
char *v39; // x0
char *v40; // x0
size_t v41; // x24
char *v42; // x26
char *v43; // x27
unsigned __int64 v44; // x21
const char *v45; // x27
size_t v46; // x0
size_t v47; // x26
char *v48; // x28
unsigned __int64 v49; // x21
unsigned __int64 v50; // x9
const void *v51; // x0
char *v52; // x0
_QWORD *v53; // x21
const char *v54; // x0
char *v55; // x0
unsigned __int64 v56; // x8
__int64 v57; // x25
bool v58; // zf
unsigned __int64 v59; // x8
const char *v60; // x1
unsigned __int64 v61; // x2
__int64 v62; // x21
flatbuffers::FlatBufferBuilder *v63; // x26
__int64 v64; // x23
__int64 v65; // x22
unsigned int v66; // w26
__int64 v67; // x21
flatbuffers::FlatBufferBuilder *v68; // x27
__int64 v69; // x23
__int64 v70; // x22
unsigned int v71; // w27
unsigned int *v72; // x21
flatbuffers::FlatBufferBuilder *v73; // x28
unsigned __int64 v74; // x22
unsigned __int64 v75; // x23
unsigned __int64 v76; // x23
unsigned int v77; // w0
unsigned int CSParseBinary; // w0
cocos2d::FileUtils *v79; // x0
__int64 v80; // x9
__int64 v81; // x0
void *v82; // x8
char *v83; // x21
unsigned __int64 v84; // x9
int v85; // w10
size_t v86; // x22
char *v87; // x23
__int64 v88; // x0
bool v89; // w4
__int64 v90; // x9
const char *v91; // x1
int v92; // w12
int v93; // w9
flatbuffers *v94; // x0
char *v95; // x0
size_t v96; // x21
const void *v97; // x22
char *v98; // x23
char v99; // w10
char *v100; // x0
unsigned int NodeAction; // [xsp+10h] [xbp-150h]
unsigned int String; // [xsp+18h] [xbp-148h]
__int64 v103; // [xsp+20h] [xbp-140h]
cocostudio::FlatBuffersSerialize *v104; // [xsp+28h] [xbp-138h]
__int128 v105; // [xsp+30h] [xbp-130h] BYREF
void *v106; // [xsp+40h] [xbp-120h]
void *v107[2]; // [xsp+50h] [xbp-110h] BYREF
void *v108; // [xsp+60h] [xbp-100h]
int v109; // [xsp+68h] [xbp-F8h] BYREF
__int128 v110; // [xsp+70h] [xbp-F0h] BYREF
void *v111; // [xsp+80h] [xbp-E0h]
unsigned __int64 v112; // [xsp+90h] [xbp-D0h] BYREF
size_t v113; // [xsp+98h] [xbp-C8h]
void *v114; // [xsp+A0h] [xbp-C0h]
void *v115; // [xsp+A8h] [xbp-B8h] BYREF
char *v116; // [xsp+B0h] [xbp-B0h]
char *v117; // [xsp+B8h] [xbp-A8h]
__int128 v118; // [xsp+C0h] [xbp-A0h] BYREF
char *v119; // [xsp+D0h] [xbp-90h]
_QWORD v120[2]; // [xsp+D8h] [xbp-88h] BYREF
char *v121; // [xsp+E8h] [xbp-78h]
_QWORD v122[4]; // [xsp+F0h] [xbp-70h] BYREF
v122[3] = *(_QWORD *)(_ReadStatusReg(TPIDR_EL0) + 40);
Instance = cocos2d::FileUtils::getInstance(a1);
v9 = (cocos2d::FileUtils *)(*(_QWORD *(__fastcall **)(_QWORD *__return_ptr, __int64, __int64))(*(_QWORD *)Instance
+ 48LL))(
v122,
Instance,
a2);
v10 = cocos2d::FileUtils::getInstance(v9);
v11 = (cocos2d::FileUtils *)(*(__int64 (__fastcall **)(__int64, _QWORD *))(*(_QWORD *)v10 + 264LL))(v10, v122);
if ( ((unsigned __int8)v11 & 1) == 0 )
{
*(_QWORD *)(a4 + 8) = 0;
*(_QWORD *)(a4 + 16) = 0;
*(_QWORD *)a4 = 0;
v27 = (char *)operator new(0x20u);
*(_QWORD *)(a4 + 16) = v27;
*(_OWORD *)a4 = xmmword_CBD830;
strcpy(v27, ".csd file does not exist.");
if ( (v122[0] & 1) == 0 )
return;
LABEL_24:
operator delete((void *)v122[2]);
return;
}
v12 = cocos2d::FileUtils::getInstance(v11);
cocos2d::FileUtils::getStringFromFile(v120, v12, v122);
v13 = operator new(0x280u, (const std::nothrow_t *)&std::nothrow);
v14 = (tinyxml2::XMLDocument *)v13;
if ( v13 )
tinyxml2::XMLDocument::XMLDocument(v13, 1, 0);
if ( (v120[0] & 1) != 0 )
v15 = v121;
else
v15 = (char *)v120 + 1;
tinyxml2::XMLDocument::Parse(v14, v15, 0xFFFFFFFFFFFFFFFFLL);
ChildElement = (tinyxml2::XMLNode *)tinyxml2::XMLNode::FirstChildElement(v14, 0);
v103 = a3;
v104 = a1;
SiblingElement = tinyxml2::XMLNode::FirstChildElement(ChildElement, 0);
v119 = 0;
v118 = 0u;
if ( !SiblingElement )
goto LABEL_20;
v18 = (char *)a1 + 72;
while ( 1 )
{
v19 = (tinyxml2::XMLNode *)SiblingElement;
v20 = (tinyxml2::StrPair *)(SiblingElement + 24);
Str = (const char *)tinyxml2::StrPair::GetStr((tinyxml2::StrPair *)(SiblingElement + 24));
if ( !strcmp("PropertyGroup", Str) )
{
v22 = (_QWORD *)*((_QWORD *)v19 + 12);
if ( v22 )
{
while ( 1 )
{
v23 = (const char *)tinyxml2::StrPair::GetStr((tinyxml2::StrPair *)(v22 + 1));
if ( !strcmp("Version", v23) )
break;
v22 = (_QWORD *)v22[7];
if ( !v22 )
goto LABEL_15;
}
v24 = (char *)tinyxml2::StrPair::GetStr((tinyxml2::StrPair *)(v22 + 4));
v25 = strlen(v24);
std::string::assign((int)v18, v24, v25);
}
LABEL_15:
std::string::assign((int)v18, "2.1.0.0", 7u);
}
v26 = (const char *)tinyxml2::StrPair::GetStr(v20);
if ( !strcmp("Content", v26) && !*((_QWORD *)v19 + 12) )
break;
SiblingElement = tinyxml2::XMLNode::FirstChildElement(v19, 0);
if ( !SiblingElement )
{
SiblingElement = tinyxml2::XMLNode::NextSiblingElement(v19, 0);
if ( !SiblingElement )
goto LABEL_20;
}
}
std::string::assign((int)&v118, "NodeObjectData", 0xEu);
v28 = (flatbuffers::FlatBufferBuilder *)operator new(0x68u, (const std::nothrow_t *)&std::nothrow);
v29 = v28;
if ( v28 )
flatbuffers::FlatBufferBuilder::FlatBufferBuilder(v28, 0x400u, 0);
*((_QWORD *)v104 + 7) = v29;
v116 = 0;
v117 = 0;
v115 = 0;
v30 = (_QWORD *)tinyxml2::XMLNode::FirstChildElement(v19, 0);
if ( v30 )
{
v31 = 0;
NodeAction = 0;
while ( 1 )
{
v45 = (const char *)tinyxml2::StrPair::GetStr((tinyxml2::StrPair *)(v30 + 3));
v113 = 0;
v114 = 0;
v112 = 0;
v46 = strlen(v45);
v47 = v46;
if ( v46 >= 0xFFFFFFFFFFFFFFF0LL )
std::__basic_string_common<true>::__throw_length_error(&v112);
if ( v46 >= 0x17 )
break;
v48 = (char *)&v112 + 1;
LOBYTE(v112) = 2 * v46;
if ( v46 )
goto LABEL_70;
LABEL_71:
v48[v47] = 0;
v50 = v113;
if ( (v112 & 1) == 0 )
v50 = (unsigned __int64)(unsigned __int8)v112 >> 1;
switch ( v50 )
{
case 0xDuLL:
if ( (v112 & 1) != 0 )
v55 = (char *)v114;
else
v55 = (char *)&v112 + 1;
if ( !memcmp(v55, "AnimationList", 0xDu) )
{
for ( i = (tinyxml2::XMLNode *)tinyxml2::XMLNode::FirstChildElement((tinyxml2::XMLNode *)v30, 0);
i;
i = (tinyxml2::XMLNode *)tinyxml2::XMLNode::NextSiblingElement(i, 0) )
{
AnimationInfo = cocostudio::FlatBuffersSerialize::createAnimationInfo(v104, i);
v34 = v116;
v109 = AnimationInfo;
if ( v116 == v117 )
{
std::vector<flatbuffers::Offset<flatbuffers::AnimationInfo>>::__push_back_slow_path<flatbuffers::Offset<flatbuffers::AnimationInfo> const&>(
&v115,
&v109);
}
else
{
*(_DWORD *)v116 = AnimationInfo;
v116 = v34 + 4;
}
}
}
break;
case 0xAuLL:
if ( (v112 & 1) != 0 )
v52 = (char *)v114;
else
v52 = (char *)&v112 + 1;
if ( !memcmp(v52, "ObjectData", 0xAu) )
{
v53 = (_QWORD *)v30[12];
if ( v53 )
{
while ( 1 )
{
v54 = (const char *)tinyxml2::StrPair::GetStr((tinyxml2::StrPair *)(v53 + 1));
if ( !strcmp("ctype", v54) )
break;
v53 = (_QWORD *)v53[7];
if ( !v53 )
goto LABEL_40;
}
v35 = (char *)tinyxml2::StrPair::GetStr((tinyxml2::StrPair *)(v53 + 4));
v36 = strlen(v35);
std::string::assign((int)&v118, v35, v36);
}
LABEL_40:
v37 = v118;
v38 = *((_QWORD *)&v118 + 1);
if ( (v118 & 1) == 0 )
v38 = (unsigned __int64)(unsigned __int8)v118 >> 1;
if ( v38 == 19 )
{
if ( (v118 & 1) != 0 )
v40 = v119;
else
v40 = (char *)&v118 + 1;
if ( !memcmp(v40, "GameLayerObjectData", 0x13u) )
{
LABEL_53:
std::string::assign((int)&v118, "NodeObjectData", 0xEu);
v37 = v118;
}
}
else if ( v38 == 18 )
{
v39 = (v118 & 1) != 0 ? v119 : (char *)&v118 + 1;
if ( !memcmp(v39, "GameNodeObjectData", 0x12u) )
goto LABEL_53;
}
v111 = 0;
v110 = 0u;
if ( (v37 & 1) == 0 )
{
v111 = v119;
v110 = v118;
goto LABEL_63;
}
v41 = *((_QWORD *)&v118 + 1);
if ( *((_QWORD *)&v118 + 1) >= 0xFFFFFFFFFFFFFFF0LL )
std::__basic_string_common<true>::__throw_length_error(&v110);
v42 = v119;
if ( *((_QWORD *)&v118 + 1) >= 0x17u )
{
v44 = (*((_QWORD *)&v118 + 1) + 16LL) & 0xFFFFFFFFFFFFFFF0LL;
v43 = (char *)operator new(v44);
*((_QWORD *)&v110 + 1) = v41;
v111 = v43;
*(_QWORD *)&v110 = v44 | 1;
}
else
{
v43 = (char *)&v110 + 1;
LOBYTE(v110) = 2 * BYTE8(v118);
if ( !*((_QWORD *)&v118 + 1) )
goto LABEL_62;
}
memcpy(v43, v42, v41);
LABEL_62:
v43[v41] = 0;
LABEL_63:
v31 = cocostudio::FlatBuffersSerialize::createNodeTree(v104, v30, &v110);
if ( (v110 & 1) != 0 )
operator delete(v111);
}
break;
case 9uLL:
v51 = (v112 & 1) != 0 ? v114 : (char *)&v112 + 1;
if ( !memcmp(v51, "Animation", 9u) )
NodeAction = cocostudio::FlatBuffersSerialize::createNodeAction(v104, (const tinyxml2::XMLElement *)v30);
break;
}
v30 = (_QWORD *)tinyxml2::XMLNode::NextSiblingElement((tinyxml2::XMLNode *)v30, 0);
if ( (v112 & 1) != 0 )
operator delete(v114);
if ( !v30 )
goto LABEL_96;
}
v49 = (v46 + 16) & 0xFFFFFFFFFFFFFFF0LL;
v48 = (char *)operator new(v49);
v113 = v47;
v114 = v48;
v112 = v49 | 1;
LABEL_70:
memcpy(v48, v45, v47);
goto LABEL_71;
}
v31 = 0;
NodeAction = 0;
LABEL_96:
v56 = *((unsigned __int8 *)v104 + 72);
v57 = *((_QWORD *)v104 + 7);
v58 = (v56 & 1) == 0;
v59 = v56 >> 1;
if ( v58 )
v60 = v18 + 1;
else
v60 = (const char *)*((_QWORD *)v104 + 11);
if ( v58 )
v61 = v59;
else
v61 = *((_QWORD *)v104 + 10);
String = flatbuffers::FlatBufferBuilder::CreateString(*((flatbuffers::FlatBufferBuilder **)v104 + 7), v60, v61);
v62 = *(_QWORD *)v104;
v63 = (flatbuffers::FlatBufferBuilder *)*((_QWORD *)v104 + 7);
v64 = *((_QWORD *)v104 + 1) - *(_QWORD *)v104;
flatbuffers::FlatBufferBuilder::StartVector(v63, v64 >> 2, 4u);
if ( v64 >> 2 )
{
v65 = (v64 >> 2) - 1;
do
flatbuffers::FlatBufferBuilder::PushElement<flatbuffers::String>(v63, *(unsigned int *)(v62 + 4 * v65--));
while ( v65 != -1 );
}
v66 = flatbuffers::FlatBufferBuilder::PushElement<unsigned int>(v63, (unsigned __int64)v64 >> 2);
v67 = *((_QWORD *)v104 + 3);
v68 = (flatbuffers::FlatBufferBuilder *)*((_QWORD *)v104 + 7);
v69 = *((_QWORD *)v104 + 4) - v67;
flatbuffers::FlatBufferBuilder::StartVector(v68, v69 >> 2, 4u);
if ( v69 >> 2 )
{
v70 = (v69 >> 2) - 1;
do
flatbuffers::FlatBufferBuilder::PushElement<flatbuffers::String>(v68, *(unsigned int *)(v67 + 4 * v70--));
while ( v70 != -1 );
}
v71 = flatbuffers::FlatBufferBuilder::PushElement<unsigned int>(v68, (unsigned __int64)v69 >> 2);
v72 = (unsigned int *)v115;
v73 = (flatbuffers::FlatBufferBuilder *)*((_QWORD *)v104 + 7);
v74 = v116 - (_BYTE *)v115;
v75 = (v116 - (_BYTE *)v115) >> 2;
flatbuffers::FlatBufferBuilder::StartVector(v73, v75, 4u);
if ( v75 )
{
v76 = v75 - 1;
do
flatbuffers::FlatBufferBuilder::PushElement<flatbuffers::AnimationInfo>(v73, v72[v76--]);
while ( v76 != -1 );
}
v77 = flatbuffers::FlatBufferBuilder::PushElement<unsigned int>(v73, v74 >> 2);
CSParseBinary = flatbuffers::CreateCSParseBinary(v57, String, v66, v71, v31, NodeAction, v77);
v79 = (cocos2d::FileUtils *)flatbuffers::FlatBufferBuilder::Finish<flatbuffers::CSParseBinary>(
*((_QWORD *)v104 + 7),
CSParseBinary,
0);
v80 = *((_QWORD *)v104 + 3);
*((_QWORD *)v104 + 1) = *(_QWORD *)v104;
*((_QWORD *)v104 + 4) = v80;
v81 = cocos2d::FileUtils::getInstance(v79);
(*(void (__fastcall **)(void **__return_ptr, __int64, __int64))(*(_QWORD *)v81 + 48LL))(v107, v81, v103);
if ( ((__int64)v107[0] & 1) != 0 )
v82 = v107[1];
else
v82 = (void *)((unsigned __int64)LOBYTE(v107[0]) >> 1);
if ( ((__int64)v107[0] & 1) != 0 )
v83 = (char *)v108;
else
v83 = (char *)v107 + 1;
if ( v82 )
{
v84 = (unsigned __int64)v82;
while ( v84 )
{
v85 = (unsigned __int8)v83[--v84];
if ( v85 == 46 )
goto LABEL_123;
}
}
v84 = -1;
LABEL_123:
if ( (unsigned __int64)v82 >= v84 )
v86 = v84;
else
v86 = (size_t)v82;
v113 = 0;
v114 = 0;
v112 = 0;
if ( v86 >= 0xFFFFFFFFFFFFFFF0LL )
std::__basic_string_common<true>::__throw_length_error(&v112);
if ( v86 >= 0x17 )
{
v87 = (char *)operator new((v86 + 16) & 0xFFFFFFFFFFFFFFF0LL);
v113 = v86;
v114 = v87;
v112 = (v86 + 16) & 0xFFFFFFFFFFFFFFF0LL | 1;
goto LABEL_131;
}
v87 = (char *)&v112 + 1;
LOBYTE(v112) = 2 * v86;
if ( v86 )
LABEL_131:
memcpy(v87, v83, v86);
v87[v86] = 0;
v88 = std::string::append((int)&v112, ".csb", 4u);
v106 = 0;
v105 = 0u;
if ( (*(_BYTE *)v88 & 1) == 0 )
{
v106 = *(void **)(v88 + 16);
v105 = *(_OWORD *)v88;
if ( (v112 & 1) == 0 )
goto LABEL_135;
goto LABEL_134;
}
v96 = *(_QWORD *)(v88 + 8);
if ( v96 >= 0xFFFFFFFFFFFFFFF0LL )
std::__basic_string_common<true>::__throw_length_error(&v105);
v97 = *(const void **)(v88 + 16);
if ( v96 >= 0x17 )
{
v98 = (char *)operator new((v96 + 16) & 0xFFFFFFFFFFFFFFF0LL);
*((_QWORD *)&v105 + 1) = v96;
v106 = v98;
*(_QWORD *)&v105 = (v96 + 16) & 0xFFFFFFFFFFFFFFF0LL | 1;
goto LABEL_152;
}
v98 = (char *)&v105 + 1;
LOBYTE(v105) = 2 * v96;
if ( v96 )
LABEL_152:
memcpy(v98, v97, v96);
v98[v96] = 0;
if ( (v112 & 1) != 0 )
LABEL_134:
operator delete(v114);
LABEL_135:
v90 = *((_QWORD *)v104 + 7);
v91 = *(const char **)(v90 + 24);
v92 = *(_DWORD *)(v90 + 8);
v93 = *(_DWORD *)(v90 + 16);
if ( (v105 & 1) != 0 )
v94 = (flatbuffers *)v106;
else
v94 = (flatbuffers *)((char *)&v105 + 1);
if ( (flatbuffers::SaveFile(v94, v91, (const char *)(unsigned int)(v92 - (_DWORD)v91 + v93), 1u, v89) & 1) != 0 )
{
cocostudio::FlatBuffersSerialize::deleteFlatBufferBuilder(v104);
if ( (v105 & 1) != 0 )
{
operator delete(v106);
if ( ((__int64)v107[0] & 1) == 0 )
{
LABEL_141:
v95 = (char *)v115;
if ( !v115 )
goto LABEL_20;
goto LABEL_163;
}
}
else if ( ((__int64)v107[0] & 1) == 0 )
{
goto LABEL_141;
}
operator delete(v108);
v95 = (char *)v115;
if ( !v115 )
{
LABEL_20:
*(_QWORD *)(a4 + 8) = 0;
*(_QWORD *)(a4 + 16) = 0;
*(_QWORD *)a4 = 0;
goto LABEL_21;
}
LABEL_163:
v116 = v95;
operator delete(v95);
goto LABEL_20;
}
v99 = v105;
*(_QWORD *)(a4 + 8) = 0;
*(_QWORD *)(a4 + 16) = 0;
*(_QWORD *)a4 = 0;
strcpy((char *)a4, "(couldn't save files!");
if ( (v99 & 1) == 0 )
{
if ( ((__int64)v107[0] & 1) == 0 )
goto LABEL_149;
LABEL_156:
operator delete(v108);
v100 = (char *)v115;
if ( !v115 )
goto LABEL_21;
goto LABEL_157;
}
operator delete(v106);
if ( ((__int64)v107[0] & 1) != 0 )
goto LABEL_156;
LABEL_149:
v100 = (char *)v115;
if ( !v115 )
{
LABEL_21:
if ( (v118 & 1) == 0 )
goto LABEL_22;
goto LABEL_158;
}
LABEL_157:
v116 = v100;
operator delete(v100);
if ( (v118 & 1) == 0 )
{
LABEL_22:
if ( (v120[0] & 1) == 0 )
goto LABEL_23;
goto LABEL_159;
}
LABEL_158:
operator delete(v119);
if ( (v120[0] & 1) == 0 )
{
LABEL_23:
if ( (v122[0] & 1) == 0 )
return;
goto LABEL_24;
}
LABEL_159:
operator delete(v121);
if ( (v122[0] & 1) != 0 )
goto LABEL_24;
}
你这个应该是新版的
密钥在
cocos2d::FileUtils::jdksojhks
生成
可以尝试hook获取cocos2d::FileUtils::s_xxteaKey
你这个和他们上面的不一样
import hashlib, xxtea, lz4.block, sys
class RC4:
def __init__(self, key: bytes):
if isinstance(key, str):
key = key.encode()
self._S = list(range(256))
j = 0
for i in range(256):
j = (j + self._S[i] + key[i % len(key)]) % 256
self._S[i], self._S[j] = self._S[j], self._S[i]
def crypt(self, d: bytes) -> bytes:
i, j, r = 0, 0, bytearray()
for b in d:
i = (i + 1) % 256
j = (j + self._S[i]) % 256
self._S[i], self._S[j] = self._S[j], self._S[i]
r.append(b ^ self._S[(self._S[i] + self._S[j]) % 256])
return bytes(r)
if __name__ == "__main__":
with open(sys.argv[1], "rb") as f:
d = f.read()
ft = d[2]
p = b""
if ft in (0x21, 0x65):
enc = d[23:]
pl = (4 - (len(enc) % 4)) % 4
if pl > 0:
enc += b"\x00" * pl
df = xxtea.decrypt(
enc,
bytes(
a ^ b
for a, b in zip(
bytes.fromhex("a4799014170a71a9b4e9ed087960e997"), d[3:19]
)
),
padding=False,
)
ol = int.from_bytes(df[-4:], "little")
p = df[:ol]
elif ft == 0x7A:
p = d[7:]
if ft in (0x21, 0x7A):
p = lz4.block.decompress(
p[4:], uncompressed_size=int.from_bytes(p[:4], "little")
)
if ft in (0x21, 0x65):
fd = RC4(hashlib.md5("52ds5d21".encode()).hexdigest().encode("ascii")).crypt(
p
)
else:
fd = p
with open("dec", 'wb') as f:
f.write(fd)
感谢
链接:百度网盘 请输入提取码
提取码:xug2
是这个 第二个秘钥可以解 和365之前关服的 欲望少女 基本无差的
so.zip (5.6 MB)
顺便能方便在看看这个秘钥么
Version: 2.1.0.0
Generated Key: be4add21cbfc33896be4afc311695496
Decoded Company Name: TianJi Information Technology Inc.
so.rar (4.2 MB)
大佬 在帮忙看下这个 最近突然出现好多这样的游戏
发url好让其他人遇到一样的游戏方便解
https://pan.qingyuji.cn/f/0Mv4i8/lzjd.apk 这里 他是直链的。。 没官网
。。。记得带上游戏名:龙珠激斗(Dragonball Mobile)
import sys
import struct
import lz4.block
S_XXTEA_KEY = b"\x1a\xa3\x4b\xac\x2c\x85\xb1\x8e\x9a\xd0\xa2\xc3\x0f\x97\x62\xf4"
def to_words(d):
nw = (len(d) + 3) // 4
return list(struct.unpack(f"<{nw}I", d.ljust(nw * 4, b"\0")))
def to_bytes(words):
return struct.pack(f"<{len(words)}I", *words)
def xxtea_decrypt(d, dk):
DELTA = 0x9E3779B9
SUM_OFFSET = 0xB54CDA56
v = to_words(d)
k = to_words(dk)
n = len(v)
if n <= 1:
return to_bytes(v)
sv = (52 // n * DELTA + SUM_OFFSET) & 0xFFFFFFFF
y = v[0]
while sv != 0:
e = (sv >> 2) & 3
p = n - 1
while p > 0:
z = v[p - 1]
mx = ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) & 0xFFFFFFFF
dk = ((sv ^ y) + (k[(p & 3) ^ e] ^ z)) & 0xFFFFFFFF
v[p] = (v[p] - (mx ^ dk)) & 0xFFFFFFFF
y = v[p]
p -= 1
z = v[n - 1]
mx = ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) & 0xFFFFFFFF
dk = ((sv ^ y) + (k[(p & 3) ^ e] ^ z)) & 0xFFFFFFFF
v[0] = (v[0] - (mx ^ dk)) & 0xFFFFFFFF
y = v[0]
sv = (sv - DELTA) & 0xFFFFFFFF
return to_bytes(v)
def decrypt(i, o):
with open(i, "rb") as f:
enc = f.read()
s = enc[2]
es = struct.unpack("<I", enc[19:23])[0]
if s == 33:
km = enc[3:19]
dk = bytes([S_XXTEA_KEY[i] ^ km[i] for i in range(16)])
ed = enc[23:]
xd = xxtea_decrypt(ed, dk)
dec = lz4.block.decompress(
xd[4 : 4 + (struct.unpack("<I", xd[-4:])[0] - 4)], uncompressed_size=es
)
elif s == 101:
km = enc[3:19]
dk = bytes([S_XXTEA_KEY[i] ^ km[i] for i in range(16)])
ed = enc[23:]
dec = xxtea_decrypt(ed, dk)[:es]
if dec:
with open(o, "wb") as f:
f.write(dec)
if __name__ == "__main__":
decrypt(sys.argv[1], "dec")
各位大老们,有没有办法帮忙找一下xxtea的key
疑似有混淆,不知道如何下手算出來:
void __fastcall FTUtils::generateKey(unsigned __int8 *a1)
{
unsigned __int64 v1; // x22
char *v3; // x19
__int64 v4; // x0
__int64 v5; // x0
__int64 v6; // x0
__int64 v7; // x0
unsigned __int64 v8; // x8
bool v9; // zf
unsigned __int64 v10; // x8
unsigned __int8 *v11; // x1
unsigned __int64 v12; // x2
int v13; // w2
unsigned __int64 v14; // x8
unsigned __int64 v15; // x12
unsigned __int64 v16; // x16
signed __int64 v17; // x11
_BOOL4 v18; // w10
unsigned __int64 v19; // x13
unsigned __int64 v20; // x13
__int64 *v21; // x12
char v22; // w12
_BYTE *v23; // x8
unsigned __int64 v24; // x17
CCCrypto *v25; // x0
unsigned __int64 v26; // x1
__int64 v27; // x0
__int64 v28; // x20
cocos2d::LuaEngine *v29; // x0
_BYTE v30[15]; // [xsp+9h] [xbp-57h] BYREF
void *v31; // [xsp+18h] [xbp-48h]
__int64 v32; // [xsp+20h] [xbp-40h] BYREF
unsigned __int64 v33; // [xsp+28h] [xbp-38h]
void *v34; // [xsp+30h] [xbp-30h]
__int64 v35; // [xsp+38h] [xbp-28h]
v1 = _ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2));
v35 = *(_QWORD *)(v1 + 40);
v33 = 0LL;
v34 = 0LL;
v32 = 0LL;
v3 = (char *)operator new(0x30uLL);
*(_QWORD *)&v30[7] = 28160LL;
v31 = 0LL;
*(_QWORD *)v30 = *(_QWORD *)"#$@nvshen";
strcpy(v3, "72c159a24b3f969397bc29918a8ef15b");
v4 = std::string::append(&v32, v3, 32LL);
v5 = std::string::append(v4, "=", 1LL);
v6 = std::string::append(v5, v30, 9LL);
v7 = std::string::append(v6, "=", 1LL);
v8 = *a1;
v9 = (v8 & 1) == 0;
v10 = v8 >> 1;
if ( v9 )
v11 = a1 + 1;
else
v11 = (unsigned __int8 *)*((_QWORD *)a1 + 2);
if ( v9 )
v12 = v10;
else
v12 = *((_QWORD *)a1 + 1);
std::string::append(v7, v11, v12);
v14 = (unsigned __int8)v32;
v15 = v33;
v16 = (unsigned __int64)(unsigned __int8)v32 >> 1;
if ( (v32 & 1) != 0 )
v17 = v33;
else
v17 = (unsigned __int64)(unsigned __int8)v32 >> 1;
v18 = (v32 & 1) == 0;
if ( v17 >= 1 )
{
if ( (v32 & 1) != 0 )
v19 = v33;
else
v19 = (unsigned __int64)(unsigned __int8)v32 >> 1;
if ( !v19 )
LABEL_30:
std::__basic_string_common<true>::__throw_out_of_range(&v32);
v20 = 0LL;
while ( 1 )
{
if ( (v14 & 1) == 0 )
v15 = v16;
if ( v15 <= v20 )
std::__basic_string_common<true>::__throw_out_of_range(&v32);
v21 = v18 ? (__int64 *)((char *)&v32 + 1) : v34;
v22 = *((_BYTE *)v21 + v20);
v23 = (v14 & 1) != 0 ? v34 : (__int64 *)((char *)&v32 + 1);
v23[v20] = dword_1449014[(int)v20 % 5] ^ v22;
v14 = (unsigned __int8)v32;
v15 = v33;
++v20;
v18 = (v32 & 1) == 0;
if ( v17 <= (__int64)v20 )
break;
v16 = (unsigned __int64)(unsigned __int8)v32 >> 1;
if ( (v32 & 1) != 0 )
v24 = v33;
else
v24 = (unsigned __int64)(unsigned __int8)v32 >> 1;
if ( v24 <= v20 )
goto LABEL_30;
}
}
if ( v18 )
v25 = (CCCrypto *)((char *)&v32 + 1);
else
v25 = (CCCrypto *)v34;
if ( (v14 & 1) != 0 )
v26 = (unsigned int)v15;
else
v26 = (unsigned int)(v14 >> 1);
CCCrypto::MD5String(v25, (void *)v26, v13);
operator delete(v3);
if ( (v32 & 1) != 0 )
operator delete(v34);
if ( *(_QWORD *)(v1 + 40) != v35 )
{
v28 = sub_6ABEA0(v27);
operator delete(v3);
if ( (v32 & 1) != 0 )
operator delete(v34);
v29 = (cocos2d::LuaEngine *)sub_6CE4B0(v28);
FTUtils::decryptString(v29);
}
}
游戏名:食之契约
相关so档:(64位元的)
libcocos2dlua.zip (8.0 MB)
没必要PM。。。
又没人知道线下你是谁
发一个PM里的请求
密钥
f43599a8c6bf152329ac7e4a18d62b2a
你这也不是tj的加密啊,看了一下只有xxtea还有个ccz的加密
图片是xxtea
import xxtea
def decrypt(d, k):
with open(d, "rb") as f:
enc = f.read()
with open("dec", "wb") as f:
f.write(xxtea.decrypt(enc[10:], k, padding=False))
if __name__ == "__main__":
decrypt("card_draw_200017.png", b"99ca9249" + b"\x00" * 8)
还有个pvr.ccz加密的
import os
from PIL import Image
from ZipUtils import ZipUtils
def process(file: str, zip_utils: ZipUtils):
with open(file, "rb") as f:
d = f.read()
with open(os.path.splitext(file)[0], "wb") as f:
f.write(zip_utils.inflateCCZBuffer(d))
if __name__ == "__main__":
process("role_1.pvr.ccz", ZipUtils(0x72C159A2, 0x4B3F9693, 0x97BC2991, 0x8A8EF15B))
ZipUtils来自Script/Cocos/ZipUtils.py at master · PackageInstaller/Script · GitHub
…qqqqq…
新手刚入坑,对解密方式不是很熟悉…(慢慢补习中)…
总之,还是很感谢大佬的帮助。
您好,我按照这里的步骤操作了。
我得到了代码,但是解码仍然无法进行。
import hashlib
byte_D3A622 = [
0x15,0x28,0x69,0x79,0x7C,0x3E,0x0B,0x21,0x36,0x6F,0x66,0x4E,0x62,0x2D,0x77,0x60,0x73,0x2A,
0x29,0x0D,0x44,0x37,0x6B,0x5C,0x00,0x5A,0x0F,0x0C,0x5E,0x64,0x1A,0x65,0x57,0x6E,0x4D,
0x7A,0x47,0x74,0x40,0x43,0x02,0x72,0x45,0x18,0x5F,0x32,0x10,0x08,0x71,0x11,0x16,0x6C,
0x30,0x17,0x14,0x4B,0x05,0x63,0x25,0x35,0x7F,0x1E,0x3B,0x26,0x01,0x0E,0x6A,0x59,0x13,
0x09,0x2B,0x50,0x70,0x03,0x27,0x53,0x5B,0x5D,0x56,0x68,0x54,0x2F,0x23,0x6D,0x2C,0x46,
0x1B,0x4A,0x12,0x78,0x1C,0x4C,0x4F,0x61,0x75,0x51,0x3F,0x52,0x20,0x67,0x39,0x04,0x48,
0x24,0x55,0x34,0x31,0x33,0x3D,0x22,0x76,0x42,0x7D,0x1D,0x1F,0x06,0x7B,0x2E,0x3C,0x0A,
0x58,0x19,0x41,0x7E,0x38,0x3A,0x49,0x07
]
def confuse(s: str) -> str:
return s.upper().replace('_','+').replace('.', ';').replace('6',';')
def map_ver(version: str) -> str:
return ''.join(chr(byte_D3A622[ord(c)]) for c in version)
def generate_key(version="2.1.0.0"):
version_main = version.rsplit('.',1)[0]
phase1 = "hello,worldTianJi" + map_ver(version)
md5_1 = hashlib.md5(confuse(phase1).encode()).hexdigest()
phase2 = f"{md5_1}20140516{version_main}TianJi"
mix = confuse(phase2)[::-1]
return hashlib.md5(mix.encode()).hexdigest()
我使用了 tj_xxtea_decrypt.exe,但在解密过程中出现错误。
.rodata:0000000000D3A622 ; _BYTE byte_D3A622[142]
.rodata:0000000000D3A622 byte_D3A622 DCB 0x15, 0x28, 0x69, 0x79, 0x7C, 0x3E, 0xB, 0x21, 0x36
.rodata:0000000000D3A622 ; DATA XREF: sub_4B9340+198↑o
.rodata:0000000000D3A622 ; sub_4B9340+1A8↑o
.rodata:0000000000D3A62B DCB 0x6F, 0x66, 0x4E, 0x62, 0x2D, 0x77, 0x60, 0x73, 0x2A
.rodata:0000000000D3A634 DCB 0x29, 0xD, 0x44, 0x37, 0x6B, 0x5C, 0, 0x5A, 0xF, 0xC
.rodata:0000000000D3A63E DCB 0x5E, 0x64, 0x1A, 0x65, 0x57, 0x6E, 0x4D, 0x7A, 0x47
.rodata:0000000000D3A647 DCB 0x74, 0x40, 0x43, 2, 0x72, 0x45, 0x18, 0x5F, 0x32
.rodata:0000000000D3A650 DCB 0x10, 8, 0x71, 0x11, 0x16, 0x6C, 0x30, 0x17, 0x14
.rodata:0000000000D3A659 DCB 0x4B, 5, 0x63, 0x25, 0x35, 0x7F, 0x1E, 0x3B, 0x26
.rodata:0000000000D3A662 DCB 1, 0xE, 0x6A, 0x59, 0x13, 9, 0x2B, 0x50, 0x70, 3, 0x27
.rodata:0000000000D3A66D DCB 0x53, 0x5B, 0x5D, 0x56, 0x68, 0x54, 0x2F, 0x23, 0x6D
.rodata:0000000000D3A676 DCB 0x2C, 0x46, 0x1B, 0x4A, 0x12, 0x78, 0x1C, 0x4C, 0x4F
.rodata:0000000000D3A67F DCB 0x61, 0x75, 0x51, 0x3F, 0x52, 0x20, 0x67, 0x39, 4
.rodata:0000000000D3A688 DCB 0x48, 0x24, 0x55, 0x34, 0x31, 0x33, 0x3D, 0x22, 0x76
.rodata:0000000000D3A691 DCB 0x42, 0x7D, 0x1D, 0x1F, 6, 0x7B, 0x2E, 0x3C, 0xA, 0x58
.rodata:0000000000D3A69B DCB 0x19, 0x41, 0x7E, 0x38, 0x3A, 0x49, 7, 0, 0, 0, 0
.rodata:0000000000D3A6A6 DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
虽然是同一家公司的产品,区别在于“公司名称”被分配给了另一个职能部门,不过没关系,我把它取下来了。