首页
社区
课程
招聘
[求助]有段算法不明白,请大家帮忙!
发表于: 2005-5-16 19:37 4323

[求助]有段算法不明白,请大家帮忙!

2005-5-16 19:37
4323
我在跟一个程序的算法时,到这儿不些不明白,005DB62D处这个Call怎么把源操作数变成了目标数的呢?如何用高级语言来实现(如果可以,请给出VB实现代码,谢谢!)

005DB624   |.  FILD    QWORD PTR SS:[EBP-C]   ;Stack SS:[EBP-C]=00000000FCE695D4(这是源操作数)
005DB627   |. >FMUL    QWORD PTR DS:[640A78]  ;ST0   4242970068.0000000000
005DB62D   |. >CALL    CdBoss.00402C88        ;ST0   4001657127.9702958080   
005DB632   |.  MOV     EBX,EAX  ; EAX=EE847127(这就是目标数)

00402C88   / SUB     ESP,0C
00402C8B   |.WAIT
00402C8C   |.FSTCW   SS:[ESP]
00402C8F   |.WAIT
00402C90   |>FLDCW   DS:[63C030]
00402C96   |>FISTP   QWORD PTR SS:[ESP+4]       ;  这一步就出结果数了,在堆栈里
00402C9A   |.WAIT
00402C9B   |.FLDCW   SS:[ESP]
00402C9E   |.POP     ECX
00402C9F   |.POP     EAX
00402CA0   |.POP     EDX
00402CA1   \.RETN

谢谢大家的帮助

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 61782
活跃值: (21986)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
利用堆栈传递各参数,你动态跟踪一下,注意堆栈中的数据。

005DB62D处这个Call函数的返回值是通过EAX来传递的
2005-5-16 20:10
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
3
浮点运算可以看看masm软件包里面的FPHELP.HLP,很全的
2005-5-16 22:28
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
感谢看雪老师指点!也谢谢楼上兄弟的资料!

终于看明白了一些,但是又有新问题了


1.先是005DB624处把 SS[EBP-C]装入st(0)                        
  结果:st0=4242970068.0000000000   ( FCE695D4的十进制形式)

2.然后st(0) 乘 DS:[640A78]  
  DS:[640A78]=(浮点数0.9431264100000000)
  结果:st0=4001657127.9702958080

3.005DB62D这个Call是将st(0)以整数保存到EAX. 执行的是00402C96处
  EAX=EE847127  (十进制4001657127)

问题:
1.DS:[640A78]这个地址的数值应该是固定的吗?

2.如何将FCE695D4转换为浮点数? (我在VB里,用CDbl(&HFCE695D4)转换后的结果并不是4242970068,而是
-51997228,是不是&HFCE695D4的最高位F是符号位,所以不对?  怎样才能解决? 在Windows计算器里计算是正确的 )
2005-5-17 11:37
0
雪    币: 61782
活跃值: (21986)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
DS:[640A78]是个全局变量。
2005-5-17 16:05
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
第一个问题,就如看雪老大所说,是全局变量,地址是固定的。
第二个问题:你可以先把十进制4001657127在vb里转换成十六进制,看看结果,然后和FCE695D4对比一下。
2005-5-18 01:26
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
1.第一步,先将(FCE695D4)最高位的(F)分离出来,得到(CE695D4)

2.将(CE695D4)转换为十进制 得216438228

3.由于分离出来的(F)是第八位,所以它应该是(F0000000),它转换为十进制是4026531840

4.将两次的十进制结果相加就可以了,即4026531840+216438228=4242970068

5.这样结果就对了

【问题】为什么直接转换为十六进制不行?VB里有没有直接转换的函数?
2005-5-18 11:02
0
游客
登录 | 注册 方可回帖
返回