[2020]CPU仿真模拟器 内存加载EXE文件重定位问题 huoji CPU仿真,PE模拟器,重定位,CPU 2020-12-18 727 次浏览 0 次点赞 事情起因 一个莫名其妙的异常: ![](https://key08.com/usr/uploads/2020/12/4017132053.png) 可以看到 明明要读取0x1EBF1431174 结果却读取了 0x1F1431174 x64dbg跟过去 ![](https://key08.com/usr/uploads/2020/12/613595073.png) 在 ![](https://key08.com/usr/uploads/2020/12/2084374104.png) 时候 ![](https://key08.com/usr/uploads/2020/12/2750227444.png) 这个时候rbx是在rdata里面的 读出来的rax是在.text里面 ![](https://key08.com/usr/uploads/2020/12/1400295996.png) 所以是rdata里面的某个东西的值要指向.text的才对 确定是我的rdata区段里面的数据没有做重定位 但是为什么?重定位我已经写了 之后发现 ![](https://key08.com/usr/uploads/2020/12/636607860.png) 给固定的base才可以用 就绝对是重定位问题 但是不知道为什么 重定位按理说应该可以用的 经过仔细思考,我的重定位代码是 抄网上的 只是用于dll、没有考虑到EXE(网上都是内存加载dll), 所以按PE的结构自己写了一套重定位 ```cpp IMAGE_DATA_DIRECTORY* relocation_data = &(params_nt_head->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]); IMAGE_BASE_RELOCATION* relocation_ptr = NULL; for (DWORD64 parsed_size = 0; parsed_size < relocation_data->Size; parsed_size += relocation_ptr->SizeOfBlock) { relocation_ptr = (IMAGE_BASE_RELOCATION*)(relocation_data->VirtualAddress + parsed_size + DWORD64(params_image_base)); if (relocation_ptr->VirtualAddress == NULL || relocation_ptr->SizeOfBlock == 0) break; DWORD64 entriesNum = (relocation_ptr->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(BASE_RELOCATION_ENTRY); BASE_RELOCATION_ENTRY* relocation_entry = (BASE_RELOCATION_ENTRY*)(DWORD64(relocation_ptr) + sizeof(IMAGE_BASE_RELOCATION)); for (DWORD64 i = 0; i < entriesNum; i++) { DWORD64 reloc_field = relocation_ptr->VirtualAddress + (DWORD)relocation_entry->Offset; if (relocation_entry == NULL || relocation_entry->Type == 0) break; DWORD64* relocate_address_ptr = (DWORD64*)(DWORD64(params_image_base) + reloc_field); *relocate_address_ptr = ((*relocate_address_ptr) - params_nt_head->OptionalHeader.ImageBase + (uint64_t)params_image_base); relocation_entry = (BASE_RELOCATION_ENTRY*)(DWORD64(relocation_entry) + sizeof(BASE_RELOCATION_ENTRY)); } } ``` 然后就可以用了: ![](https://key08.com/usr/uploads/2020/12/437586725.png) 问题出自于太信任网上的代码.即便是确定是重定位问题但是也不认为是重定位代码的问题.所以导致了花了两天才解决 本文由 huoji 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。 点赞 0
还不快抢沙发