能力值:
(RANK:260 )
|
-
-
2 楼
浮点数的格式比较复杂。
直接按16进制显示,人是不好看出它的值的
首先,明白程序使用的浮点数所用的位数,比如fld qwordptr [esi+38]这条指令,知道加载的是一个64位浮点数。
到OD的内存窗口定位到 esi+38的地址,然后 右键->浮点->64位双精度,
再看内存窗口,是不是显示成了浮点数了???
在其上 右键->修改,即可修改它的值了。
祝你好运。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢回复,
OD上已看到
问题如果用 汇编 写出来 ,达到破解的目的.
|
能力值:
(RANK:260 )
|
-
-
4 楼
没明白你的意思,用汇编写什么功能呢?
如果是操作浮点数,需要浮点指令。
http://www.pediy.com/tutorial/chap2/Chap2-4.htm
把你需要完成的功能再描述详细一些。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
再谢谢
我的意思是:
我用OD调试到这里,由于数值不对,程序无法继续,在OD数据区内改后,正常运行.
现在我想用补代码的方法破解,但浮点操作不熟,不知怎样编写
主要是:fstp tbyte ptr [ebp-134]*********
内的数据显示为 10.00 我想把它改 100.00
请指教
|
能力值:
(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跳回去之前,就必须把破坏的指令用相同的指令补上了。
这个留给你自己实验。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢
现在有点明白,
|
|
|