首页
社区
课程
招聘
寄存器值保存问题,未解决
发表于: 2011-10-12 19:03 5292

寄存器值保存问题,未解决

2011-10-12 19:03
5292
在同一个程序中

程序段 1
把某个寄存器的值,如EAX,暂时存放 到一个内存位置

程序段 2
再次把某个寄存器的值,如ECX,暂时存放到一个内存位置

程序段3
读取两个保存的值,用CMP比较

这样能不能实现?

如果我选取一个固定的内存地址(00E5XXXX),在其他机器运行会不会有问题?如何添加汇编代码实现呢?

感谢!

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
申请两个全局变量,需要使用的时候再拿出来不就行了吗?
你要放到寄存器里和你放到变量中是一样的。

你的变量实际就是一个内存地址。
2011-10-12 19:07
0
雪    币: 104
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个程序是别人写的,添加不了全局变量吧。
只能反汇编,添加部分汇编代码。
能否用汇编加上全局变量?请指教
2011-10-12 19:10
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
path他的程序,,,找一块0区域保存你的值,,想取的时候再拿出来。。。
2011-10-12 19:13
0
雪    币: 104
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也这么想过,但是0区域我怕程序会用到。
在.data如何找到安全的区域来作为数据保存呢?
2011-10-12 19:22
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
6
引用“
程序段 1: 把某个寄存器的值,如EAX,暂时存放 到一个内存位置

程序段 2:再次把某个寄存器的值,如ECX,暂时存放到一个内存位置
程序段3:读取两个保存的值,用CMP比较
这样能不能实现?


如果是全局变量,可以。
如果是变量是类成员,可以。
如果是Call的内部变量,不可以。

引用“如果我选取一个固定的内存地址(00E5XXXX),在其他机器运行会不会有问题?如何添加汇编代码实现呢?”

读取一个固定地址,那要看这个地址所在的空间了,
如果是Code段,那么,用GetModuleHandle得到模块句柄,加上偏移,那么不同的机器运行,都可以这样访问。

如果这个地址是数据段,那么就不行了,每次都是动态的。在不同机器上运行,更不行。
2011-10-12 19:23
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
直接在代码段找0区,  别在程序段的中间找就可以了,别人做免杀找path位置写代码的时候,一般都是找的下面些的区域。。
2011-10-12 19:29
0
雪    币: 527
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在数据段里面加数据不可以么?应该可以在数据段增加数据的吧?具体怎么加我也不太清楚,个人感觉在数据段加数据可以的
2011-10-12 19:37
0
雪    币: 104
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
.code在ring3是不可写的吧?那么只能保存到.data中去
2011-10-12 19:51
0
雪    币: 104
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
ring3能写.code么?写入好像会导致访问违规
2011-10-12 19:53
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
11
内存页面的属性是可以修改的,把 设置成 Read,Write,Execute就行了。
2011-10-12 19:55
0
雪    币: 104
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
那么直接mov dword ptr cs:[00e5xxxx],ecx这样就可以了?
2011-10-12 20:24
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
lz, 我回过你的帖子 建议你用windbg 加脚本实现
看来你的目的不是调试
给你以下建议,供参考

对你的 程序段1,2,3 做是程序的同一个线程三个不同时刻状态的假设, 如果非,请忽略下面的内容

1。调用栈大约有2MB 左右的可用空间, 对于绝大多数的应用程序, 栈的最低地址部分是不会用到的
2。用ebp回溯的方法找到栈的基地址 [ebp]==0 时 ebp的值
3。此时(ebp-2MB左右的数)左右的值大约就是在栈上的安全区域,该地址即供用来保存寄存器的值, 每次通过回溯后减去同样的值,能保证计算所的地址是一致的
4。如果你需要保存寄存器的地址不定,也就意味着拟每次都需要破坏不同的指令,那么要注意在自己构造的位置将破坏的指令补回去
5。我觉得上述问题最大的地方是你比较难找到足够大的0区来写自己的指令, 如果0区过于零碎,回到之复杂度剧增

前三条我觉得是比较容易实现,而且一般的调用栈是不可能用光的,所以这里还是很安全的,除非你说3段是多线程的

希望对你有帮助
2011-10-12 20:35
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
固定地址肯定是不安全的
2011-10-12 20:37
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
code段可以写的。。。text段也可以。。一般path代码都是在text段里面。。。

你试试了再来。。。。path代码做法几乎都是这样。。。
2011-10-12 21:11
0
游客
登录 | 注册 方可回帖
返回
//