查看: 707|回复: 1

[C++资源] 【C语言】【最新】支持x64和x32的代码注入库

[复制链接]
发表于 2020-10-11 21:52 | 显示全部楼层 |阅读模式
非法程序、 2020-10-11 21:52 707 1 显示全部楼层
支持x64和x32的代码注入库
如果这个帖子不符合版规请版主删除   

点此获取完整的源码

这是对cheatlib的一次重大更新,加入了对x64的支持

快速入门
测试程序源码
cheatlib_test.c   
  1. #include <stdio.h>
  2. #include "cheatlib.h"

  3. PDllInjectionInfo inject_dll_test_info = NULL;
  4. PCodeInjectionInfo code_info = NULL;

  5. int main()
  6. {
  7.   // 根据窗口标题获取句柄
  8.   HANDLE hTarget = GetHandleByTitle("Cheatlib Target");

  9.   if(hTarget == NULL){
  10.     puts("Failed to get target handle");
  11.     return EXIT_FAILURE;
  12.   }

  13.   // dll注入演示
  14.   inject_dll_test_info = DllInjection(hTarget, "inject_dll_test.dll");

  15.   if(inject_dll_test_info == NULL){
  16.     printf("Dll injection Failed\n");
  17.     return EXIT_FAILURE;
  18.   }

  19.   Sleep(1000);
  20.   // dll注出演示
  21.   DllOutjection(inject_dll_test_info);

  22. #ifdef CHEATLIB_TARGET_X64

  23.   // 代码注入演示
  24.   code_info = CodeInjection(hTarget, (LPVOID)0x40159a,
  25.       "add dword ptr ss:[rbp-0x4], 0xff;"
  26.       "push 0x401574;"
  27.       "ret;"
  28.       );

  29. #else

  30.   // 代码注入演示
  31.   code_info = CodeInjection(hTarget, (LPVOID)0x40156a,
  32.       "add dword ptr ss:[ebp-0xC], 0xff;"
  33.       "push 0x40153E;"
  34.       "ret;"
  35.       );

  36. #endif

  37.   if(code_info == NULL){
  38.     printf("Code Injection Failed\n");
  39.     return EXIT_FAILURE;
  40.   }

  41.   Sleep(2000);
  42.   // 代码注出演示
  43.   CodeOutjection(code_info);

  44.   return EXIT_SUCCESS;
  45. }
复制代码


测试动态库代码
inject_dll_test.c  

  1. #include <stdio.h>
  2. #include "cheatlib.h"

  3. PFuncHookInfo func_hook_info = NULL;
  4. PIATHookInfo iat_hook_info = NULL;

  5. typedef printf_type int(*)(const char * restrict, ...);

  6. int func_hooked_printf(const char * restrict format, ...)
  7. {
  8.   // to do something here...
  9.   // 现在CallOrigFunc可以直接返回函数返回值
  10.   return CallOrigFunc(func_hook_info, "This is Func hooked printf\n");
  11. }

  12. int iat_hooked_printf(const char * restrict format, ...)
  13. {
  14.   // to do something here...
  15.   // IAT Hook 是不能用CallOrigFunc的
  16.   return ((printf_type)iat_hook_info->pFuncAddress)("This is IAT hooked printf\n");
  17. }

  18. BOOL WINAPI DllMain(
  19.     HINSTANCE hinstDLL,  // handle to DLL module
  20.     DWORD fdwReason,     // reason for calling function
  21.     LPVOID lpReserved )  // reserved
  22. {
  23.   // Perform actions based on the reason for calling.
  24.   switch( fdwReason )
  25.   {
  26.     case DLL_PROCESS_ATTACH:
  27.       {
  28.         // 从IAT获取函数地址
  29.         LPVOID printf_addr = GetFuncFromIAT(NULL, "printf");

  30.         // 函数钩子演示
  31.         func_hook_info = FuncHook(printf_addr, (LPVOID)func_hooked_printf);

  32.         if(func_hook_info == NULL){
  33.           printf("function hook failed\n");
  34.         }
  35.         Sleep(2000);

  36.         // 函数钩子撤销演示
  37.         FuncUnhook(func_hook_info);

  38.         // IAT钩子演示
  39.         iat_hook_info = IATHook(NULL, "printf", (LPVOID)iat_hooked_printf);
  40.         Sleep(2000);

  41.         // 撤销IAT钩子演示
  42.         IATUnhook(iat_hook_info);
  43.       }
  44.       break;
  45.   }
  46.   return TRUE;  // Successful DLL_PROCESS_ATTACH.
  47. }
复制代码
被攻击的目标程序代码
target.c   

  1. #include <stdio.h>
  2. #include <windows.h>

  3. int main()
  4. {
  5.     SetConsoleTitle("Cheatlib Target");
  6.     for(int i=0;;++i)
  7.     {
  8.         printf("Target Program: %d printf address: %p\n", i, printf);
  9.         Sleep(200);
  10.     }
  11.     return 0;
  12. }
  13. 如何编译这些代
复制代码
如何编译这些代码?
这个库可以在VS项目里使用也可以在Mingw(GCC)项目里使用,这里演示在Mingw(GCC)中的使用方法
将cheatlib.h cheatlib.dll keystone.dll capstone.dll复制到你的项目目录下
编译32位运行  
  1. gcc -shared cheatlib.dll inject_dll_test.c -o inject_dll_test.dll -m32
  2. gcc cheatlib.dll cheatlib_test.c -o cheatlib_test.exe -m32
  3. gcc target.c -o target.exe -m32
复制代码
编译64位运行   
  1. gcc -shared cheatlib.dll inject_dll_test.c -o inject_dll_test.dll -m64 -D CHEATLIB_TARGET_X64
  2. gcc cheatlib.dll cheatlib_test.c -o cheatlib_test.exe -m64 -D CHEATLIB_TARGET_X64
  3. gcc target.c -o target.exe -m64
  4. 对比上一版增加了那些内
复制代码
对比上一版增加了那些内容?
x64支持而且接口不变,只需简单定义CHEATLIB_TARGET_X64宏即可转变成x64的版本
IAT Hook 支持
获取IAT数据支持
CallOrigFunc 直接获取返回值支持.你可以直接写作 return CallOrigFunc(ptInfo, arg1, arg2);
注意
CodeInjection函数不会将跳转覆盖的指令复制到执行区执行
因此有必要知道在x32和x64下跳转需要占用多大的空间
x32下的跳转:  
jmp hook function
共计5字节  
x64下的跳转:  
push target low address
mov dword ptr ss:[rsp], target high address
ret
共计14字节  
最后
我写这个库是希望它能在各种场合下为你带来便利,有任何用的不爽或者不知道如何使用请让我知道

头像被屏蔽
发表于 2020-12-18 23:21 | 显示全部楼层
2656874277 2020-12-18 23:21 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

快速回复 返回顶部 返回列表