首页
社区
课程
招聘
[求助]逆向的时候发现gluPerspective虽只有4个形参却有八个实参压入堆栈
发表于: 2013-2-12 00:10 7593

[求助]逆向的时候发现gluPerspective虽只有4个形参却有八个实参压入堆栈

2013-2-12 00:10
7593
给大家拜年了,在练习逆向的时候,有一个小地方出了一些问题,问题在题目里给出了,下面把具体情况描述下,希望大家能抽空帮忙给看看,首先给出是一段程序的代码:
void CDisplay::ResizeScene(GLsizei width, GLsizei height)
{
    if (height == 0)            
    {
        height = 1;            
    }
    glViewport(0, 0, width, height);    
    glMatrixMode(GL_PROJECTION);    
    glLoadIdentity();                
    gluPerspective(56.0f, (GLfloat)width / (GLfloat)height, 1.f, 1800.0f);
    glMatrixMode(GL_MODELVIEW);        
    glLoadIdentity();       
} 


然后在ida里面的代码如下:
.text:00409E21 ResizeScene     proc near               ; CODE XREF: GameInit+191p
.text:00409E21                                         ; sub_418182+FDp
.text:00409E21
.text:00409E21 var_1C          = qword ptr -1Ch
.text:00409E21 var_4           = dword ptr -4
.text:00409E21 arg_0           = dword ptr  8
.text:00409E21 arg_4           = dword ptr  0Ch
.text:00409E21
.text:00409E21                 push    ebp
.text:00409E22                 mov     ebp, esp
.text:00409E24                 push    ecx
.text:00409E25                 mov     [ebp+var_4], ecx
.text:00409E28                 cmp     [ebp+arg_4], 0
.text:00409E2C                 jnz     short loc_409E35
.text:00409E2E                 mov     [ebp+arg_4], 1
.text:00409E35
.text:00409E35 loc_409E35:                             ; CODE XREF: ResizeScene+Bj
.text:00409E35                 mov     eax, [ebp+arg_4]
.text:00409E38                 push    eax
.text:00409E39                 mov     ecx, [ebp+arg_0]
.text:00409E3C                 push    ecx
.text:00409E3D                 push    0
.text:00409E3F                 push    0
.text:00409E41                 call    ds:glViewport
.text:00409E47                 push    1701h
.text:00409E4C                 call    ds:glMatrixMode
.text:00409E52                 call    ds:glLoadIdentity
.text:00409E58                 push    409C2000h
.text:00409E5D                 push    0
.text:00409E5F                 push    3FF00000h
.text:00409E64                 push    0
.text:00409E66                 fild    [ebp+arg_0]
.text:00409E69                 fidiv   [ebp+arg_4]
.text:00409E6C                 sub     esp, 8
.text:00409E6F                 fstp    [esp+1Ch+var_1C]
.text:00409E72                 push    404C0000h
.text:00409E77                 push    0
.text:00409E79                 call    gluPerspective
.text:00409E7E                 push    1700h
.text:00409E83                 call    ds:glMatrixMode
.text:00409E89                 call    ds:glLoadIdentity
.text:00409E8F                 mov     esp, ebp
.text:00409E91                 pop     ebp
.text:00409E92                 retn    8
.text:00409E92 ResizeScene     endp


ida F5给出的C:
int __thiscall ResizeScene(void *this, signed int a2, signed int a3)
{
  int v3; // ST20_4@3
  void *v5; // [sp+18h] [bp-4h]@1
  v5 = this;

  if ( !a3 )
    a3 = 1;
 
  glViewport(0, 0, a2, a3);
  glMatrixMode(5889);
  glLoadIdentity(v5);
  gluPerspective(
    0,
    1078722560,
    COERCE_UNSIGNED_INT64((double)a2 / (double)a3),
    COERCE_UNSIGNED_INT64((double)a2 / (double)a3) >> 32,
    0,
    1072693248,        
    0,
    1083973632);
 
  glMatrixMode(5888);
  return glLoadIdentity(v3);
} 

