📄 decompile.c
字号:
{ WBXML_MB_U_INT32 index; ReadFixedTag(buffer, TAG_STR_T); Read_index(buffer, &index);}void Read_entity (P_WBXML_INFO buffer){ ReadFixedTag(buffer, TAG_ENTITY); Read_entcode(buffer);}void Read_entcode (P_WBXML_INFO buffer){ WBXML_MB_U_INT32 result; Read_mb_u_int32(buffer, &result);}void Read_pi (P_WBXML_INFO buffer){ ReadFixedTag(buffer, TAG_PI); Read_attrStart(buffer); while (Is_attrValue(buffer)) { Read_attrValue(buffer); } ReadFixedTag(buffer, TAG_END);}void Read_opaque (P_WBXML_INFO buffer){ WBXML_MB_U_INT32 length; WBXML_BYTES data; ReadFixedTag(buffer, TAG_OPAQUE); Read_length(buffer, &length); Read_bytes(buffer, mb_u_int32_to_long(&length), &data);}void Read_version (P_WBXML_INFO buffer){ WBXML_U_INT8 result; Read_u_int8(buffer, &result);}void Read_publicid (P_WBXML_INFO buffer){ if (Is_zero(buffer)) { WBXML_MB_U_INT32 index; Read_index(buffer, &index); AddDTDNode(buffer, ZERO_WBXML_MB_U_INT32, index); } else { WBXML_MB_U_INT32 result; Read_mb_u_int32(buffer, &result); AddDTDNode(buffer, result, ZERO_WBXML_MB_U_INT32); }}void Read_charset (P_WBXML_INFO buffer){ WBXML_MB_U_INT32 result; Read_mb_u_int32(buffer, &result);}void Read_termstr_rtn(P_WBXML_INFO buffer, char** result){#define STRING_BLOCK_SIZE 256 int buflen = STRING_BLOCK_SIZE; char* strbuf = (char*) malloc(buflen); BOOL doubled = FALSE; int i = 0; if (!result) ParseError(ERR_INTERNAL_BAD_PARAM); while ( (BytesLeft(buffer) >= 1) && (*(buffer->m_curpos) != 0) ) { if (i>=buflen) { buflen += STRING_BLOCK_SIZE; strbuf = realloc(strbuf, buflen); } if (*(buffer->m_curpos) != '$' || doubled == TRUE) { strbuf[i] = *(buffer->m_curpos); buffer->m_curpos++; i++; if (doubled == TRUE) doubled = FALSE; } else { strbuf[i] = *(buffer->m_curpos); i++; doubled = TRUE; } } strbuf[i] = 0; buffer->m_curpos++; if (*result) free(*result); *result = strbuf;}void Read_termstr (P_WBXML_INFO buffer){ char* strbuf = NULL; Read_termstr_rtn(buffer, &strbuf); AddStringNode(buffer, strbuf); free(strbuf);}void Read_index (P_WBXML_INFO buffer, P_WBXML_MB_U_INT32 result){ Read_mb_u_int32(buffer, result);}void Read_length (P_WBXML_INFO buffer, P_WBXML_MB_U_INT32 result){ Read_mb_u_int32(buffer, result);}void Read_zero (P_WBXML_INFO buffer){ WBXML_U_INT8 result; Read_u_int8(buffer, &result); if (result != (WBXML_U_INT8) 0) { ParseError(ERR_TAG_NOT_FOUND); }}void Read_pageindex (P_WBXML_INFO buffer, P_WBXML_U_INT8 result){ Read_u_int8(buffer, result);}static void Init(P_WBXML_INFO buffer){ buffer->m_start = NULL; buffer->m_curpos = NULL; buffer->m_length = 0; buffer->m_tree = NULL; buffer->m_curnode = NULL; buffer->m_curpage = 0;}static size_t BufferLength(P_WBXML_INFO buffer){ size_t ret; while (buffer->m_curpos != '\0') buffer->m_curpos++; ret = buffer->m_curpos - buffer->m_start; buffer->m_curpos = buffer->m_start; return ret;}static void Free(P_WBXML_INFO buffer){ if (buffer->m_start) { free(buffer->m_start); buffer->m_start = NULL; } buffer->m_curpos = NULL; buffer->m_length = 0; FreeNode(buffer->m_tree); buffer->m_tree = NULL;}static long FileSize(FILE* file){ long curpos = ftell(file); long endpos; fseek(file, 0, SEEK_END); endpos = ftell(file); fseek(file, curpos, SEEK_SET); return endpos;}static void ReadBinary(P_WBXML_INFO buffer, FILE* file){ char buf[4096]; int m = 1; long n; if (buffer && file) { if (file != stdin) { buffer->m_length = FileSize(file); buffer->m_start = (P_WBXML) malloc(buffer->m_length); buffer->m_curpos = buffer->m_start; if (!buffer->m_start) { fclose(file); ParseError(ERR_NOT_ENOUGH_MEMORY); } if (fread(buffer->m_start, 1, buffer->m_length, file) != buffer->m_length) { fclose(file); ParseError(ERR_FILE_NOT_READ); } else { fclose(file); } } else { while ((n = fread(buf, 1, sizeof(buf), file)) > 0) { buffer->m_start = (P_WBXML) realloc(buffer->m_start, sizeof(buf) * m); memcpy(buffer->m_start + (sizeof(buf) * (m - 1)), buf, sizeof(buf)); m++; } buffer->m_length = BufferLength(buffer); buffer->m_curpos = buffer->m_start; } } else { ParseError(ERR_INTERNAL_BAD_PARAM); }}static const char* DTDTypeName(long dtdnum){ int i = 0; /* Search the DTD list for a match */ while (DTDTypeList[i].m_name) { if (DTDTypeList[i].m_id == dtdnum) { break; } i++; } return DTDTypeList[i].m_name;}static const char* CodepageTagName(WBXML_CODEPAGE page, WBXML_TAG tag){ int i = 0; /* Strip flags off of the tag */ tag = (WBXML_TAG) (tag & CODEPAGE_TAG_MASK); /* Search the tag list for a match */ while (CodepageTagNames[i].m_name) { if ((CodepageTagNames[i].m_dtd_id == dtd_id) && (CodepageTagNames[i].m_page == page) && (CodepageTagNames[i].m_tag == tag)) { break; } i++; } return CodepageTagNames[i].m_name;}static const char* CodepageAttrstartName(WBXML_CODEPAGE page, WBXML_TAG tag, char** value){ int i = 0; /* Check Parameters */ if (!value) { ParseError(ERR_INTERNAL_BAD_PARAM); } /* Search the tag list for a match */ while (CodepageAttrstartNames[i].m_name) { if ((CodepageAttrstartNames[i].m_dtd_id == dtd_id) && (CodepageAttrstartNames[i].m_page == page) && (CodepageAttrstartNames[i].m_tag == tag)) { break; } i++; } /* Duplicate the value because it may be concatenated to */ if (CodepageAttrstartNames[i].m_valueprefix) { *value = strdup(CodepageAttrstartNames[i].m_valueprefix); } else { *value = NULL; } /* Return the tag name */ return CodepageAttrstartNames[i].m_name;}static void CodepageAttrvalueName(WBXML_CODEPAGE page, WBXML_TAG tag, char** value){ int i = 0; /* Check Parameters */ if (!value) { ParseError(ERR_INTERNAL_BAD_PARAM); } /* Search the tag list for a match */ while (CodepageAttrvalueNames[i].m_name) { if ((CodepageAttrvalueNames[i].m_dtd_id == dtd_id) && (CodepageAttrvalueNames[i].m_page == page) && (CodepageAttrvalueNames[i].m_tag == tag)) { break; } i++; } /* concatenate the value */ if (CodepageAttrvalueNames[i].m_name) { if (*value) { *value = realloc(*value, strlen(*value) + strlen(CodepageAttrvalueNames[i].m_name) + 1); strcat(*value, CodepageAttrvalueNames[i].m_name); } else { *value = strdup(CodepageAttrvalueNames[i].m_name); } }}static const char* GetStringTableString(P_WBXML_NODE node, long index){ /* Find the string table node */ P_WBXML_NODE pStringsNode = node; while (pStringsNode->m_parent) { pStringsNode = pStringsNode->m_parent; } while (pStringsNode->m_next) { pStringsNode = pStringsNode->m_next; } while (pStringsNode->m_prev && pStringsNode->m_type != NODE_STRING_TABLE) { pStringsNode = pStringsNode->m_prev; } if (pStringsNode->m_type != NODE_STRING_TABLE) { return "!!NO STRING TABLE!!"; } /* Find the indexed string */ if ((index >= 0) && (index < mb_u_int32_to_long(&((P_WBXML_STRING_TABLE)pStringsNode->m_data)->m_length))) { return (const char*) &(((P_WBXML_STRING_TABLE)pStringsNode->m_data)->m_strings[index]); } else { return "!!STRING TABLE INDEX TOO LARGE!!"; }}static void DumpNode(P_WBXML_NODE node, int indent, BOOL *inattrs, BOOL hascontent, char** value){ P_WBXML_NODE curnode = node->m_child; WBXML_TAG nodetype = 0; long dtdnum = 0; BOOL bAttributesFollow = FALSE; BOOL bHasContent = FALSE; int i; if (!(*inattrs)) { for (i=0; i<indent; i++) { printf(" "); } } else { if ((node->m_type != NODE_ATTRVALUE) && (*value)) { printf("=\""); OutputEncodedString((unsigned char*) *value); printf("\""); free(*value); *value = NULL; } } switch (node->m_type) { case NODE_DTD_TYPE: printf("<?xml version=\"1.0\"?>\n<!DOCTYPE wml PUBLIC "); dtdnum = mb_u_int32_to_long( &((DTD_NODE_DATA*)node->m_data)->m_dtdnum ); if ( dtdnum == 0) { printf("\"%s\">\n\n", GetStringTableString(node, mb_u_int32_to_long(&((DTD_NODE_DATA*)node->m_data)->m_index)) ); } else { printf("\"%s\">\n\n", DTDTypeName(dtdnum) ); } break; case NODE_CODEPAGE_TAG: nodetype = *((P_WBXML_TAG)node->m_data); if ((nodetype & CODEPAGE_TAG_MASK) == nodetype) { printf("<%s/>\n", CodepageTagName(node->m_page, nodetype)); } else { if ((nodetype & CODEPAGE_TAG_HAS_CONTENT) == CODEPAGE_TAG_HAS_CONTENT) { bHasContent = TRUE; } if ((nodetype & CODEPAGE_TAG_HAS_ATTRS) == CODEPAGE_TAG_HAS_ATTRS) { printf("<%s", CodepageTagName(node->m_page, nodetype)); bAttributesFollow = TRUE; } else { printf("<%s>\n", CodepageTagName(node->m_page, nodetype)); } } break; case NODE_CODEPAGE_LITERAL_TAG: printf("<%s>\n", GetStringTableString(node, mb_u_int32_to_long(((P_WBXML_MB_U_INT32)node->m_data))) ); break; case NODE_ATTRSTART: printf(" %s", CodepageAttrstartName(node->m_page, *((P_WBXML_TAG)node->m_data), value) ); break; case NODE_ATTRSTART_LITERAL: printf(" %s", GetStringTableString(node, mb_u_int32_to_long(((P_WBXML_MB_U_INT32)node->m_data))) ); break; case NODE_ATTRVALUE: CodepageAttrvalueName(node->m_page, *((P_WBXML_TAG)node->m_data), value); break; case NODE_ATTREND: if (!hascontent) { printf("/"); } printf(">\n"); *inattrs = FALSE; break; case NODE_STRING: if (*inattrs) { /* concatenate the value */ if (*value) { if (node->m_data) { *value = realloc(*value, strlen(*value) + strlen((char*) node->m_data) + 1); strcat(*value, (char*) node->m_data); } } else { if (node->m_data) { *value = strdup((char*) node->m_data); } } } else { OutputEncodedString((unsigned char*) node->m_data); printf("\n"); } break; case NODE_VARIABLE_STRING: /* TODO: output variable string */ break; case NODE_VARIABLE_INDEX: /* TODO: output variable string */ break; default: break; } indent += INDENT_SIZE; if (curnode) { while (curnode->m_next) curnode = curnode->m_next; while (curnode) { DumpNode(curnode, indent, &bAttributesFollow, bHasContent, value); curnode = curnode->m_prev; } } indent -= INDENT_SIZE; /* Output the element end if we have one */ if ((nodetype & CODEPAGE_TAG_HAS_CONTENT) == CODEPAGE_TAG_HAS_CONTENT) { for (i=0; i<indent; i++) { printf(" "); } switch (node->m_type) { case NODE_CODEPAGE_TAG: printf("</%s>\n", CodepageTagName(node->m_page, *((P_WBXML_TAG)node->m_data)) ); break; case NODE_CODEPAGE_LITERAL_TAG: printf("</%s>\n", GetStringTableString(node, mb_u_int32_to_long(((P_WBXML_MB_U_INT32)node->m_data))) ); break; default: break; } }}static void DumpNodes(P_WBXML_INFO buffer){ P_WBXML_NODE curnode = buffer->m_tree; BOOL bAttrsFollow = FALSE; char* value = NULL; if (curnode) { while (curnode->m_next) curnode = curnode->m_next; while (curnode) { DumpNode(curnode, 0, &bAttrsFollow, FALSE, &value); curnode = curnode->m_prev; } }}int main(int argc, char** argv){ WBXML_INFO buffer; FILE* file; if (argc < 2) { file = stdin; } else { file = fopen(argv[1], "r"); if (!file) { ParseError(ERR_FILE_NOT_FOUND); } } Init(&buffer); ReadBinary(&buffer, file); Read_start(&buffer); DumpNodes(&buffer); Free(&buffer); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -