使用它在C中的内存中编辑字符串
我真的希望以前没有问过这个,但我的谷歌搜索没有提出任何内容,所以我想我会问.
我正在处理一个小脚本,我将DLL注入游戏并编辑特定字符串,以便在特定事件发生时显示.我已经找到了这个字符串驻留在内存中的位置,并编写了一个基本的sigscanning函数,以便在运行时找到它.我现在的问题是,给定起始地址,我如何/可以用我自己的特定字符串替换此字符串? 例如,字符串是“我喜欢煎饼”,我想用“煎饼很可怕,华夫饼最好!”来取而代之.怎么会这样做呢? 谢谢! 哦是的,如果重要的话,源代码中的字符串是一个const char.我很确定它没有,但添加该信息并没有伤害! 解决方法
如您所述,引用字符串的汇编指令通常如下所示:
push offset aString 组装和链接后,这解决了一个实际的地址说: push 0x00ABCDEF 这为您提供了两个选择: >写入数据:修改aString的内容(即0x00ABCDEF指向的内存) 写数据 当编译源代码涉及标准C字符串文字(内存中的不可变字符数组)时,在运行时,字符串通常映射到包含所有其他只读数据的某个只读页面.这些数据通常是连续打包的,以减少程序的内存占用.这是你试图写一个更大的字符串时遇到的问题.您将覆盖下一条数据,对此覆盖数据的任何引用现在将指向大字符串的中间位置. 通过更改数据来编写更长的字符串并非易事,因为为了不丢失原始的功能行为,必须在字符串前进后移动所有数据.之后,您必须更新所有对移位数据的引用(其中一些可以使用指针算法动态计算).正如我所说,这个过程并不重要 – 您试图在没有完整(如果有)符号信息的情况下重新定位链接器的任务. 编写代码 简单的方法是在任意位置编写新字符串.这可能是未使用但在进程中已经保留的内存(通常称为“代码洞穴”),或者它可能是您在注入DLL时映射的字符串文字.或者,您可以在注入后在运行时动态分配. 下一步是找到对aString的所有引用,并替换它们以引用新的字符串. 奖金方法:) 由于您正在深入研究这一级别的逆向工程,您可能会遇到绕行/拦截/仪表的概念.这里可以应用类似的方法来拦截所有引用并在运行时重定向它们.与上面列出的“编写代码”方法相比,这会对性能产生更大的影响,但会保证所有访问都被捕获并重定向. 访问时的硬件断点设置为字符串指向的数据.当触发断点时,某些寄存器将保存字符串的地址.在汇编中,这可能看起来像这样: mov esi,0x00ABCDEF ... 如果访问第一个字符,代码可能会这样做: mov al,byte ptr ds:[esi] 当你的断点被命中时,你可以设置线程上下文(Windows上的SetThreadContext)来修改esi的值以指向你的新字符串. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 我可以使用Rails API执行INSERT-SELECT操
- 有人可以解释如何使用JACOB将VB代码转换为Java吗?
- 输入的字符匹配正整数 整数 正数 以及一些正则表达式的总结
- ruby-on-rails – Rails ActiveRecord group_by和sum db结果
- c# – 如何避免使用DynamicProxy :: CreateClassProxyWithT
- Springfox 解决在单一资源操作多个方法实现时生成 Swagger
- PostgreSQL中的级联删除
- 深入Oracle的left join中on和where的区别详解
- stdlib.h没有putenv的声明
- Animation动画