int find_repack_index(PACKAGE* package, const char* ori_name) { STORE_ITEM* repack_item = (STORE_ITEM*)PACKAGE(package->repack_app_dir); int index = 0; while (repack_item->length) { char* file_name = (char*)PACKAGE(*repack_item); if (stricmp(file_name, ori_name) == 0) { return (index); } index++; repack_item++; } return (-1); }
/* static */ wxString ChipPackage::GetStringFromPackageType(PackageType type) { #undef PACKAGE #define PACKAGE(x) \ if (type == x) \ return wxString(#x); PACKAGE(PDIP); PACKAGE(SOIC); PACKAGE(SSOP); PACKAGE(MQFP); PACKAGE(TQFP); PACKAGE(QFN); PACKAGE(PLCC); return wxEmptyString; }
/* static */ PackageType ChipPackage::GetPackageTypeFromString(const wxString& str) { #define PACKAGE(x) \ if (str.CmpNoCase(#x) == 0) \ return x; PACKAGE(PDIP); PACKAGE(SOIC); PACKAGE(SSOP); PACKAGE(MQFP); PACKAGE(TQFP); PACKAGE(QFN); PACKAGE(PLCC); return UPP_INVALID_PACKAGETYPE; }
void* make_launch(PACKAGE* package, long* launch_size) { void* stub_base = (void*)PACKAGE(package->stub_exe); long stub_size = package->stub_exe.length; assert(stub_base); assert(stub_size); long section_va; long section_raw; append_section_try(stub_base, §ion_va, §ion_raw); long output_size; void* launch_exe = append_section(stub_base, stub_size, &output_size, PACKAGE_SECTION_NAME, package, package->size); PACKAGE* package_out = (PACKAGE*)RVATOVA(launch_exe, section_raw); package_out->repack_whoami_index = -1; *launch_size = output_size; return (launch_exe); }
int copack_make_package_apps(PACKAGE* package, char* root_dir, char* output_dir) { assert(package); assert(root_dir); int run_result = 0; long launch_size; void* launch_exe = make_launch(package, &launch_size); char* file_name; char src_pe_file[MAX_PATH]; /* 如果需要,则生成launch,其实就是直接释放出来,launch和普通repack的区别,仅仅在于: 1)是否设置了repack_whoami_index,标名repack的真实名字 2)有没有STOREPE节段,这是存储pe文件的节段 */ if (package->launch_exe.length) { file_name = (char*)PACKAGE(package->launch_exe); if (output_dir) { char* short_name = seek_short_file_name(file_name); sprintf(src_pe_file, "%slaunch_%s", output_dir, short_name); } else { sprintf(src_pe_file, "%slaunch_%s", root_dir, file_name); } DbgPrint("launch filename: %s", src_pe_file); if (mem_to_file(src_pe_file, launch_exe, launch_size) == 0) { DbgPrint("launch release error"); run_result--; } } //打包程序 if (package->repack_app_dir.length) { STORE_ITEM* repack_item = (STORE_ITEM*)PACKAGE(package->repack_app_dir); while (repack_item->length) { file_name = (char*)PACKAGE(*repack_item); sprintf(src_pe_file, "%s%s", root_dir, file_name); long output_file_size; char* output_file_base = make_repack_app(file_name, src_pe_file, launch_exe, launch_size, &output_file_size, 1); //确定输出目录 if (output_dir) { char* short_name = seek_short_file_name(file_name); sprintf(src_pe_file, "%s%s", output_dir, short_name); } //覆盖或输出生成的文件 DbgPrint("dist filename : %s", src_pe_file); if (mem_to_file(src_pe_file, output_file_base, output_file_size) == 0) { run_result--; } repack_item++; } } return (run_result); }
char* find_repack_name(PACKAGE* package, int index) { STORE_ITEM* repack_item = (STORE_ITEM*)PACKAGE(package->repack_app_dir); char* file_name = (char*)PACKAGE(repack_item[index]); return (strdup(file_name)); }
char* stub_make_session_apps(PACKAGE* package, SEARCH_PARAM *search) { int run_result = 0; char* root_dir = search->root_dir; assert(package); assert(root_dir); void* session_dll = (void*)PACKAGE(package->session_dll); long session_dll_size = package->session_dll.length; assert(session_dll); assert(session_dll_size); //生成session.dll,添加package节段 long output_size; void* output_base = append_section(session_dll, session_dll_size, &output_size, PACKAGE_SECTION_NAME, package, package->size); //准备startup节段 STARTUP* startup = init_startup(); append_string_to_startup(root_dir, &startup->root_path); append_string_to_startup(GetCommandLineA(), &startup->stub_command_line); char session_dll_name[MAX_PATH]; sprintf(session_dll_name, "%s%s", root_dir, DAEMON_EXE_NAME); char* daemon_process_name = strdup(session_dll_name); append_string_to_startup(session_dll_name, &startup->daemon_process); sprintf(session_dll_name, "%s%s", root_dir, SESSION_DLL_NAME); append_string_to_startup(session_dll_name, &startup->session_dll); DbgPrint("root_dir: %s", (char*)STARTUP(startup->root_path)); DbgPrint("daemon: %s", (char*)STARTUP(startup->daemon_process)); DbgPrint("session: %s", (char*)STARTUP(startup->session_dll)); startup->stub_is_launch=(is_section_exists_main(ORIGIN_APP_SECTION_NAME))? 0 : 1; startup->stub_process_id = GetCurrentProcessId(); DWORD pid = get_parent_process_id(); startup->stub_parent_process_id = pid; append_string_to_startup(pid_to_exepath(pid), &startup->stub_parent_process); append_string_to_startup(current_process_name(), &startup->stub_process_name); //添加动态生成的“内核对象名字”,daemon调试通道名 append_string_to_startup(gen_guid_str(), &startup->daemon_dbg_name); append_string_to_startup(gen_guid_str(), &startup->share_mutex_name); //添加实际的被打包文件名和被注入进程文件名 append_list_string_to_startup(search->repack_list, &startup->realy_repack_apps); append_list_string_to_startup(search->plugto_list, &startup->realy_plugin_apps); append_list_string_to_startup(search->map_list, &startup->map_file_names); //添加startup节段 long output_file_size; char* output_file_base = append_section(output_base, output_size, &output_file_size, STUB_START_SECTION_NAME, startup, startup->size); //产生2个pe文件 if (mem_to_file(session_dll_name, output_file_base, output_file_size) == 0) { run_result--; } char* daemon_base = (void*)PACKAGE(package->daemon_exe); if (mem_to_file(daemon_process_name, daemon_base, package->daemon_exe.length) == 0) { run_result--; } return ((run_result == 0)? daemon_process_name : NULL); }