输出前面4个都没问题,到最后一个data就是0了。按理来说我不应该失败的。
#include
#include
#include
#include
#include
typedef unsigned int _DWORD;
typedef unsigned char _BYTE;
void * xxtea_to_uint_array(const void *a1, size_t a2, int a3, size_t *a4)
{
size_t v4; // r5
void *v8; // r0
void *v9; // r12
v4 = a2 >> 2;
if ( (a2 & 3) != 0 )
++v4;
if ( a3 )
{
v8 = calloc(v4 + 1, 4u);
v9 = v8;
if ( v8 )
{
*((_DWORD *)v8 + v4) = a2;
*a4 = v4 + 1;
return memcpy(v9, a1, a2);
}
}
else
{
v9 = calloc(v4, 4u);
if ( v9 )
{
*a4 = v4;
return memcpy(v9, a1, a2);
}
}
return 0;
}
_BYTE * xxtea_decrypt(int a1, int a2, int *a3, size_t *a4)
{
int v7; // r0
int v8; // r1
int v9; // r12
int v10; // r2
int v11; // r3
unsigned int *v12; // r8
int v13; // r0
void *v14; // r9
unsigned int v15; // r5
unsigned int v16; // r4
int v17; // r10
unsigned int v18; // lr
unsigned int v19; // r6
unsigned int *v20; // r2
int v21; // r3
int v22; // r7
int v23; // r1
size_t v24; // r4
void *v25; // r0
_BYTE *v26; // r0
_BYTE *v27; // r5
_DWORD *v29; // r3
unsigned int v31; // [sp+8h] [bp-40h] BYREF
char v32[4]; // [sp+Ch] [bp-3Ch] BYREF
_DWORD v33[3]; // [sp+10h] [bp-38h] BYREF
int v34; // [sp+1Ch] [bp-2Ch] BYREF
v7 = *a3;
v8 = a3[1];
v9 = 0;
v10 = a3[2];
v11 = a3[3];
v33[0] = v7;
v33[1] = v8;
v33[2] = v10;
v34 = v11;
while ( *((_BYTE *)v33 + v9) )
{
if ( ++v9 == 16 )
goto LABEL_4;
}
if ( v9 == 15 )
{
LABEL_4:
if ( !a2 )
return 0;
}
else
{
v29 = (_DWORD *)((char *)v33 + v9);
do
{
*((_BYTE *)v29 + 1) = 0;
v29 = (_DWORD *)((char *)v29 + 1);
}
while ( v29 != (int *)((char *)&v34 + 3) );
if ( !a2 )
return 0;
}
v12 = (unsigned int *)xxtea_to_uint_array(a1, a2, 0, &v31);
if ( !v12 )
return 0;
v13 = xxtea_to_uint_array(v33, 16, 0, v32);
v14 = (void *)v13;
if ( v13 )
{
v15 = v31;
v16 = *v12;
v17 = v31 - 1;
if ( v31 != 1 )
{
v18 = -1640531527 * (0x34 / v31 + 6);
if ( v18 )
{
do
{
v19 = v18 >> 2;
v20 = &v12[v17 + 1];
v21 = v17;
do
{
v22 = *(_DWORD *)(v13 + 4 * (((unsigned char)v21-- ^ (unsigned char)v19) & 3));
v16 = *(v20 - 1)
- (((*(v20 - 2) ^ v22) + (v16 ^ v18)) ^ (((v16 >> 3) ^ (16 * *(v20 - 2)))
+ ((4 * v16) ^ (*(v20 - 2) >> 5))));
*--v20 = v16;
}
while ( v21 );
v23 = v16 ^ v18;
v18 += 1640531527;
v16 = *v12
- ((((16 * v12[v17]) ^ (v16 >> 3)) + ((v12[v17] >> 5) ^ (4 * v16))) ^ (v23
+ (v12[v17] ^ *(_DWORD *)(v13 + 4 * (v19 & 3)))));
*v12 = v16;
}
while ( v18 );
v15 = v31;
}
}
v24 = v12[v15 - 1];
if ( v24 < 4 * v15 - 7 || v24 > 4 * v15 - 4 )
{
v27 = 0;
}
else
{
v25 = malloc(v24 + 1);
v26 = memcpy(v25, v12, v24);
*a4 = v24;
v27 = v26;
v26[v24] = 0;
}
free(v12);
free(v14);
}
else
{
v27 = 0;
free(v12);
}
return v27;
}
int main(int argc, const char **argv) {
if(argc != 3) {
printf("usage:%s \n" , argv[0]);
return -1;
}
FILE *fpDll;
fpDll = fopen(argv[1], "r");
if(fpDll == NULL)
{
printf("open fail\n");
}
fseek(fpDll, 0, SEEK_END);
int len = ftell(fpDll);
fseek(fpDll, 0, SEEK_SET);
char * data= (char *)malloc(len);
fread(data, 1, len, fpDll);
fclose(fpDll);
char kkk[14]={'"','a','b','c','d','e','f','&','幸','运','"',',','0','\0'};
void *Key=&kkk;
printf("a1终于成功了==========decrypted=========%d\n",data);
printf("n终于成功了==========decrypted=========%d\n",len);
printf("Key终于成功了==========decrypted=========%d\n",Key);
printf("&n终于成功了==========decrypted=========%d\n",&len);
data = (char *)xxtea_decrypt(data, len, Key, &len);
printf("输出终于成功了==========decrypted=========%d\n",data);
FILE* pFile = fopen(argv[2],"wb");
fwrite(data,len,1,pFile);
fclose(pFile);
/* 我的第一个 C 程序 */
printf("Hello, World! \n");
return 0;
}