-
-
[旧帖]
[邀请码已发]OldServiceAddress = (ULONG)Address + 0x7A*4 ...
0.00雪花
-
发表于:
2009-7-23 08:59
1729
-
[旧帖] [邀请码已发]OldServiceAddress = (ULONG)Address + 0x7A*4 ...
0.00雪花
呃,按愿意写的话,标题貌似放不下,帖子里做说明吧
首先说一与,我是一个彻底的初学者,最近比较闲,一个多星期前突然对软件破解起了兴趣,所以就开始找这方面的资料学习,学之前甚至连C语言都不了解
,所以才会出现了现在所遇到的这个问题,熟悉C的人,肯定是不会有了,不过还是给不熟悉的人提个醒,免的以后遇到同样的问题却不知道怎么回事!
前两天看的堕落天才的 SSDT Hook的妙用-对抗ring0 inline hook 于是想要试着按他的办法写一下,也好加深一下印象
在COPY到
ULONG Address;
Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//0x7A为NtOpenProcess服务ID
OldServiceAddress = *(ULONG*)Address;//保存原来NtOpenProcess的地址
这个地方的时候,突然想给他改种写法,反正他不就是先取ServiceTableBase指针地址然后再加上个0X7A*4吗,我就给他分开来写,先获取指针,然后下一步再去找NtOpenProcess的地址指针
于是改为
PULONG Address = (PULONG) KeServiceDescriptorTable->ServiceTableBase ;
OldServiceAddress = *((PULONG)(Address + 0x7A * 4));//保存原来NtOpenProcess的地址
按我的想法,这两种写法得到的结果应该是完全一样的
结果BUILD后,拿到虚拟机上加载,运行 然后直接机器死机!
用windbg下断点调试,跟踪到这一步,查看Address的值,没有问题,就是KeServiceDescriptorTable->ServiceTableBase 的地址,跟堕落天才的那种写法,追到这步时所得到的地址完全一样啊,可为什么我的就会死机,他的就没事呢?
带着三分不信邪七分不服气的想法,又改了一种写法
OldServiceAddress = *(PULONG)((ULONG)Address + 0x7A * 4);
这次再编译运行后,这下得到的结果就是正确的了。
仔细查看这两种方法的不同,然后又重新看了下C教程里关于指针加法的概念,终于发现 第一种写法上 Address是一个指针变量,他指向的类型是ULONG型,每个ULONG型占用4个节字,而对这个指针+1其实内存地址会进行+4的操作,=0x7A*4 实际上内存地址是增加了0x7A*4*4,得到的结果当然不正确了。。。
其实这个问题属于基本的常识性问题,有点经验的人肯定直接就能发现问题所在,我因为这是第一个实际上手的例子,所以出现了这个情况,不过借此机会到是让我更深刻的理解了对指针变量的操作方法,算是一个小小的进步吧
写这个就是为了提醒像我一样的新手,可不要再犯同样的错误,不然蓝屏死机你都不知道是咋回事,哈哈
第一次发表原创内容,写的乱七八糟的,大家就凑合着看吧,版主兄弟要是看着合适,给俺来个邀请码吧,实在是有很多问题想去别的区里发发问,找找答案
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法