我爱秘籍论坛

 找回密码
 加入论坛

QQ登录

只需一步,快速开始

扫一扫,访问微社区

CE:最优秀的游戏修改工具入门:修改器制作傻瓜教程说说:你最想要找的修改器以前游戏玩我们,现在我们玩游戏
进阶:游戏修改视频教程导航必备:超2400款游戏秘籍下载:超5000款游戏修改器必读:论坛金币获得方法
查看: 9263|回复: 30

[C/C++] 关于aobscan的实现原理

  [复制链接]
发表于 2010-9-27 13:32:09 | 显示全部楼层 |阅读模式
我发现这里好多人用的语言都不一样,所以我尽量就不针对某种语言来讲了。(我写的C代码)

首先,获得进程PID。
可以根据标题获得,也可以根据进程名获得。各有各的好处吧。还有窗口类名哈。

例如:

  1.         HWND hwnd = FindWindow("MainWindow", NULL);
  2.         if (hwnd)
  3.         {
  4.                 DWORD dwPid;
  5.                 GetWindowThreadProcessId(hwnd, &dwPid);
  6.                 //return dwPid;
  7.         }
复制代码
第二步,获得进程相关信息,例如内存大小。

  1.         HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
  2.         PROCESS_MEMORY_COUNTERS pmc;
  3.         pmc.cb = sizeof(PROCESS_MEMORY_COUNTERS);
  4.         ::GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc));
  5.         //printf("%d\n%d\n",dwPid,pmc.WorkingSetSize/1024/1024);
复制代码
第三步,遍历程序内存。
因为上一步已经获得内存大小了,所以一个循环。
(获得内存数据之前,是否检查一下内存属性呢?我觉得应该需要,但是我这里只讲讲原理,就省掉了)
另外据说Windows一个内存页就是4kb,所以写成这样:

  1.         char key[] = {0x80, 0x7f, 0x49, 0x00};//查找的数据以及长度
  2.         int len = 4;       
  3.         PBYTE pAddress = NULL;
  4.         int i = 0;
  5.         int n = 0;
  6.         for (; i < pmc.WorkingSetSize; i += 4096)
  7.         {
  8.                 BYTE arBytes[4096];
  9.                 if (!::ReadProcessMemory(hProcess, (LPVOID)i, arBytes, 4096, NULL)) continue;
  10.                 {
  11.                         if (memstr(key, len, (char*)arBytes, 4096) != 0)
  12.                         {
  13.                                 printf("%d  %d\n", memstr(key, len, (char*)arBytes, 4096), arBytes);
  14.                                 n = memstr(key, len, (char*)arBytes, 4096) - (unsigned char*)arBytes;
  15.                                 break;
  16.                         }
  17.                 }
  18.         }
  19.         i += n;
  20.         printf("%x  %d", i, n);
复制代码
现在i变量中的地址,就是我们查找的数据的地址了。

如果我有什么不正确的地方请指正。







附带一个最简单的menstr函数,几乎没有优化哈。

  1. unsigned char *memstr(char * dst , int dst_len, char *src , int src_len )
  2. {
  3.         int i;
  4.         char *cp = src;
  5.         if (src_len < dst_len)
  6.         {
  7.                 return NULL;
  8.         }
  9.         for (i = 0; i <= src_len - dst_len; i++)
  10.         {
  11.                 if (memcmp(cp , dst , dst_len) == 0)
  12.                 {
  13.                         return (unsigned char *)cp;
  14.                 }
  15.                 cp++;
  16.         }
  17.         return   NULL;
  18. }
复制代码

评分

参与人数 1金币 +30 鲜花 +1 收起 理由
我爱秘籍 + 30 + 1 技术帖

查看全部评分

发表于 2018-1-18 20:48:10 | 显示全部楼层

楼主的教程教得很好  值得学习一下
回复 支持 反对

使用道具 举报

发表于 2010-9-27 13:35:01 | 显示全部楼层
恩 支持
学习一下~
发表于 2010-9-27 14:19:59 | 显示全部楼层
做个成品出来最好
发表于 2010-9-27 15:25:27 | 显示全部楼层
是C的代码
发表于 2010-9-27 16:17:34 | 显示全部楼层
本帖最后由 logkll2193 于 2010-9-27 16:19 编辑

感觉用什么语言都一样...
用C算是最简单的了.毕竟msdn上的api说明全是c版
发表于 2010-9-27 17:59:07 | 显示全部楼层
技术帝
 楼主| 发表于 2010-9-27 18:36:44 | 显示全部楼层
回复 3# 我爱秘籍

我会加到那个通用修改器里面去的,目前这个功能虽然没问题,但是算法太垃圾了,不是我想要的
 楼主| 发表于 2010-9-27 18:37:06 | 显示全部楼层
回复 6# w110112117

版主你好
发表于 2010-12-21 17:58:05 | 显示全部楼层
正在找介绍aobscan的文章
发表于 2011-2-15 01:00:18 | 显示全部楼层
嗯 收藏起来
发表于 2011-8-14 20:15:23 | 显示全部楼层
根本就是乱写的...
发表于 2011-8-14 20:18:22 | 显示全部楼层
路过看看
发表于 2011-8-14 20:37:17 | 显示全部楼层
简单的说下吧:pmc.WorkingSetSize只是进程使用的内存总量,但进程使用的内存并不是0~pmc.WorkingSetSize这段。别的不说,0~0x0000ffff都是空指针段,不会使用的...
具体怎么做自己再去了解一下windows内存布局吧...

  1. #include <windows.h>
  2. #include <Psapi.h>
  3. #pragma comment(lib, "Psapi")
  4. int main()
  5. {
  6.     void *p = malloc(1 << 21);
  7.     PROCESS_MEMORY_COUNTERS counters = {0};
  8.     if (!GetProcessMemoryInfo(GetCurrentProcess(), &counters, sizeof(counters))) return 1;
  9.     printf("%d %d", counters.WorkingSetSize, p);
  10.     free(p);
  11. }
复制代码

这小段代码输出的两个数字,后面那个指针地址的数值比counters.WorkingSetSize大,用你上面凭想象写的搜索方式是定位不到的。
写东西要负责啊...
发表于 2011-8-14 22:10:00 | 显示全部楼层
各住技术帝
发表于 2011-8-26 11:43:35 | 显示全部楼层
发表于 2011-8-26 11:48:56 | 显示全部楼层
表示我啥也没看懂?
头像被屏蔽
发表于 2011-10-4 23:29:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-10-22 18:53:50 | 显示全部楼层
学习一下~~~~~
发表于 2012-1-7 23:30:44 | 显示全部楼层
楼主的教程教得很好  值得学习一下
发表于 2012-1-13 22:26:34 | 显示全部楼层
看不懂啊
您需要登录后才可以回帖 登录 | 加入论坛

本版积分规则

QQ|Archiver|手机版|小黑屋|我爱秘籍论坛  

GMT+8, 2019-1-20 16:20 , Processed in 0.128277 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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