// TestLoadDll.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include #include FILE * pFile; long lSize; char * buffer; size_t result; bool InitTestReflectiveLoader() { // 一个不漏地读入整个文件,只能采用二进制方式打开 //pFile = fopen(".\\..\\..\\bin\\server\\CcMainDll.dll", "rb"); pFile = fopen("C:\\Users\\b\\Desktop\\bin\\server\\CcMainDll.dll", "rb"); if (pFile == NULL) { fputs("File error", stderr); printf("open file fail"); return false; } // 获取文件大小 fseek(pFile, 0, SEEK_END); lSize = ftell(pFile); rewind(pFile); // 分配内存存储整个文件 buffer = (char*)VirtualAlloc(NULL , sizeof(char)*lSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (buffer == NULL) { fputs("Memory error", stderr); printf("Memory alloc falil"); return false; } // 将文件拷贝到buffer中 result = fread(buffer, 1, lSize, pFile); if (result != lSize) { fputs("Reading error", stderr); printf("Load file to memory falil"); return false; } return true; } void loadCcmainDllExp() { std::cout << "Hello World!\n"; //载入服务端dll hijack test HMODULE hServerDll = LoadLibrary(".\\..\\..\\bin\\server\\CcMainDll.dll"); typedef int(_cdecl *TestRunInit)(); TestRunInit InitTestReflectiveLoader = (TestRunInit)GetProcAddress(hServerDll, "InitTestReflectiveLoader"); if (InitTestReflectiveLoader != NULL) { InitTestReflectiveLoader(); //调用这个函数 } //声明导出函数类型--导出的TestRun函数 typedef void(_cdecl *TestRunT)(); //寻找dll中导出函数 TestRunT pReflectiveLoader = (TestRunT)GetProcAddress(hServerDll, "ReflectiveLoader"); //判断函数是否为空 if (pReflectiveLoader != NULL) { pReflectiveLoader(); //调用这个函数 } } int main() { InitTestReflectiveLoader(); PDWORD lpflOldProtect; VirtualProtect(buffer, lSize, PAGE_EXECUTE_READWRITE, lpflOldProtect); __asm { call buffer } return 0; }