能力值:
( LV5,RANK:60 )
2 楼
1.#pragma comment(linker, "/SECTION:.secure,ERW")
2.写入内存的时候用VirtualProtect改变内存属性
以上两种应该都可以
能力值:
( LV2,RANK:10 )
3 楼
不错,不过后来发现程序不对不是因为这个原因,是别的地方出错了,我把问题复杂化了
能力值:
( LV2,RANK:10 )
4 楼
我构造了这样一个程序:
int a;
int main(int argc, char* argv[])
{
static int b;
_asm int 3;
a=0;
b=0;
return 0;
}
用OllyDbg调用这个程序,中断在int3的地方,接下来两句a=0,b=0的反汇编代码如下:
00401028 |. CC int3
00401029 |. C705 4C7C4200 00000000 mov dword ptr ds:[427C4C], 0
00401033 |. C705 487C4200 00000000 mov dword ptr ds:[427C48], 0
PEiD里查看,.data节VOffset=24000,VSize=5610,于是27C4C(全局变量a)和27C48(静态变量b)正好在这个节中。
然后是Stack和heap的定位。。。这个我想了好久没什么头绪。。。但是dbg了几个程序,程序开始时ESP的值都是0x0012FFC4...这个。。。不知什么原因。。。。留待研究。。但是也基本可以定位局部变量的位置了,就是小于这个值的空间。。
然后就是堆。。。。这个是最头疼的东西了。。。。记得前几天测试malloc()的时候,也对得到地址的规律莫名了很久。。。。后来单步的时候,碰到了HeapAlloc(),网上搜了一下,可能这两篇文章能有些帮助(后一篇是Linux下的,但是可作为参考):
http://blog.csdn.net/zero2046/archive/2005/12/23/559742.aspx
http://blog.csdn.net/drizztzou/archive/2007/06/11/1648328.aspx 这样,大体上可以定位各种各样的数据的存放位置了。然后在这个范围内搜索应该比直接搜索0x00010000~0x7ffeffff快一些。 然后,想到金山游侠有个功能是“暂停当前游戏并切换到普通模式下修改”(或许是其它描述。。记不清楚了。)。。让我一下子想到了SEH(Structured Exception Handling ,windows异常处理机制)。。。也许。。或许。。。金山游侠也是像大多调试器一样,在目标代码中插入int3来断下程序运行以获取各寄存器状态?
然后,你所要修改的游戏数据不是固定地址。。于是再考虑这各种变量类型。。
位于Section中的数据,因为是写入PE文件中的,所以每次加载后,VA不会变化。
而位于栈中的数据,因为执行部分已经写入.text节,所以如果每次执行的时候,ESP确定0x0012FFC4不变的话,那么栈中的数据位置应该也不会变化。。。
那么最有可能的就是数据位于堆中了。。。但是。。我构造了一个小程序,只有两句代码:
int * a = (int *)malloc(1);
printf("%d",a);
多次执行,却得到了相同的结果。。。。。。