Add .bss/.sbss clearing

This commit is contained in:
Maschell 2019-11-18 21:10:11 +01:00
parent 69ed56522a
commit fbb6c98314
4 changed files with 65 additions and 3 deletions

View File

@ -80,7 +80,6 @@ void ApplyPatchesAndCallHookStartingApp() {
PatchInvidualMethodHooks(method_hooks_hooks_static, method_hooks_size_hooks_static, method_calls_hooks_static); PatchInvidualMethodHooks(method_hooks_hooks_static, method_hooks_size_hooks_static, method_calls_hooks_static);
PatchInvidualMethodHooks(method_hooks_hooks, method_hooks_size_hooks, method_calls_hooks); PatchInvidualMethodHooks(method_hooks_hooks, method_hooks_size_hooks, method_calls_hooks);
for(int32_t plugin_index=0; plugin_index<gbl_replacement_data.number_used_plugins; plugin_index++) { for(int32_t plugin_index=0; plugin_index<gbl_replacement_data.number_used_plugins; plugin_index++) {
CallHookEx(WUPS_LOADER_HOOK_INIT_WUT_DEVOPTAB,plugin_index); CallHookEx(WUPS_LOADER_HOOK_INIT_WUT_DEVOPTAB,plugin_index);
CallHookEx(WUPS_LOADER_HOOK_APPLICATION_START,plugin_index); CallHookEx(WUPS_LOADER_HOOK_APPLICATION_START,plugin_index);
new_PatchInvidualMethodHooks(&gbl_replacement_data.plugin_data[plugin_index]); new_PatchInvidualMethodHooks(&gbl_replacement_data.plugin_data[plugin_index]);
@ -122,6 +121,20 @@ void ResolveRelocations() {
} }
} }
void clearBSS(){
for(int32_t plugin_index=0; plugin_index<gbl_replacement_data.number_used_plugins; plugin_index++) {
replacement_data_plugin_t * curData = &gbl_replacement_data.plugin_data[plugin_index];
if(curData->bssAddr != 0){
DEBUG_FUNCTION_LINE("Clearing .bss section for %s. Addr: %08X size: %08X\n", curData->plugin_name, curData->bssAddr, curData->bssSize);
memset((void*)curData->bssAddr, 0, curData->bssSize);
}
if(curData->bssAddr != 0){
DEBUG_FUNCTION_LINE("Clearin .sbss section for %s. Addr: %08X size: %08X\n", curData->plugin_name, curData->sbssAddr, curData->sbssSize);
memset((void*)curData->sbssAddr, 0, curData->sbssSize);
}
}
}
void afterLoadAndLink() { void afterLoadAndLink() {
ResolveRelocations(); ResolveRelocations();
@ -211,6 +224,7 @@ extern "C" void doStart(int argc, char **argv) {
pluginLoader->loadAndLinkPlugins(pluginList); pluginLoader->loadAndLinkPlugins(pluginList);
pluginLoader->clearPluginInformation(pluginList); pluginLoader->clearPluginInformation(pluginList);
delete pluginLoader; delete pluginLoader;
clearBSS();
afterLoadAndLink(); afterLoadAndLink();
} else { } else {
DEBUG_FUNCTION_LINE("Mapping was already done\n"); DEBUG_FUNCTION_LINE("Mapping was already done\n");
@ -223,6 +237,8 @@ extern "C" void doStart(int argc, char **argv) {
//MemoryMapping::readTestValuesFromMemory(); //MemoryMapping::readTestValuesFromMemory();
} }
clearBSS();
if(gbl_to_link_and_load_data[0].name[0] != 0) { if(gbl_to_link_and_load_data[0].name[0] != 0) {
ResolveRelocations(); ResolveRelocations();
CallHook(WUPS_LOADER_HOOK_DEINIT_PLUGIN); CallHook(WUPS_LOADER_HOOK_DEINIT_PLUGIN);
@ -242,10 +258,13 @@ extern "C" void doStart(int argc, char **argv) {
pluginLoader->loadAndLinkPlugins(pluginList); pluginLoader->loadAndLinkPlugins(pluginList);
pluginLoader->clearPluginInformation(pluginList); pluginLoader->clearPluginInformation(pluginList);
delete pluginLoader; delete pluginLoader;
clearBSS();
afterLoadAndLink(); afterLoadAndLink();
memset(gbl_to_link_and_load_data,0, sizeof(gbl_to_link_and_load_data)); memset(gbl_to_link_and_load_data,0, sizeof(gbl_to_link_and_load_data));
} }
ResolveRelocations(); ResolveRelocations();
MemoryUtils::init(); MemoryUtils::init();

View File

@ -72,6 +72,10 @@ struct replacement_data_plugin_t {
replacement_data_hook_t hooks[MAXIMUM_HOOKS_PER_PLUGIN]; // Replacement information for each function. replacement_data_hook_t hooks[MAXIMUM_HOOKS_PER_PLUGIN]; // Replacement information for each function.
bool kernel_allowed; // Allow kernel access for the plugin!?!. bool kernel_allowed; // Allow kernel access for the plugin!?!.
bool kernel_init_done; // KernelInit was done bool kernel_init_done; // KernelInit was done
uint32_t bssAddr;
uint32_t bssSize;
uint32_t sbssAddr;
uint32_t sbssSize;
}; };
#define MAXIMUM_PLUGINS 32 #define MAXIMUM_PLUGINS 32

View File

@ -82,6 +82,16 @@ public:
hook_data_list.push_back(hook_data); hook_data_list.push_back(hook_data);
} }
void setBSSLocation(uint32_t addr, uint32_t size) {
this->bssAddr = addr;
this->bssSize = size;
}
void setSBSSLocation(uint32_t addr, uint32_t size) {
this->sbssAddr = addr;
this->sbssSize = size;
}
std::vector<HookData *> getHookDataList() { std::vector<HookData *> getHookDataList() {
return hook_data_list; return hook_data_list;
} }
@ -118,6 +128,22 @@ public:
uint32_t getMemoryForCommonBySymbol(size_t symbol, size_t align, size_t size); uint32_t getMemoryForCommonBySymbol(size_t symbol, size_t align, size_t size);
uint32_t getBSSAddr(){
return bssAddr;
}
uint32_t getBSSSize(){
return bssSize;
}
uint32_t getSBSSAddr(){
return sbssAddr;
}
uint32_t getSBSSSize(){
return sbssSize;
}
private: private:
PluginInformation * pluginInformation; PluginInformation * pluginInformation;
@ -127,6 +153,11 @@ private:
std::vector<RelocationData *> relocation_data_list; std::vector<RelocationData *> relocation_data_list;
std::vector<ImportRPLInformation *> importRPLInformation_list; std::vector<ImportRPLInformation *> importRPLInformation_list;
uint32_t bssAddr = 0;
uint32_t bssSize = 0;
uint32_t sbssAddr = 0;
uint32_t sbssSize = 0;
std::map<size_t, uint32_t> memoryBySymbol; std::map<size_t, uint32_t> memoryBySymbol;
}; };

