首页
社区
课程
招聘
修改内存跳转问题(更新提问)
发表于: 2009-12-7 16:58 3797

修改内存跳转问题(更新提问)

2009-12-7 16:58
3797
呃....困扰多日...
目的: 让目标程序调用自己编写的函数
第一部分:(已解决)
过程:1 查找地址

2.编写程序

void __stdcall test(){
	::AfxMessageBox ("dsssssssssssssssssssssssssss");
}

3.测试程序


请各位朋友给指点下我的问题可能出现在哪里.......
现在注入后 查看 地址是确实改了的,但是地址过高 应该超出了2G的范围,那么我想调用我的test应该怎么办.... 有什么资料可以参考 谢谢各位

后续 解决方案(5L):
临时的解决办法
就是原文中 我试图 E8 ******** JMP 到函数需要计算地址吧......(原先我以为不能jmp到立即数,但是貌似是不对的)
临时变通为 mov eax,test
                 JMP eax
*((BYTE  *)(0x00452e98))= (BYTE)(0xB8);
 * ((DWORD *)(0x00452e99)) = (DWORD)(test);
 *((BYTE  *)(0x00452e9D)) = (BYTE)(0xFF);
 *((BYTE  *)(0x00452e9E)) = (BYTE)(0xE0);
 *((BYTE  *)(0x00452e9F)) = (BYTE)(0x90);


-----------------------------------------------------------------
第二部分:(等待)
本来想另外出分求助的,但是考虑到这仍然是一个问题,为了以后好整理,特提到一块,我看能否时候补分,不能的话,下次提问一定补上.
问题:上面那部分代码是无错的 注入验证也是可以的,一切似乎都那么美好,但是恐怖的事情发生了,我再接再厉 进入实战 仅仅是做了小小的改动

正如你所看到的,仅仅是地址多了大约2M而已
奇怪的现象出现了,VS2008 对所有形如0x006*****的地址报 未声明的标识符  错2052  
我甚至更换了一个机器 仍然出现该情况,求指点.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
*((DWORD *)(0x0045301A)) = (DWORD)(test);

楼主还是学学相对call指令的Opcode写法是怎么一回事吧,这个DWORD不是直接是test,而应该是test的地址减去call指令的地址再减去call指令的长度。
2009-12-7 17:16
0
雪    币: 299
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
*((DWORD *)(0x0045301A)) = (DWORD)(test) ;
改成形如:
*((DWORD *)(0x0045301A)) = (DWORD)(test-0x0045301A-4) ;???不知道理解的对不
2009-12-7 17:21
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
饿,2楼的意思是你起码应该这样写代码:
*((DWORD *)(0x0045301A)) = (DWORD)(test) ; ------> *(DWORD *)(0x0045301A) = (DWORD)(test) ;

然后请看我回答别人类似问题的一个帖子

http://bbs.pediy.com/showthread.php?t=101475

另,向小聪致敬

小聪大大,还在不。
帮忙看个帖子
http://bbs.pediy.com/showthread.php?t=102633  

想不出来原因。
2009-12-7 18:14
0
雪    币: 299
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
谢谢楼上两位 我在看opcode的知识... 关于我的问题 我找了个临时的解决办法
就是原文中 我试图 E8 ******** JMP 到函数需要计算地址吧......(原先我以为不能jmp到立即数,但是貌似是不对的)
临时变通为 mov eax,test
                 JMP eax
继续学习中......先结贴给分

*((BYTE  *)(0x00452e98))= (BYTE)(0xB8);
 * ((DWORD *)(0x00452e99)) = (DWORD)(test);
 *((BYTE  *)(0x00452e9D)) = (BYTE)(0xFF);
 *((BYTE  *)(0x00452e9E)) = (BYTE)(0xE0);
 *((BYTE  *)(0x00452e9F)) = (BYTE)(0x90);
2009-12-8 10:58
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主在5L正解,让编译器代替你算。
(就是能不写机器码就不写机器码,多使用汇编指令的方法)
2009-12-8 11:26
0
雪    币: 695
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
图文并茂好文章!!
2009-12-8 13:12
0
雪    币: 299
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
顶贴  请求回答 继续
2009-12-8 15:02
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主,0x006F1360,这个地址是你申请的还是原程序已经使用(或申请过)的内存空间?
2009-12-8 16:28
0
雪    币: 299
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
原程序使用过 我去掉了只读属性 更改指令.........

不过现在更诡异的事情发生了 我在休息了1个小时候后 在这期间我啥都没做 竟然惊奇的发现编译通过了........  

怀疑是自己编译器的BUG.........
2009-12-9 09:51
0
游客
登录 | 注册 方可回帖
返回
//