请教各位,gluPerspective的参数明明四个,为什么F5的代码这里有8个?而且我计算这些数据,当作浮点数据的时候也不知道是怎么得来的? 希望有知道的朋友能够指点,祝各位新春快乐。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 2155
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
我没接触过GL编程,但是我感觉问题可能出在GLfloat这个类型上。。。

看反汇编结果,应该是调用gluPerspective()函数时,实际上是将一个64位的参数(这里应该是GLfloat)分解成高、低两个32位来压栈传输了,所以4个参数变成8个了。。。

gluPerspective(
    0,
    1078722560,

    COERCE_UNSIGNED_INT64((double)a2 / (double)a3),
    COERCE_UNSIGNED_INT64((double)a2 / (double)a3) >> 32,

    0,
    1072693248,   
     
    0,
    1083973632
)

红色应该是fovy ,黄色应该是aspect ,蓝色应该是zNear ,绿色应该是zFar 。
2013-2-12 04:12
0
雪    币: 291
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
.text:00409E21 ResizeScene     proc near               ; CODE XREF: GameInit+191p
.text:00409E21                                         ; sub_418182+FDp
.text:00409E21
.text:00409E21 var_1C          = qword ptr -1Ch
.text:00409E21 var_4           = dword ptr -4
.text:00409E21 arg_0           = dword ptr  8
.text:00409E21 arg_4           = dword ptr  0Ch
.text:00409E21

反汇编很清楚,两个是局部变量,只有两个是入口参数

arg_0,arg_4
2013-2-12 18:22
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你有源代码..你直接在VS下面看反汇编就行了...
2013-2-12 19:26
0
雪    币: 29
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
新年好,谢谢你的提醒。不过Release版本的代码和ida的基本上一致,我将它贴出来,但是我仍然不能理解诸如409c2000H,3ff00000H的意思,可否给予指点?

; 161  : 	gluPerspective(56.0f, (GLfloat)width / (GLfloat)height, 1.f, 1800.0f);

	push	1083973632				; 409c2000H
	push	0
	push	1072693248				; 3ff00000H
	push	0
	fild	DWORD PTR _width$[ebp]
	fidiv	DWORD PTR _height$[ebp]
	sub	esp, 8
	fstp	QWORD PTR [esp]
	push	1078722560				; 404c0000H
	push	0
	call	_gluPerspective@32
2013-2-13 20:01
0
雪    币: 29
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢,这几天忙着出去了就没有及时回复。我当时也是这么想的,可能是将两个参数看作一个,但是我现在对这几个参数怎么转换的不能理解,能不能帮忙解释一下呢?

————————

通过查看GLU.h 可以得知使用的是 GLdouble,即64位的参数,但具体怎么转换,还在OD跟进,不知道能不能搞懂。
void APIENTRY gluPerspective (
    GLdouble fovy, 
    GLdouble aspect, 
    GLdouble zNear, 
    GLdouble zFar);
2013-2-13 20:03
0
雪    币: 3758
活跃值: (3337)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
7
push  1083973632        ; 409c2000H
  push  0
// 1800.0 (8byte)
  push  1072693248        ; 3ff00000H
  push  0
// 1.0 (8byte)
  fild  DWORD PTR _width$[ebp]
// st0 = width
  fidiv  DWORD PTR _height$[ebp]
// st0 = st0 / height  
  sub  esp, 8
  fstp  QWORD PTR [esp]
// sub+store = push st0 lo/hi (8byte)
  push  1078722560        ; 404c0000H
  push  0
// 56.0 (8byte)
  call  _gluPerspective@32
2013-2-16 21:17
0
雪    币: 29
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢半仙。

push  1083973632        ; 409c2000H
  push  0
// 1800.0 (8byte)

这个8byte的1800是怎么计算的来的呢?有没有什么计算器之类的。为我的基础捉急啊
2013-2-17 12:27
0
雪    币: 3758
活跃值: (3337)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
9
010Editor、Hexworkshop之类均可。
就是标准的双精度浮点数编码, 注意后push的是低4byte
2013-2-17 12:32
0
游客
登录 | 注册 方可回帖
返回
//