首页
社区
课程
招聘
[旧帖] [求助]*((DWORD*)i1) 不好理解 0.00雪花
发表于: 2012-10-7 22:17 1926

[旧帖] [求助]*((DWORD*)i1) 不好理解 0.00雪花

2012-10-7 22:17
1926
DWORD i1=(DWORD)GetModuleHandle(NULL);

        //i1=0x400000

        DWORD p=*((DWORD*)i1);

        //p=0x0905A4D

//        这是为什么呢?? 如果把它们当地址用 对吗???为什么???*((DWORD*)i1)关键也就这里了
//其实一定要这样吗??比如SSDT HOOK里 希望知道的指点下  谢.....

//我的理解:我的理解是i1转换成了指针类型此时i1是一个指针保存i1地址  我再用*读取i1的地址处的值  理应和前面的i1是一样的??

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我的理解:*((DWORD*)i1),首先将i1强制类型转换变成指针,然后取这个指针所指内存中的数据。也就是说p的取值是内存地址0x400000中的数据。不知道对不对。。。求大神。。。
2012-10-7 23:06
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
i1=(DWORD)GetModuleHandle(NULL);  得到的i1 = 模块的指针,不过 其实指针在硬件里也就是一个DWORD型的,所以。。。
p=*((DWORD*)i1); p = 模块的头一个 DWORD值,也就是内存地址为0x400000处的值。
2012-10-8 21:59
0
雪    币: 274
活跃值: (30)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
首先将 i1的数据强制转换成一个双字节的指针,然后再取这个指针指向的地址的值 举个例子说:i1的数据为
0x2223 先将数据强制转换成指针---(DWORD*)i1,表明i1存取的不是一个整型也不是float等,而是一个地址数据,也就是相当于偏移地址 最后p=*((DWORD*)i1);

取偏移地址为 0x2223的双字节数据赋值给p(你可以将(DWORD*)i1当做一个整体来理解 有lp代替这个指针,相当于p = *lp)
2012-10-9 08:41
0
雪    币: 274
活跃值: (30)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
额,上面忘记 i1有取值了 那更好理解了,就是将0x400000
作为偏移地址来继续进行取值,可以将0x40000理解为p指针的指针,这也是反汇编破解时
来找基址的方法
2012-10-9 08:45
0
雪    币: 4823
活跃值: (3487)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
嗯我反了汇编  是这样的 有时看似不是一个指针 却又可以以指针方式访问
2012-10-11 00:44
0
雪    币: 4823
活跃值: (3487)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
如果是 这样会成立吗

int i1=5;

int p=*((DWORD*)i1);
2012-10-11 00:46
0
游客
登录 | 注册 方可回帖
返回
//