void StringManager::Init(const char* filePath) { SafeDelete(instance); instance = new StringManager(); char* buffer = NULL; int length = 0; ReadFileToMemory(filePath, "rt", &buffer, &length); if (length <= 0) { return; } tinyxml2::XMLDocument doc; doc.Parse(buffer); SafeDeleteArray(buffer); if (doc.ErrorID() != 0) { return; } tinyxml2::XMLElement* root = doc.FirstChildElement("data-set"); tinyxml2::XMLElement* recordXML = root->FirstChildElement("record"); while (recordXML) { StringRecord* record = new StringRecord(); const char* ID = recordXML->FirstChildElement("ID")->GetText(); const char* EN = recordXML->FirstChildElement("EN")->GetText(); const char* VN = recordXML->FirstChildElement("VN")->GetText(); SafeCopyCHAR(&record->ID, ID); SafeCopyCHAR(&record->EN, EN); SafeCopyCHAR(&record->VN, VN); instance->stringMap[ID] = record; recordXML = recordXML->NextSiblingElement("record"); } }
int main() { int size; const char* utf8_text = ReadFileToMemory("utf8.txt", &size); const char* original = utf8_text; // just size for worst case and convert int* utf32_text = (int*)malloc(size * 4); int i = 0; while (utf8_text < original + size) { int cp; utf8_text = cu_decode8(utf8_text, &cp); utf32_text[i++] = cp; wchar_t wide[2]; cu_encode16(wide, cp); int cp2; cu_decode16(wide, &cp2); CHECK(cp == cp2); } int processed_size = (int)(utf8_text - original); CHECK(processed_size == size); utf8_text = original; char* utf8_processed = (char*)malloc(size); original = utf8_processed; for (int j = 0; j < i; ++j) utf8_processed = cu_encode8(utf8_processed, utf32_text[j]); processed_size = (int)(utf8_processed - original); CHECK(processed_size == size); utf8_processed = (char*)original; wchar_t* utf16_text = (wchar_t*)malloc(size * 2); wchar_t* original_wide = utf16_text; for (int j = 0; j < i; ++j) utf16_text = cu_encode16(utf16_text, utf32_text[j]); processed_size = (int)(utf16_text - original_wide); utf16_text = original_wide; for (int j = 0; j < processed_size; ++j) { int cp; utf16_text = (wchar_t*)cu_decode16(utf16_text, &cp); utf8_processed = cu_encode8(utf8_processed, cp); } processed_size = (int)(utf8_processed - original); CHECK(processed_size == size); utf8_processed = (char*)original; utf16_text = original_wide; cu_widen(utf8_text, utf16_text); cu_shorten(utf16_text, utf8_processed); CHECK(!memcmp(utf8_text, utf8_processed, size)); return 0; }
int main(int argc, char *argv[]) { //initial variable FILE *fInput,*fOutput; fInput = NULL; fOutput = NULL; int cReadBuffer; unsigned long uFileSize = 0; char * target_str_temp = (char *)malloc(sizeof(char) * 200); //target_str_temp store the target_str's last value for the comparison at next time unsigned char * raw_content = NULL; unsigned char * target_str = (unsigned char *)malloc(sizeof(char) * 200); char * target_str_char = (char *)malloc(sizeof(char) * 200); //char * target_str = (char *)malloc(sizeof(char) * 200); unsigned long search_offset = 0; long search_result = 0; unsigned long view_offset = 0; char view_data_ctr = '0'; long root_page_offset = -1; char * table_name = (char *)malloc(sizeof(char) * 200); if(argv[1] == NULL) { printf("input --h or --help for help\n"); return 0; } if(!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { printf("Android_2.3.6 Samsung GT_S5820 Forensics Tool Mark4\n"); printf("written by Le0n Hu ,University of Chongqing Posts & Telecommunications\n"); printf("useage:\n"); printf(" -h, --help\t\tgive the help list\n"); printf(" -r, --read\t\tread the raw image file\n"); printf(" -p, --pull\t\tpull /data/data from android phone to current directory\n"); printf(" -d, --dig\t\tdig information from sms,contacts,call log,memo,browser history,etc to files to current directory\n"); printf(" --recovery\t\t recovery specific Pages contains deleted datas\n"); return 0; } if(!strcmp(argv[1], "--recovery")) { if(argv[2] == NULL) { printf("please input recovery file absolute path\n"); return 0; } /*if(argv[3] == NULL) { printf("please input the table name which you want to recovery information from\n"); return 0; }*/ printf("\nplease input the table name which you want to recovery informaiton from\n"); gets(table_name); fInput = OpenTargetFile(argv[2]); uFileSize = GetFileSize(argv[2]); raw_content = ReadFileToMemory(fInput, argv[2]); root_page_offset = FindTableRootPage(raw_content, table_name, uFileSize); if(root_page_offset == -1) { printf("table %s is not found!\nplease try again\n", table_name); return 0; } FindLostId(raw_content, root_page_offset); //printf("RootPage Offset: %0x\n", root_page_offset); return 0; } if(!strcmp(argv[1], "-r") || !strcmp(argv[1], "--read")) { if(argv[2] == NULL) { printf("please input file absolute path\n"); return 0; } fInput = OpenTargetFile(argv[2]); uFileSize = GetFileSize(argv[2]); raw_content = ReadFileToMemory(fInput, argv[2]); ShowByteInform(raw_content, 0); while(/*view_data_ctr != 0x1b*/1) //getch(); { view_data_ctr = getch(); switch(view_data_ctr) { case 'i': if(view_offset == 0) ShowByteInform(raw_content, view_offset); else { //ShowByteInform(raw_content, (view_offset = view_offset - 16 * 20)); ShowByteInform(raw_content, (view_offset = view_offset - 16)); } break; case 'k': if(view_offset + 640 > uFileSize) { ShowByteInform(raw_content, (view_offset = uFileSize - 624)); } else { //ShowByteInform(raw_content, (view_offset = view_offset + 16 * 20)); ShowByteInform(raw_content, (view_offset = view_offset + 16)); } break; case 'g': printf("please input the offset you want to move to:"); scanf("%0xd", &view_offset); if(view_offset < 0) { ShowByteInform(raw_content, 0); } else { if(view_offset + 640 > uFileSize) { ShowByteInform(raw_content, (view_offset = uFileSize - 641)); } else { ShowByteInform(raw_content, (view_offset = view_offset / 16 * 16)); } } break; case 'f': printf("please input the content you want to search:"); //scanf("%s", target_str); gets(target_str_char); if(strcmp(target_str_char, target_str_temp) != 0) { search_offset = 0; } strcpy(target_str_temp, target_str_char); memcpy(target_str, target_str_char, 200); search_result = Search(target_str, raw_content, &search_offset, uFileSize); if(search_result == -1) { printf("target string is not found!\n"); break; } else { view_offset = search_result; printf("target string found! address: %0x\n", view_offset); } if(view_offset + 640 > uFileSize) { ShowByteInform(raw_content, (view_offset = uFileSize - 640)); break; } else { ShowByteInform(raw_content, (view_offset = view_offset / 16 * 16)); break; } break; case 'c': CaptuerFromImage(raw_content); break; case 'n': search_result = Search(target_str, raw_content, &search_offset, uFileSize); if(search_result == -1) { printf("target string is not found!\n"); break; } else { view_offset = search_result; printf("target string found! address: %0x\n", view_offset); } if(view_offset + 640 > uFileSize) { ShowByteInform(raw_content, (view_offset = uFileSize - 640)); break; } else { ShowByteInform(raw_content, (view_offset = view_offset / 16 * 16)); break; } break; case 0x1b: return 0; //monitor 'Esc' input } } } if(!strcmp(argv[1], "-d") || !strcmp(argv[1], "--dig")) { SaveDbToFile(SMS_INFO); SaveDbToFile(CONTACTS_INFO); SaveDbToFile(CALL_LOG_INFO); SaveDbToFile(MEMO_INFO); SaveDbToFile(BROWSER_HISTORY_INFO); SaveDbToFile(BROWSER_USR_PWD_INFO); SaveDbToFile(CALENDAR_INFO); SaveDbToFile(EMAIL_INFO); SaveDbToFile(EMAIL_USR_PWD_INFO); return 0; } if(!strcmp(argv[1], "-p") || !strcmp(argv[1], "--pull")) { system("adb pull /data/data ./"); return 0; } printf("input --h or --help for help\n"); return 0; }