如果你的目标程序是x86/x64, 那么当前程序也需要编译为x84/x64

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <regex>
  5. #include "GameCheatEx.h"
  6. using namespace std;
  7. int n = 1;
  8. /*
  9. extern "C" __declspec(dllexport) void __stdcall hello()
  10. {
  11. n++;
  12. printf("%d\n", n);
  13. }
  14. */
  15. void __stdcall hello(uintptr_t p)
  16. {
  17. n++;
  18. printf("%d\n", n);
  19. printf("%d\n", p); // 233
  20. }
  21. int main()
  22. {
  23. GameCheatEx::GC gc{ "game2.exe" };
  24. uintptr_t pCreateRemoteThread = GameCheatEx::GC::GetProcAddressEx(gc.hProcess, "kernel32.dll", "CreateRemoteThread");
  25. uintptr_t pOpenProcess = GameCheatEx::GC::GetProcAddressEx(gc.hProcess, "kernel32.dll", "OpenProcess");
  26. uintptr_t pCloseHandle = GameCheatEx::GC::GetProcAddressEx(gc.hProcess, "kernel32.dll", "CloseHandle");
  27. uintptr_t pWaitForSingleObject = GameCheatEx::GC::GetProcAddressEx(gc.hProcess, "kernel32.dll", "WaitForSingleObject");
  28. #ifdef _WIN64
  29. /*
  30. 0000- 55 - push rbp
  31. 0001- 48 8B EC - mov rbp,rsp
  32. 0004- 48 83 EC 18 - sub rsp,18
  33. 0008- 48 89 4D F8 - mov [rbp-08],rcx // save regs param
  34. // get local hProcess
  35. 000C- 48 83 EC 20 - sub rsp,20
  36. 0010- 48 B8 A0A10675F87F0000 - mov rax,KERNEL32.OpenProcess
  37. 001A- 48 B9 FFFF1F0000000000 - mov rcx,00000000001FFFFF // PROCESS_ALL_ACCESS
  38. 0024- 48 31 D2 - xor rdx,rdx
  39. 0027- 49 B8 DC48000000000000 - mov r8,00000000000048DC // lcoal pid
  40. 0031- FF D0 - call rax
  41. 0033- 48 89 45 F0 - mov [rbp-10],rax // save local hProcess
  42. 0037- 48 83 C4 20 - add rsp,20
  43. // call CreateRemoteThread
  44. 003B- 48 83 EC 38 - sub rsp,38
  45. 003F- 48 8B C8 - mov rcx,rax
  46. 0042- 48 31 D2 - xor rdx,rdx
  47. 0045- 4D 31 C0 - xor r8,r8
  48. 0048- 49 B9 80102E86F67F0000 - mov r9,00007FF6862E1080 // lpLocalFun
  49. 0052- 48 8B 45 F8 - mov rax,[rbp-08]
  50. 0056- 48 89 44 24 20 - mov [rsp+8*4],rax // lpParam
  51. 005B- C7 44 24 28 00000000 - mov [rsp+8*5],00000000
  52. 0063- C7 44 24 30 00000000 - mov [rsp+8*6],00000000
  53. 006B- 48 B8 70590875F87F0000 - mov rax,KERNEL32.CreateRemoteThread
  54. 0075- FF D0 - call rax
  55. 0077- 48 89 45 E8 - mov [rbp-18],rax // save pThread
  56. 007B- 48 83 C4 38 - add rsp,38
  57. // call WaitForSingleObject
  58. 007F- 48 83 EC 20 - sub rsp,20
  59. 0083- 48 B8 00200775F87F0000 - mov rax,KERNEL32.WaitForSingleObject
  60. 008D- 48 8B 4D E8 - mov rcx,[rbp-18]
  61. 0091- 48 BA FFFFFFFF00000000 - mov rdx,00000000FFFFFFFF // INFINITE
  62. 009B- FF D0 - call rax
  63. 009D- 48 83 C4 20 - add rsp,20
  64. // close hThread and hProcess
  65. 00A1- 48 83 EC 20 - sub rsp,20
  66. 00A5- 49 BC 101E0775F87F0000 - mov r12,KERNEL32.CloseHandle
  67. 00AF- 48 8B 4D E8 - mov rcx,[rbp-18]
  68. 00B3- 41 FF D4 - call r12
  69. 00B6- 48 8B 4D F0 - mov rcx,[rbp-10]
  70. 00BA- 41 FF D4 - call r12
  71. 00BD- 48 83 C4 20 - add rsp,20
  72. // end
  73. 00C1- 48 83 C4 18 - add rsp,18
  74. 00C5- 48 8B E5 - mov rsp,rbp
  75. 00C8- 5D - pop rbp
  76. 00C9- C3 - ret
  77. */
  78. vector<BYTE> funcode = GameCheatEx::GC::byteStr2Bytes("55 48 8B EC 48 83 EC 18 48 89 4D F8 48 83 EC 20 48 B8 A0 A1 06 75 F8 7F 00 00 48 B9 FF FF 1F 00 00 00 00 00 48 31 D2 49 B8 DC 48 00 00 00 00 00 00 FF D0 48 89 45 F0 48 83 C4 20 48 83 EC 38 48 8B C8 48 31 D2 4D 31 C0 49 B9 80 10 2E 86 F6 7F 00 00 48 8B 45 F8 48 89 44 24 20 C7 44 24 28 00 00 00 00 C7 44 24 30 00 00 00 00 48 B8 70 59 08 75 F8 7F 00 00 FF D0 48 89 45 E8 48 83 C4 38 48 83 EC 20 48 B8 00 20 07 75 F8 7F 00 00 48 8B 4D E8 48 BA FF FF FF FF 00 00 00 00 FF D0 48 83 C4 20 48 83 EC 20 49 BC 10 1E 07 75 F8 7F 00 00 48 8B 4D E8 41 FF D4 48 8B 4D F0 41 FF D4 48 83 C4 20 48 83 C4 18 48 8B E5 5D C3");
  79. *(uintptr_t*)(funcode.data() + 0x12) = (uintptr_t)pOpenProcess; // OpenProcess
  80. *(uintptr_t*)(funcode.data() + 0x29) = (uintptr_t)GetCurrentProcessId(); // local pid
  81. *(uintptr_t*)(funcode.data() + 0x4A) = (uintptr_t)&hello; // lpLocalFun
  82. *(uintptr_t*)(funcode.data() + 0x6D) = (uintptr_t)pCreateRemoteThread; // CreateRemoteThread
  83. *(uintptr_t*)(funcode.data() + 0x85) = (uintptr_t)pWaitForSingleObject; // WaitForSingleObject
  84. *(uintptr_t*)(funcode.data() + 0xA7) = (uintptr_t)pCloseHandle; // CloseHandle
  85. #else
  86. /*
  87. 0000- 55 - push ebp
  88. 0001- 8B EC - mov ebp,esp
  89. 0003- 83 EC 08 - sub esp,08
  90. // get local hProcess
  91. 0006- 68 7C230000 - push 0000237C { local pid }
  92. 000B- 6A 00 - push 00
  93. 000D- 68 FFFF1F00 - push 001FFFFF { PROCESS_ALL_ACCESS }
  94. 0012- B8 0089C776 - mov eax,KERNEL32.OpenProcess
  95. 0017- FF D0 - call eax
  96. 0019- 89 45 FC - mov [ebp-04],eax
  97. // call CreateRemoteThread
  98. 001C- 6A 00 - push 00
  99. 001E- 6A 00 - push 00
  100. 0020- FF 75 08 - push [ebp+08] { localfun param }
  101. 0023- 68 50102100 - push 00211050 { local funAddr }
  102. 0028- 6A 00 - push 00
  103. 002A- 6A 00 - push 00
  104. 002C- FF 75 FC - push [ebp-04]
  105. 002F- B8 0041C976 - mov eax,KERNEL32.CreateRemoteThread
  106. 0034- FF D0 - call eax
  107. 0036- 89 45 F8 - mov [ebp-08],eax
  108. // call WaitForSingleObject
  109. 0039- B8 403EC876 - mov eax,KERNEL32.WaitForSingleObject
  110. 003E- 68 FFFFFFFF - push FFFFFFFF { INFINITE }
  111. 0043- FF 75 F8 - push [ebp-08]
  112. 0046- FF D0 - call eax
  113. // close hThread and hProcess
  114. 0048- BB 503CC876 - mov ebx,KERNEL32.CloseHandle
  115. 004D- FF 75 F8 - push [ebp-08]
  116. 0050- FF D3 - call ebx
  117. 0052- FF 75 FC - push [ebp-04]
  118. 0055- FF D3 - call ebx
  119. 0057- 83 C4 08 - add esp,08
  120. 005A- 8B E5 - mov esp,ebp
  121. 005C- 5D - pop ebp
  122. 005D- C2 0400 - ret 0004
  123. */
  124. vector<BYTE> funcode = GameCheatEx::GC::byteStr2Bytes("55 8B EC 83 EC 08 68 7C 23 00 00 6A 00 68 FF FF 1F 00 B8 00 89 C7 76 FF D0 89 45 FC 6A 00 6A 00 FF 75 08 68 50 10 21 00 6A 00 6A 00 FF 75 FC B8 00 41 C9 76 FF D0 89 45 F8 B8 40 3E C8 76 68 FF FF FF FF FF 75 F8 FF D0 BB 50 3C C8 76 FF 75 F8 FF D3 FF 75 FC FF D3 83 C4 08 8B E5 5D C2 04 00");
  125. *(uintptr_t*)(funcode.data() + 0x07) = (uintptr_t)GetCurrentProcessId(); // local pid
  126. *(uintptr_t*)(funcode.data() + 0x13) = (uintptr_t)pOpenProcess; // OpenProcess
  127. *(uintptr_t*)(funcode.data() + 0x24) = (uintptr_t)&hello; // lpLocalFun
  128. *(uintptr_t*)(funcode.data() + 0x30) = (uintptr_t)pCreateRemoteThread; // CreateRemoteThread
  129. *(uintptr_t*)(funcode.data() + 0x3A) = (uintptr_t)pWaitForSingleObject; // WaitForSingleObject
  130. *(uintptr_t*)(funcode.data() + 0x49) = (uintptr_t)pCloseHandle; // CloseHandle
  131. #endif // _WIN64
  132. BYTE* newmem = (BYTE*)VirtualAllocEx(gc.hProcess, 0, funcode.size(), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  133. printf("newmem: %x\n", newmem);
  134. WriteProcessMemory(gc.hProcess, newmem, funcode.data(), funcode.size(), 0);
  135. while (true)
  136. {
  137. HANDLE hThread = CreateRemoteThread(gc.hProcess, 0, 0, (LPTHREAD_START_ROUTINE)newmem, (LPVOID)233, 0, 0);
  138. WaitForSingleObject(hThread, INFINITE);
  139. CloseHandle(hThread);
  140. Sleep(1000);
  141. }
  142. VirtualFreeEx(gc.hProcess, newmem, 0, MEM_RELEASE);
  143. return 0;
  144. }

c++ winapi 让目标程序(target)调用当前程序(local)的函数的更多相关文章

  1. Matlab与C++混合编程 1--在C++中调用自己写的matlab函数

    在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...

  2. C/C++:Windows编程—调用DLL程序的2种方法(转载)

    文章为转载,原文出处https://blog.csdn.net/qq_29542611/article/details/86618902 前言先简单介绍下DLL.DLL:Dynamic Link Li ...

  3. python调用其他程序或脚本方法(转)

    python运行(调用)其他程序或脚本 在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地 ...

  4. MATLAB调用C程序、调试和LDPC译码

    MATLAB是一个很好用的工具.利用MATLAB脚本进行科学计算也特别方便快捷.但是代码存在较多循环时,MATLAB运行速度极慢.如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行 ...

  5. 在ORACLE触发器里调用JAVA程序

    因为项目需要,有一个已经写好的Java程序,想要在Oracle某个表的触发器中调用,以使得每次数据更新时,调用这个JAVA程序,来修改后台某个数据. 现将过程记录如下: 1.编写JAVA程序 publ ...

  6. java本地方法如何调用其他程序函数,方法详解

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...

  7. C/C++程序通过动态链接库调用MATLAB程序

    C/C++程序通过动态链接库调用MATLAB程序 1 MATLAB编译器设置 需要设定对应的C++编译器才能编译.m文件生成可供C++调用的库文件. 在MATLAB命令行输入:mex –setup:然 ...

  8. C#调用java程序

    前言: 最近跟项目组的人合作一个项目,由于之前我用的是java写的一个与android通信的程序,现在另一个同事来编写界面程序,由于C#编写起来比较方便,而我又不想重新写之前java的那段代码,于是需 ...

  9. LoadRunner调用Java程序—性能测试-转载

    LoadRunner调用Java程序—性能测试   为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunn ...

随机推荐

  1. 基于GTID恢复误篡改数据

    问题描述:创建测试库和测试表,先update数据,在delete数据,在update数据,通过gtid查找两次update的值. 参考文档:https://baijiahao.baidu.com/s? ...

  2. Spring Boot构建 RESTful 风格应用

    Spring Boot构建 RESTful 风格应用 1.Spring Boot构建 RESTful 风格应用 1.1 实战 1.1.1 创建工程 1.1.2 构建实体类 1.1.4 查询定制 1.1 ...

  3. Prometheus监控Kafka

    Prometheus监控Kafka 1.Prometheus监控Kafka,Docker方式 Kafka监控优秀博文: 简书:whaike:[监控]Kafka - 详细指标 CSDN:GeekXuSh ...

  4. Linux环境mysql快速备份及迁移

    在项目实施的过程中,经常会面临数据库迁移,导出和导出数据,如果用普通的mysql客户端备份,时间较长且容易出错.那么mysql快速备份及迁移,就成为数据库迁移的重中之重. 下面介绍我在项目实现过程中用 ...

  5. zabbix设置告警

    1.配置告警媒介 邮件: 微信: #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib,urllib2,datetime,hashli ...

  6. 分布式理论 PACELC 了解么?

    PACELC 基于 CAP 理论演进而来. CAP 理论是一个分布式系统中老生常谈的理论了: C(Consistency):一致性,所有节点在同一时间的数据完全一致. A(Availability): ...

  7. 如何用RabbitMQ实现延迟队列

    前言 在 jdk 的 juc 工具包中,提供了一种延迟队列 DelayQueue.延迟队列用处非常广泛,比如我们最常见的场景就是在网购或者外卖平台中发起一个订单,如果不付款,一般 15 分钟后就会被关 ...

  8. Flink-v1.12官方网站翻译-P018-Event Time

    事件时间 在本节中,您将学习如何编写时间感知的Flink程序.请看一下及时流处理,了解及时流处理背后的概念. 关于如何在Flink程序中使用时间的信息请参考windowing和ProcessFunct ...

  9. HarmonyOS应用开发-Component体系介绍(一)

    目录: 1. Component的内部类/接口 2. Component方法简介 3.总结 在HarmonyOS的UI框架中,Component为用户界面提供基本组件,Component类位于ohos ...

  10. 2019牛客暑期多校训练营(第七场)E-Find the median(思维+树状数组+离散化+二分)

    >传送门< 题意:给n个操作,每次和 (1e9范围内)即往数组里面插所有 的所有数,求每次操作后的中位数思路:区间离散化然后二分答案,因为小于中位数的数字恰好有个,这显然具有单调性.那么问 ...