首页
社区
课程
招聘
[旧帖] [求助]ida的hexray反编译得到的c语言的阅读问题 0.00雪花
发表于: 2008-2-20 16:59 13356

[旧帖] [求助]ida的hexray反编译得到的c语言的阅读问题 0.00雪花

2008-2-20 16:59
13356
各位高手,我用ida的hexray反编译得到的c语言中有很多如下的代码,例如
*(_DWORD *)a1 = &off_1001B28C;
  v4 = 1;
  sub_100012D0();
  sub_10018000(*(void **)(v2 + 8));
  result = 0;
  *(_DWORD *)(v2 + 8) = 0;
  *(_DWORD *)(v2 + 12) = 0;
  *(_DWORD *)(v2 + 16) = 0;
  *(_DWORD *)v2 = &off_1001B2A8;
还有例如
  ((int (__thiscall *)(char *))**(_DWORD **)&v4)(&v4);
  _chkesp();
  (*(int (__thiscall **)(char *))(*(_DWORD *)v5 + 4))(v5);

像这样的语句该怎么理解呢?有没有方法把他们翻译成容易读明白的c代码呢?
我的c语言很菜,望各位高手赐教,谢谢。
主要是里面的*(_DWORD *),还有**)(char *))(*(_DWORD *)等不明白是什么意思。

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
确实非常想知道,恳请各位高手赐教,给个提示也好
2008-2-21 09:53
0
雪    币: 134
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
确实有很多不容易看懂,结合着汇编代码看吧。
2008-2-21 09:58
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不知道哪本书里有解释,之前从来没见过这样的写法。只知道DWORD类型的定义和简单应用,但是遇到*(_DWORD *),还有**)(char *))(*(_DWORD *)等就不清楚是什么意思了。
2008-2-21 11:42
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
*(_DWORD *)(v2 + 8) = 0;
  *(_DWORD *)(v2 + 12) = 0;
  *(_DWORD *)(v2 + 16) = 0;
  *(_DWORD *)v2 = &off_1001B2A8;
这几个搞明白了,易懂的c语言应该是
        p->m1 = 0;
        p->m3 = 0;
        p->m2 = 0;
                p->m4=&off_1001B2A8;
其他的还是没弄明白,望高手赐教。
2008-2-21 16:17
0
雪    币: 207
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呵呵!慢慢地自问自答吧!
2008-2-21 16:35
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
例如return *(_DWORD *)(a1 + 8) + 3 * *(_DWORD *)(a1 + 4) + 2 * *(_DWORD *)a1;
这个我读明白了,上面的具体意思是return p->j * 2 + p->k * 3 + p->i;
(*(int (__thiscall **)(char *))(*(_DWORD *)v5 + 4))(v5);
这种的不知道咋回事,哭
2008-2-21 16:58
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
(*(int (__thiscall **)(char *))(*(_DWORD *)v5 + 4))(v5);
这个可不可以这么理解:
(*(_DWORD *)v5 + 4))是一个函数,形如int fun1(v5)
(*(int (__thiscall **)(char *))
这些表示的是一个强制的类型转换,他就是后面的函数的定义形式

望高手相助,能否给小弟讲讲?
还有sub_10018000(*(void **)(v2 + 8));怎么理解呢?
2008-2-21 17:17
0
雪    币: 297
活跃值: (27)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
9
[预备知识]
  
  I.在面向对象的程序中会发现使用了许多类型的指针:指针的指针,指针的指针的指针,函数的指针,函数的指针的指针...
  II.在C语言中指针在和一个整数相加减时,那个整数表示指针所指的数据类型的数据的个数
比如C的
int * abc;
abc += 5;
换成汇编就变成了
add abc, 0x14
    III.这里的扩号不是强制类型转换就是用来定义函数指针
  IV.搞清楚Xray的绕口令,还不如自己来弄

  [解题]
sub_10018000(*(void **)(v2 + 8));
->
调用一个名叫sub_10018000的函数,v2是一个dword数据,和整数8相加,相加的结果强制类型转换成指向任意数据类型的指针的指针,将它所指向的指针作为参数传给函数sub_10018000。

((int (__thiscall *)(char *))**(_DWORD **)&v4)(&v4);
&v4表示地址
(DWORD **)表示将&v4强制转换成指向DWORD指针的指针
*(DWORD **)&v4得到的结果是一个整数的指针
**(DWORD **)&v4得到的结果是一个整数
将这个整数强制类型转换成一个函数,调用约定为__thiscall, 返回结果是int类型,参数是char *类型
2008-2-22 00:33
1
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
tnttools大哥谢谢您,终于明白了,非常感谢。谢谢谢谢
2008-2-22 09:55
0
游客
登录 | 注册 方可回帖
返回
//