View File

@ -332,6 +332,11 @@ bool PluginLoader::loadAndLinkElf(PluginData * pluginData, Elf *elf, void * star
} }
ElfTools::elfLoadSymbols(elf_ndxscn(scn), (void*) firstCurAddress, symtab, symtab_count); ElfTools::elfLoadSymbols(elf_ndxscn(scn), (void*) firstCurAddress, symtab, symtab_count);
if(strcmp(name, ".bss") == 0){
pluginData->setBSSLocation(destination, shdr->sh_size);
DEBUG_FUNCTION_LINE("Saved .bss section info. Location: %08X size: %08X\n", destination, shdr->sh_size);
}
curAddress = ROUNDUP(destination + shdr->sh_size,0x100); curAddress = ROUNDUP(destination + shdr->sh_size,0x100);
} }
} }
@ -448,8 +453,6 @@ void PluginLoader::copyPluginDataIntoGlobalStruct(std::vector<PluginData *> plug
} }
// Other // Other
std::vector<FunctionData *> function_data_list = cur_plugin->getFunctionDataList(); std::vector<FunctionData *> function_data_list = cur_plugin->getFunctionDataList();
std::vector<HookData *> hook_data_list = cur_plugin->getHookDataList(); std::vector<HookData *> hook_data_list = cur_plugin->getHookDataList();
if(plugin_index >= MAXIMUM_PLUGINS ) { if(plugin_index >= MAXIMUM_PLUGINS ) {
@ -471,6 +474,11 @@ void PluginLoader::copyPluginDataIntoGlobalStruct(std::vector<PluginData *> plug
plugin_data->kernel_allowed = true; plugin_data->kernel_allowed = true;
plugin_data->kernel_init_done = false; plugin_data->kernel_init_done = false;
plugin_data->bssAddr = cur_plugin->getBSSAddr();
plugin_data->bssSize = cur_plugin->getBSSSize();
plugin_data->sbssAddr = cur_plugin->getSBSSAddr();
plugin_data->sbssSize = cur_plugin->getSBSSSize();
strncpy(plugin_data->plugin_name,cur_pluginInformation->getName().c_str(),MAXIMUM_PLUGIN_NAME_LENGTH-1); strncpy(plugin_data->plugin_name,cur_pluginInformation->getName().c_str(),MAXIMUM_PLUGIN_NAME_LENGTH-1);
strncpy(plugin_data->path,cur_pluginInformation->getPath().c_str(),MAXIMUM_PLUGIN_PATH_NAME_LENGTH-1); strncpy(plugin_data->path,cur_pluginInformation->getPath().c_str(),MAXIMUM_PLUGIN_PATH_NAME_LENGTH-1);