能力值:
( LV9,RANK:850 )
2 楼
你的问题有点问题``哦呵呵``
让寄存器的值永远不变`除非你赋个值之后不再对他进行操作!因为寄存器也是个可变的量`
一个内存地址也对应一个变量``你要让一个值在一个变量里保持不变``当然可以.你不对它进行赋值操作就行`不过在调试程序时并不能知道程序是否会那个变量进行赋值操作,所以``
你可以另外找一个内存地址,比如[120012],呵呵``
mov dword ptr[120012],3fffd72
还有`你在写程序么?还是在调试??加了个段超越前缀`
能力值:
( LV2,RANK:10 )
3 楼
其实想法很简单,就是想在对寄存器赋值之前把这个值换掉,换成我想要的值,不知道在OD中怎么改了,如:
EAX中现在是1234
将要执行 MOV DWORD PTR DS:[D00023],EAX的之前我加上一句
MOV EAX,5678,这样在执行MOV DWORD PTR DS:[D00023],EAX的时候EAX 已经变成 5678了。
能力值:
( LV9,RANK:850 )
4 楼
这样是可以哇`
加上一句的话可能会麻烦点``程序可能就会死了!!
直接把5678赋给d00023这个内存地址比较好
mov dword ptr ds:[d00023],5678
如果要加上一句的话等于给程序加字节,搞不好堆栈会乱了!!呵呵``要不你就把个空白的地方,跳到要给d00023这个内存单元赋值前jmp xxxxxxx(xxxxxx为空白代码地址),
代码变成这样:
xxxxxxxx: xxxxxxxxxxxxxxxxxxxxxxxx(这为赋值前被你改为jmp的那条语句,现在恢复一下)
xxxxxxxx+n: mov eax,5678(给eax赋值)
xxxxxxxx+n: jmp xxxxxxx(xxxxxxx为mov dword ptr ds:[d00023]<-这句的地址,跳回去)
比一下``呵呵``前者简单多了
能力值:
( LV2,RANK:10 )
5 楼
前者虽然简单,可是在od中我是没法修改的(刚接触:)),双击之后修改汇编,改完后保存就提示不识别。
后者我试试看,希望可以啊。
不知道能否弄个内存补丁,知道的大大不妨提示一下,在此谢过各位
能力值:
( LV9,RANK:850 )
6 楼
OD中保存是"
右键->复制可执行文件->所有修改->右键->保存文件->确定"
能力值:
( LV2,RANK:10 )
7 楼
呵呵,没法这样改的,汇编的时候提示 “Unknown identifier”,所以不知道有没有其他办法了
能力值:
( LV9,RANK:850 )
8 楼
那你改了之后把机器码记下来`
再用w32打补丁`
能力值:
(RANK:410 )
9 楼
第一,你在OD里必须这样改写才对。MOV DWORD PTR [0D00023],3FFFD72,D00023地址前面要加0,OD才能识别这个数。
第二,MOV DWORD PTR DS:[D00023],EAX和MOV DWORD PTR DS:[D00023],3FFFD72两个指令机器码长度不一样,你这样修改就破坏后面的代码。
所以,最好的方法就是楼上说的从MOV DWORD PTR DS:[D00023],EAX改成JMP XXXXXXXX跳到程序空地(在程序里找全是0的地方),重新添加代码(注意:前面被修改后的代码必须在这里添加回去),再用JMP XXXXXXXX跳回原来的地方的下一条指令继续运行程序。
能力值:
( LV2,RANK:10 )
10 楼
1.举的例子忘了,因为以abcde开头要加0的,但实际代码中不是以字母开头的,因为没法汇编,所以此法看来没什么希望了。
看来试试jmp了,谢谢两位
能力值:
( LV2,RANK:10 )
11 楼
郁闷了,程序中没找到全0的空地(可能没找对),不知道是不是弄错了,找了个地方写了些代码,可是主程序中竟然跳不到那个地方,那位再指点下,
另如果[在程序启动的时候加个loader,让这个loader去修改某个地址的值,这样可以吗?这个patcher应该怎么来做呢?thks
能力值:
(RANK:410 )
12 楼
1、用OD打开目标程序,将滚动条拉到最下面,应该可以找到全0的空地,如果没有,那我十分佩服他将程序位用得如此恰到好处。
2、可以自己写一个Loader,在编程版上有相应的代码。
能力值:
( LV9,RANK:1130 )
13 楼
跳到空地方,赋值后返回,这个是最好的办法。楼主如果学过一两天的黑客知识就很容易知道。很简单的
空字节绝对能找到的。继续努力
能力值:
( LV2,RANK:10 )
14 楼
to 小虾:
程序最后是有全0的空白,我之前就在这里写过跳转的,但我调试的时候发现程序是无法跳到那个地方的,主要自己太菜了。主程序的领空也没有nop的
能力值:
( LV2,RANK:10 )
15 楼
这样是否为空白呢?
00406A8B 00 DB 00
00406A8C 00 DB 00
00406A8D 00 DB 00
00406A8E 00 DB 00
00406A8F 00 DB 00
00406A90 00 DB 00
00406A91 00 DB 00
00406A92 00 DB 00
能力值:
(RANK:410 )
16 楼
是的,六个字
能力值:
( LV2,RANK:10 )
17 楼
再请问下版主
我将上面的空白改为如下格式:
00442424 JMP 00406A8B
00442427 .....
.... .....
.... .....
00406A8B 00 MOV EAX,12345678
00406A8C 00 MOV DWORD PTR DS:[114],EAX
00406A8D 00 JMP 00442427
00406A8E 00 DB 00
00406A8F 00 DB 00
不知道这样改是否正确?(没改过 :))
当我调试的时候我发现上面的 JMP 00406A8B 后的“00406A8B”已经变了,并不是
原先的值?这样的话程序就无法实现跳转,导致出现异常。所以想请问下
这是为什么?
能力值:
( LV2,RANK:10 )
18 楼
再顶起来看看
能力值:
( LV4,RANK:50 )
19 楼
路过,有同样问题,帮顶。。。。。。。。。
能力值:
(RANK:410 )
20 楼
不太明白你说什么意思?
你是说你在原程序里修改成jmp xxxxxxxx后,后面的指令也被破坏了?如果是这样,这是正常的。不过你必须在空位上补上这些破坏后的代码。
能力值:
( LV2,RANK:10 )
21 楼
加粗的为我要跳转的地址,此为非运行状态下的值
0042AE5E E9 451A0200 JMP test.0044C8A8
0042AE63 833D 08010000 00 CMP DWORD PTR DS:[108],0
当我下断在此,运行程序,被od截断,地址就变了,如下:
0042AE5E E9 4566C500 JMP 010814A8
0042AE63 833D 084DC300 00 CMP DWORD PTR DS:[C34D08],0
由于这个地址无法找到,所以程序中断退出,请问这是为什么呢??谢谢啊
能力值:
( LV2,RANK:10 )
22 楼
搞不懂了。
应该是四个字,怎么是六个字呢?
能力值:
(RANK:410 )
23 楼
你修改的文件是DLL?地址被重定位了。
能力值:
( LV2,RANK:10 )
24 楼
奇怪的是我在主程序的领空修改的,没有修改dll,这个程序也只有一个exe文件,其他的dll都是调用系统的,程序是用易语言写的,真是怪了。
能力值:
( LV2,RANK:10 )
25 楼
再请问一下,为什么会出现地址重定位呢?有没有办法解决这种情况呢。
因为程序本身就是只是一个exe文件,他要用到的库我都没放在一起的。