主题 : c++搜索内存
xixi 离线
头像
级别: 写挂新手[LV3]
今日未签到 (共签到1天)
发帖: 81
铜币: 838 枚
下载币: 420 点
写挂币: 0 XG
在线等级:在线等级:1 级
在线时长:12 小时
升级剩余时间:8 小时
楼主  发表于: 2016-10-11

c++搜索内存

复制代码
  1. DWORD ScanOpcode(HANDLE process, const char *markCode,
  2. int distinct,
  3. LPDWORD offset = NULL,
  4. DWORD size = 4,
  5. DWORD ordinal = 1,
  6. DWORD beginAddr = 0x00400000, DWORD endAddr = 0x7FFFFFFF)
  7. {
  8. const DWORD pageSize = 4096;
  9. if (strlen(markCode) % 2 != 0) return 0;
  10. int len = strlen(markCode) / 2;
  11. BYTE *m_code = new BYTE[len];
  12. for (int i = 0; i < len; i++) {
  13. char c[] = { markCode[i * 2], markCode[i * 2 + 1], '\0' };
  14. m_code[i] = (BYTE)::strtol(c, NULL, 16);
  15. }
  16. BOOL _break = FALSE;
  17. int curPage = 0;
  18. int curIndex = 0;
  19. BYTE *page = new BYTE[pageSize + len - 1];
  20. DWORD tmpAddr = beginAddr;
  21. DWORD ord = 0;
  22. while (tmpAddr <= endAddr - len) {
  23. ::ReadProcessMemory(process, (LPCVOID)tmpAddr, page, pageSize + len - 1, 0);
  24. for (int i = 0; i < pageSize; i++) {
  25. for (int j = 0; j < len; j++) {
  26. if (m_code[j] != page[i + j])break;
  27. if (j == len - 1) {
  28. ord++;
  29. if (ord != ordinal)
  30. break;
  31. _break = TRUE;
  32. curIndex = i;
  33. break;
  34. }
  35. }
  36. if (_break) break;
  37. }
  38. if (_break) break;
  39. curPage++;
  40. tmpAddr += pageSize;
  41. }
  42. if (tmpAddr > endAddr - len)
  43. return 0;
  44. DWORD offsetaddr = curPage * pageSize + curIndex + beginAddr + distinct;
  45. if (offset != NULL) {
  46. *offset = offsetaddr;
  47. }
  48. DWORD base;
  49. ::ReadProcessMemory(process, (LPVOID)offsetaddr, &base, 4, 0);
  50. delete m_code;
  51. delete page;
  52. return base & 0xFFFFFFFF >> (4 - size) * 8;
  53. }
关键词: 内存
xixi 离线
头像
级别: 写挂新手[LV3]
今日未签到 (共签到1天)
发帖: 81
铜币: 838 枚
下载币: 420 点
写挂币: 0 XG
在线等级:在线等级:1 级
在线时长:12 小时
升级剩余时间:8 小时
沙发  发表于: 2016-10-11
用法:
DWORD ScanAddr(HANDLE process, const char *markCode,
int distinct,
DWORD size = 4,
DWORD ordinal = 1,
DWORD beginAddr = 0x00400000, DWORD endAddr = 0x7FFFFFFF)
{
DWORD addr = NULL;
ScanOpcode(process, markCode, distinct, &addr, size, ordinal, beginAddr, endAddr);
return addr;
}

void 搜索()
{
HANDLE hProcess;
DWORD 地址;
char* opcode = "AEC500000000000000000000C201000000";//石头的特征码
hProcess = GetCurrentProcess();
地址 = ScanAddr(hProcess, opcode, 0);
写内存整数(pid, 地址, 8582);
公告(L"数据搜索一段完成");
}
xixi 离线
头像
级别: 写挂新手[LV3]
今日未签到 (共签到1天)
发帖: 81
铜币: 838 枚
下载币: 420 点
写挂币: 0 XG
在线等级:在线等级:1 级
在线时长:12 小时
升级剩余时间:8 小时
板凳  发表于: 2016-10-11
void 搜索()
{
HANDLE hProcess;
DWORD 地址;
char* opcode = "3E4A00000000000000000000000000000000000000000000000000000000000000000000";
hProcess = GetCurrentProcess();
地址 = ScanAddr(hProcess, opcode, 0);
写内存整数(pid, 地址, 70023);
}
void 搜索特征码()
{
HANDLE hProcess;
DWORD 地址;
char* opcode = "494A000000000000FFFFFFFF000000000000000000000000";
hProcess = GetCurrentProcess();
地址 = ScanAddr(hProcess, opcode, 0);
写内存整数(pid, 地址, 70032);
}

void 设计图怪物()
{
int a;
写内存整数(pid, 读内存整数(pid, 读内存整数(pid, 读内存整数(pid, 读内存整数(pid, 人物基址) + 0x5B1C) + 0x58) + 0xC) + 0x474, 4195840);
写内存整数(pid, 0x400600, 64796);
写内存整数(pid, 0x400604, -1);
写内存整数(pid, 0x400608, -1);
写内存整数(pid, 0x40060C, 666666);
}
描述
快速回复

头像
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:

验证问题:
本站名称是 正确答案:写挂论坛
按"Ctrl+Enter"直接提交
      本站是非盈利性质的个人论坛,所有信息均为原作者提供和网友推荐收集整理而来,仅供学习和研究使用。如有侵犯你版权的,请来信指出,本站将立即改正。
      powerd by: PHPWind Code © 2010-2012 www.xiegua.com 写挂论坛 Time now is:02-21 06:19, 闽ICP备11001602号