首页
社区
课程
招聘
[求助]关于双精度浮点操作的问题,向各位请教
发表于: 2008-10-29 11:45 3663

[求助]关于双精度浮点操作的问题,向各位请教

2008-10-29 11:45
3663
lea     eax, dword ptr [ebp-128]
mov     dword ptr [ebp-EC], eax
mov     byte ptr [ebp-E8], 3
fld     qword ptr [esi+38]     *******************
fstp    tbyte ptr [ebp-134]   ********************

以上一段是双精度浮点操作,请问如何比较其数值,再改存为自已的数值???

如:操作数 是否等于10.000
相等则改为 100.00 保存到原来的地方.

请各位帮帮忙

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
浮点数的格式比较复杂。

直接按16进制显示,人是不好看出它的值的

首先,明白程序使用的浮点数所用的位数,比如fld qwordptr [esi+38]这条指令,知道加载的是一个64位浮点数。

到OD的内存窗口定位到 esi+38的地址,然后 右键->浮点->64位双精度,

再看内存窗口,是不是显示成了浮点数了???

在其上 右键->修改,即可修改它的值了。

祝你好运。
2008-10-29 11:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢回复,
OD上已看到
问题如果用 汇编 写出来 ,达到破解的目的.
2008-10-29 12:03
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
没明白你的意思,用汇编写什么功能呢?

如果是操作浮点数,需要浮点指令。

http://www.pediy.com/tutorial/chap2/Chap2-4.htm

把你需要完成的功能再描述详细一些。
2008-10-29 12:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
再谢谢
我的意思是:

我用OD调试到这里,由于数值不对,程序无法继续,在OD数据区内改后,正常运行.

现在我想用补代码的方法破解,但浮点操作不熟,不知怎样编写

主要是:fstp    tbyte ptr [ebp-134]*********
内的数据显示为 10.00 我想把它改 100.00
请指教
2008-10-29 12:24
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
6
为什么不修改跳转指令,而修改数据操作指令呢???

一般的爆破点不对数据操作下手的,当然特殊的除外。

再回到问题。

因为fstp是从浮点寄存器中向内存中写数,我理解你应该是说希望 fstp    tbyte ptr [ebp-134] 这条指令执行之后,内存ebp-134处的值应该为一个双精度的 100.00.

因为一般ebp-134是位于栈上的,通常是一个函数的局部变量,而不是.text或.data节的变量,那么无法直接修改程序.exe文件的数据区。

只能对代码进行修改。

如果你只是需要每执行到这里,那个变量的值都是100.0,可以这样修改。

首先,对
fld     qword ptr [esi+38]
fstp    tbyte ptr [ebp-134]

这两行都加个标签,按键盘上的“冒号(:)”键即可。加标签是为了方便写汇编。
比如加的标签为 patch_point 和 back_point,即

patch_point    fld     qword ptr [esi+38]
back_point     fstp    tbyte ptr [ebp-134]

在反汇编窗口往下拉,找到一大片“0”区域,反汇编代码是一大片的

ADD     BYTE PTR DS:[EAX], AL

我们就在这里打补丁。

在随便一行,加个标签,用做常数变量,如patch_data,不过要注意对齐,因为是64位双精度浮点数,至少应该在四字节地址边界处。

然后保留足够的空间后,再加个标签,如patch_code,然后从这行开始汇编:

patch_code    fld         qword ptr [patch_data]    ;将需要的值载入浮点栈
              ;fld        qword ptr [esi+38]         ;本来打补丁在跳转回去之前,要恢复被jmp指令所改写的原指令。但是这里我们正是要改写它,所以这句就不恢复了
              jmp         patch_back                ;回到补丁恢复点继续

然后在数据窗口CTRL+G,输入patch_data,将此值改为需要的值,如100.0

再在反汇编窗口CTRL+G,输入 patch_point,回到刚才我们打补丁的地方,开始汇编
jmp patch_code

现在保存所有修改到可执行文件,换个文件名保存一下,再试试。

如果正确的话,当执行到patch_point,即原来的fld     qword ptr [esi+38]指令时,会执行jmp指令,跳到我们的patch_code处,而这里我们自己汇编的代码,执行特定的功能,然后再jmp back_point,返回原来程序继续执行。

以上过程是一个比较典型的代码patch的过程,我常用此方法修改程序。使用OD的标签插件,我们可以避免一些地址计算的错误。
需要注意的是,patch_point应该位于patch_back上面的至少5个字节的位置,否则jmp指令可能会覆盖过多的指令。

我上面说patch_point用fld     qword ptr [esi+38]这条指令了,但实际上,这条指令长度不够,所以应该在往更前面的指令设定为patch_point,比如mov     byte ptr [ebp-E8], 3

这样,在patch_code跳回去之前,就必须把破坏的指令用相同的指令补上了。
这个留给你自己实验。
2008-10-29 13:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢

现在有点明白,
2008-10-29 14:02
0
游客
登录 | 注册 方可回帖
返回
//