- 取消U盘写保护大小:247B取消U盘写保护,可以使U盘取消写入保护,使用后需要拔出U盘.取消U盘写保护,可以使U盘取消写入保护,使用后需要拔出U盘.3 1292浏览会员免费
- EWSA大小:7MBEWSAv4.0.211 专业版 + 注册码, 再也不用那些所谓的破解版了,带注册码的专业版支持2个以上的cpu核心!EWSAv4.0.211 专业版 + 注册码, 再也不用那些所谓的破解版了,带注册码的专业版支持2个以上的cpu核心!5 230浏览会员免费
- od脱壳破解软件大小:5MB但愿大家互相进修进修,大家对于破解都不是很了解,人们想学破解,可是去无从入手,所以决议为大家写1个破解初级读物的教程,但愿能大家了解破解有一些帮忙,但愿能有更多的人踏入破解的大门 1.低级,修改步伐,用ultraedit等东西修改exe文件,称暴力破解,略称爆破 中级,追出软体的注册码 高级,开具注册机 2.经常使用破解东西 (1)侦壳东西:PEiD (2)消息联合的OllyDbg引领破解东西的新潮水 一,此刻咱们起首来进修下破解的开端,爆破~ 1.侦壳 要破解1个软体起主要做的就是侦壳,要侦壳就要对壳有绝对似的了解,家喻户晓,软体作者用编程语言编著好软体后,是将它编译成扩展名为EXE的可执行文件编译为EXE的目的有两点: (1)有一些版权信息需要掩护起来,不克不及让别人随心改动,如作者的姓名、软体名称等; (2)需要给步伐"瘦身",从而利便存储、使用以及网上传道输送 为了编译,会用到一些软体它们能将可执行文件压缩以及对信息加密(图1),实现上面所说的两个功效,这些个软体称为加壳软体为软体加上的东东就称为"壳"加壳软体差别于一般的WinZIP、WinRAR等打包类压缩软体加壳软体是压缩可执行文件的,压缩后的文件可以直接运行 最多见的加壳软体有3个:ASPACK 、UPX、PEcompact终究它们是主流,据计数,用它们加壳的软体约占市面所有软体的90%!其它不经常使用的加壳软体有ASPROTECT、PETITE 、NEOLITE、TELOCK等软体最多见的编程语言是Delphello,Visual Basic(略称VB),Visual C++(略称VC)了解些编程的常识,会让破解更加轻车熟道 底下来讲侦壳,此刻比力经常使用侦壳软体就PeiD,他具备华美的图形界面外壳整合(新增到鼠标右键)功效令使用更加利便,撑持拖放操作配置时,务请将"扩展到鼠标右键"打上对号 其使用要领是,鼠标点住XX.exe,按鼠标右键,选"使用PEid扫描"便可;"壳"的信息就显示在底部 2.破解东西OD 有关OD的先容我把他放到附件里了,这个是看雪论坛的先容,是比力周全的,至少我感觉比我写的要好,所以大家根据他可以大好的了解OD 3.爆破实例 爆破是破解的开端,所说的爆破,就是指路程经过过程修改可执行文件的源文件,降临达相应的目的你半大白?呵呵,举个例子好了,好比说某同享软体,它比力用户输入的注册码,要是用户输入的,跟它路程经过过程用户名(或其它)算出来的注册码相等的话(也就是说用户输入的注册码不错了),那末它就会跳到注册乐成的处所去,不然就跳到堕落的处所去 大白过来了吧,咱们只要找到这个跳转指令,把它修改成咱们需要的"造型",如许,咱们是否就可认随心所欲了? 一,破解时经常使用的汇编指令如下,汇编较弱者可先强行违住,以后就可逐步理解了 cmp a,b //比力a与b mov a,b //把b的值送给a,使a=b ret //归回主步伐 nop //无效用,英文"no operation"的简写,意思是"do nothellong"(呆板码90) (解释:ultraedit打开编辑exe文件时瞅见90,等同于汇编语句nop) call //挪用子步伐,子步伐以ret末端 je 或jz //若相等则跳(呆板码74 或0F84) jne或jnz //若不相等则跳(呆板码75或0F85) jmp //无前提跳(呆板码EB) jb //若小于则跳 ja //若大于则跳 jg //若大于则跳 jge //若大于等于则跳 jl //若小于则跳 jle //若小于等于则跳 pop xx //xx出栈 push xx //xx压栈 更为具体的指令请查阅汇编册本 4.破解常见修改,参看表1 汇编指令修改 相应的呆板码修改(路程经过过程16进制编辑器实现) jnz/jne->nop 75->90 jnz/jne -> jmp 75-> EB jz/je->nop 74->90 jz/je -> jmp 74-> EB jnz -> jz 75->74 或 0F 85 -> 0F 84 jz -> jnz 74->75 或 0F 84 -> 0F 85 jnz -> jz 75->74 或 0F 85 -> 0F 84 je-> jne 74->75 或 0F 84 -> 0F 85 表1 破解常见修改 (1)修改成jmp(其示意向见图6) je(jne,jz,jnz) =>jmp相应的呆板码为EB (意思是堕落信息向上找到的熬头个跳转),jmp的效用是绝对跳,无前提跳,从而跳过底下的堕落信息例如: xxxxxxxxxxxx 堕落信息,如注册码不对,sorry,未注册版不乐成,"Function Not Avaible in Demo","Command Not Avaible"或 "Can't save in Shareware/Demo"等,咱们但愿把它跳过,不让它浮现 …… xxxxxxxxxxxx 不错线路地点,直接跳转到这搭 (图6) (2)修改成nop(其示意向见图7) je(jne,jz,jnz) =>nop相应的呆板码90 (不错信息向上找到的熬头个跳转),nop的效用是抹掉这个跳转,使这个跳转失效,掉去效用,从而使步伐顺利降临紧跟其后的不错信息处例如: xxxxxxxxxxxx 不错信息,如注册乐成,谢谢您的撑持等,咱们但愿它不被跳过,让它浮现,所以步伐绝对是要顺利降临这搭,不克不及跳转在OD中,咱们一般是把不需要设置NOP,只是把JE或JNZ改成JNZ或JE便可,也就是把相等则跳改成不相等则跳,或不相等则跳改成相等则跳,把跳转过程相反,到达更改步伐流程的目的 …… xxxxxxxxxxxx 堕落信息,咱们但愿不要跳到这搭,不让它浮现! (图7) 二,怎样迅速确定暴破物 1,确定目标有无加壳没有最好了,有的话看是否常见壳,可不成以用现存脱壳软体迅速脱掉弄不稳定的话,权时放弃它"我吃定你了!",不要如许,老兄不就是一壳么,不要以及他一般见地记取,你今日的重点是爆破不要主次不分、舍本逐末,这也是刚开始学者最易犯的纰缪 这方面,我用PEID它可以整合到资源菜谱,很是利便 2,确定用啥子语言编著我的经验是,DELPHI的步伐布局清楚、紧凑密切,最好阐发其次是VC,BC,ASM,比力难的是VB,要有绝对似的经验才可弄定一两个 2,在反汇编文件中找到可疑点 经典语句自不消说,好比,"恭喜","注册乐成","注册码纰缪""失效的注册码","Thank You","Sorry"...找到后,一般向上不远方就可瞅见前提转移语句JZ、JNZ、JLE啥子的 究竟上,只有少少少少的软体只修改注册判断就OK的所以咱们要把更多的注意力转到其它的可疑点如未注册标识,逾期正告,次数标识,NAG会话框...,谙练使用各类东西的搜刮功效是基本功之一找到后再向上不远方找前提转移语句 三,怎样暴破 当你找准爆破点后,你会发明有许多种爆破的要领均可以达目的 1,修改转移语句 我一般如许改: 不需要跳,我就把JNE改成JE或把JE改成JNZ 需要跳,我就把JE或JNZ改成JMP 底下的附件我做了1个有关爆破的视频文件教程,但愿对大家理解爆破有帮忙 4.动态追踪破解技巧-破解经典句式 以下是经典的比力组合,常常是注册码的浮现处,所以被称为破解经典句式 ⑴ mov eax,[ ] //这搭可所以地址,也可所以其它寄放器或mov eax [ ] mov edx,[ ] //同上,凡是这两个地址就储存着意要信息或可所以pop edx call XXXXXXXX //要害call test eax,eax //eax为标记位 jz(jnz)或 jne(je) //要害跳转 ⑵ mov eax,[ ] //这搭可所以地址,也可所以其它寄放器 mov edx,[ ] //或是pop edx,凡是该地址就储存着意要信息 call XXXXXXXX //要害call jne(je) //要害跳转 ⑶ mov eax,[ ] //这搭可所以地址,也可所以其它寄放器 mov edx,[ ] //同上,凡是储存着意要信息 cmp eax,edx //要害比力 jnz(jz) //要害跳转但愿大家互相进修进修,大家对于破解都不是很了解,人们想学破解,可是去无从入手,所以决议为大家写1个破解初级读物的教程,但愿能大家了解破解有一些帮忙,但愿能有更多的人踏入破解的大门 1.低级,修改步伐,用ultraedit等东西修改exe文件,称暴力破解,略称爆破 中级,追出软体的注册码 高级,开具注册机 2.经常使用破解东西 (1)侦壳东西:PEiD (2)消息联合的OllyDbg引领破解东西的新潮水 一,此刻咱们起首来进修下破解的开端,爆破~ 1.侦壳 要破解1个软体起主要做的就是侦壳,要侦壳就要对壳有绝对似的了解,家喻户晓,软体作者用编程语言编著好软体后,是将它编译成扩展名为EXE的可执行文件编译为EXE的目的有两点: (1)有一些版权信息需要掩护起来,不克不及让别人随心改动,如作者的姓名、软体名称等; (2)需要给步伐"瘦身",从而利便存储、使用以及网上传道输送 为了编译,会用到一些软体它们能将可执行文件压缩以及对信息加密(图1),实现上面所说的两个功效,这些个软体称为加壳软体为软体加上的东东就称为"壳"加壳软体差别于一般的WinZIP、WinRAR等打包类压缩软体加壳软体是压缩可执行文件的,压缩后的文件可以直接运行 最多见的加壳软体有3个:ASPACK 、UPX、PEcompact终究它们是主流,据计数,用它们加壳的软体约占市面所有软体的90%!其它不经常使用的加壳软体有ASPROTECT、PETITE 、NEOLITE、TELOCK等软体最多见的编程语言是Delphello,Visual Basic(略称VB),Visual C++(略称VC)了解些编程的常识,会让破解更加轻车熟道 底下来讲侦壳,此刻比力经常使用侦壳软体就PeiD,他具备华美的图形界面外壳整合(新增到鼠标右键)功效令使用更加利便,撑持拖放操作配置时,务请将"扩展到鼠标右键"打上对号 其使用要领是,鼠标点住XX.exe,按鼠标右键,选"使用PEid扫描"便可;"壳"的信息就显示在底部 2.破解东西OD 有关OD的先容我把他放到附件里了,这个是看雪论坛的先容,是比力周全的,至少我感觉比我写的要好,所以大家根据他可以大好的了解OD 3.爆破实例 爆破是破解的开端,所说的爆破,就是指路程经过过程修改可执行文件的源文件,降临达相应的目的你半大白?呵呵,举个例子好了,好比说某同享软体,它比力用户输入的注册码,要是用户输入的,跟它路程经过过程用户名(或其它)算出来的注册码相等的话(也就是说用户输入的注册码不错了),那末它就会跳到注册乐成的处所去,不然就跳到堕落的处所去 大白过来了吧,咱们只要找到这个跳转指令,把它修改成咱们需要的"造型",如许,咱们是否就可认随心所欲了? 一,破解时经常使用的汇编指令如下,汇编较弱者可先强行违住,以后就可逐步理解了 cmp a,b //比力a与b mov a,b //把b的值送给a,使a=b ret //归回主步伐 nop //无效用,英文"no operation"的简写,意思是"do nothellong"(呆板码90) (解释:ultraedit打开编辑exe文件时瞅见90,等同于汇编语句nop) call //挪用子步伐,子步伐以ret末端 je 或jz //若相等则跳(呆板码74 或0F84) jne或jnz //若不相等则跳(呆板码75或0F85) jmp //无前提跳(呆板码EB) jb //若小于则跳 ja //若大于则跳 jg //若大于则跳 jge //若大于等于则跳 jl //若小于则跳 jle //若小于等于则跳 pop xx //xx出栈 push xx //xx压栈 更为具体的指令请查阅汇编册本 4.破解常见修改,参看表1 汇编指令修改 相应的呆板码修改(路程经过过程16进制编辑器实现) jnz/jne->nop 75->90 jnz/jne -> jmp 75-> EB jz/je->nop 74->90 jz/je -> jmp 74-> EB jnz -> jz 75->74 或 0F 85 -> 0F 84 jz -> jnz 74->75 或 0F 84 -> 0F 85 jnz -> jz 75->74 或 0F 85 -> 0F 84 je-> jne 74->75 或 0F 84 -> 0F 85 表1 破解常见修改 (1)修改成jmp(其示意向见图6) je(jne,jz,jnz) =>jmp相应的呆板码为EB (意思是堕落信息向上找到的熬头个跳转),jmp的效用是绝对跳,无前提跳,从而跳过底下的堕落信息例如: xxxxxxxxxxxx 堕落信息,如注册码不对,sorry,未注册版不乐成,"Function Not Avaible in Demo","Command Not Avaible"或 "Can't save in Shareware/Demo"等,咱们但愿把它跳过,不让它浮现 …… xxxxxxxxxxxx 不错线路地点,直接跳转到这搭 (图6) (2)修改成nop(其示意向见图7) je(jne,jz,jnz) =>nop相应的呆板码90 (不错信息向上找到的熬头个跳转),nop的效用是抹掉这个跳转,使这个跳转失效,掉去效用,从而使步伐顺利降临紧跟其后的不错信息处例如: xxxxxxxxxxxx 不错信息,如注册乐成,谢谢您的撑持等,咱们但愿它不被跳过,让它浮现,所以步伐绝对是要顺利降临这搭,不克不及跳转在OD中,咱们一般是把不需要设置NOP,只是把JE或JNZ改成JNZ或JE便可,也就是把相等则跳改成不相等则跳,或不相等则跳改成相等则跳,把跳转过程相反,到达更改步伐流程的目的 …… xxxxxxxxxxxx 堕落信息,咱们但愿不要跳到这搭,不让它浮现! (图7) 二,怎样迅速确定暴破物 1,确定目标有无加壳没有最好了,有的话看是否常见壳,可不成以用现存脱壳软体迅速脱掉弄不稳定的话,权时放弃它"我吃定你了!",不要如许,老兄不就是一壳么,不要以及他一般见地记取,你今日的重点是爆破不要主次不分、舍本逐末,这也是刚开始学者最易犯的纰缪 这方面,我用PEID它可以整合到资源菜谱,很是利便 2,确定用啥子语言编著我的经验是,DELPHI的步伐布局清楚、紧凑密切,最好阐发其次是VC,BC,ASM,比力难的是VB,要有绝对似的经验才可弄定一两个 2,在反汇编文件中找到可疑点 经典语句自不消说,好比,"恭喜","注册乐成","注册码纰缪""失效的注册码","Thank You","Sorry"...找到后,一般向上不远方就可瞅见前提转移语句JZ、JNZ、JLE啥子的 究竟上,只有少少少少的软体只修改注册判断就OK的所以咱们要把更多的注意力转到其它的可疑点如未注册标识,逾期正告,次数标识,NAG会话框...,谙练使用各类东西的搜刮功效是基本功之一找到后再向上不远方找前提转移语句 三,怎样暴破 当你找准爆破点后,你会发明有许多种爆破的要领均可以达目的 1,修改转移语句 我一般如许改: 不需要跳,我就把JNE改成JE或把JE改成JNZ 需要跳,我就把JE或JNZ改成JMP 底下的附件我做了1个有关爆破的视频文件教程,但愿对大家理解爆破有帮忙 4.动态追踪破解技巧-破解经典句式 以下是经典的比力组合,常常是注册码的浮现处,所以被称为破解经典句式 ⑴ mov eax,[ ] //这搭可所以地址,也可所以其它寄放器或mov eax [ ] mov edx,[ ] //同上,凡是这两个地址就储存着意要信息或可所以pop edx call XXXXXXXX //要害call test eax,eax //eax为标记位 jz(jnz)或 jne(je) //要害跳转 ⑵ mov eax,[ ] //这搭可所以地址,也可所以其它寄放器 mov edx,[ ] //或是pop edx,凡是该地址就储存着意要信息 call XXXXXXXX //要害call jne(je) //要害跳转 ⑶ mov eax,[ ] //这搭可所以地址,也可所以其它寄放器 mov edx,[ ] //同上,凡是储存着意要信息 cmp eax,edx //要害比力 jnz(jz) //要害跳转4 1593浏览会员免费
- 订单管理,采购管理大小:921KB(1)对所有客户的订单详细信息共享管理,相关部门可快速修改、查询订单信息。 (2)月初可自动根据PO生成月度出货计划,为生产计划的制作提供根据。 (3)每次打出货单后系统将自动统一保存出货单,方便相关人员查找修改历史单据,并自动生成PO出货进程状况及生成出货记录数据库,有利于日后查询PO残数及交货情况。 (4)自动统计每月PO总数,每月出货数,可生成月度、年度PO统计情况分析图(1)对所有客户的订单详细信息共享管理,相关部门可快速修改、查询订单信息。 (2)月初可自动根据PO生成月度出货计划,为生产计划的制作提供根据。 (3)每次打出货单后系统将自动统一保存出货单,方便相关人员查找修改历史单据,并自动生成PO出货进程状况及生成出货记录数据库,有利于日后查询PO残数及交货情况。 (4)自动统计每月PO总数,每月出货数,可生成月度、年度PO统计情况分析图4 3531浏览会员免费
- 进程守护大小:312KB这个Guarder.exe几乎可以守护所有exe程序:<br>功能:<br> 1.内存泄露重启;2.无固关掉重启;3.无响应重启;<br> <br> 使用:<br> 选择要守护的exe程序,保存,重新运行Guarder.exe,提示"监控...."既可.<br><br> 翻译:<br> 修改language.ini即可<br><br>包含源代码.<br>这个Guarder.exe几乎可以守护所有exe程序:<br>功能:<br> 1.内存泄露重启;2.无固关掉重启;3.无响应重启;<br> <br> 使用:<br> 选择要守护的exe程序,保存,重新运行Guarder.exe,提示"监控...."既可.<br><br> 翻译:<br> 修改language.ini即可<br><br>包含源代码.<br>5 395浏览会员免费
- 内存分配模拟大小:100KB操作系统的实验:处理机调度模拟及内存分配模拟二合一小程序。程序外表不重要,重要的内心。操作系统的实验:处理机调度模拟及内存分配模拟二合一小程序。程序外表不重要,重要的内心。4 366浏览会员免费
- 破解补丁大小:684KB易语言5.0 相对于易语言4.x更新说明(2010/02/01): 增加静态编译功能,支持挂接第三方链接器(比如VC6中的link.exe)。 静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理(取消了“易格式体”),加载速度更快,而且有效解决了“病毒误报”和“易被脱壳”的难题。 为实现静态编译,易语言编译器、核心支持库、集成开发环境(IDE)等均有重大更新,支持库开发架框有扩展性调整,绝大多数官方支持库都已针对静态编译完成自身改造并提供静态库。 目前绝大多数官方支持库均已支持静态编译,只有极少数不支持静态编译:vclbase.fne, jedi.fne, com.run/cominf.run/ocx.run。 第三方支持库,由源代码作者按照静态编译技术文档(参见sdk\static_docs)完成自身改造并提供静态库后,可支持静态编译。外部OCX组件和COM组件,不支持静态编译。 此次重大版本升级不影响以前的源代码(.e)和模块(.ec)。只要代码或模块中未用到“不支持静态编译”的支持库、COM/OCX等,都可以静态编译。以前编译好的模块(.ec)甚至不需要重新编译即可直接支持静态编译。 支持库开发框架调整是扩展性调整,比较好的做到了向前向后兼容。即,新版支持库可被旧版易语言或易程序使用,旧版支持库也可被新版易语言或易程序使用(只是不支持静态编译)。 静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个EXE/DLL中的支持库,该支持库中的数据或资源将不能再被其它EXE/DLL中所使用的同名支持库访问。这是因为代码被静态链接接到各个独立模块(EXE/DLL)中。 易语言5.0精简版安装包(不包括知识库、多媒体教程)下载地址:http://www.eyuyan.com/edown/e/E5.0/e5_chs.exe 易语言5.0完全版安装包(包括知识库、多媒体教程)下载地址:http://www.eyuyan.com/edown/e/E5.0/e5_chs_all.exe 编译器下载:http://www.m5home.com/bbs/thread-3408-1-1.html易语言5.0 相对于易语言4.x更新说明(2010/02/01): 增加静态编译功能,支持挂接第三方链接器(比如VC6中的link.exe)。 静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理(取消了“易格式体”),加载速度更快,而且有效解决了“病毒误报”和“易被脱壳”的难题。 为实现静态编译,易语言编译器、核心支持库、集成开发环境(IDE)等均有重大更新,支持库开发架框有扩展性调整,绝大多数官方支持库都已针对静态编译完成自身改造并提供静态库。 目前绝大多数官方支持库均已支持静态编译,只有极少数不支持静态编译:vclbase.fne, jedi.fne, com.run/cominf.run/ocx.run。 第三方支持库,由源代码作者按照静态编译技术文档(参见sdk\static_docs)完成自身改造并提供静态库后,可支持静态编译。外部OCX组件和COM组件,不支持静态编译。 此次重大版本升级不影响以前的源代码(.e)和模块(.ec)。只要代码或模块中未用到“不支持静态编译”的支持库、COM/OCX等,都可以静态编译。以前编译好的模块(.ec)甚至不需要重新编译即可直接支持静态编译。 支持库开发框架调整是扩展性调整,比较好的做到了向前向后兼容。即,新版支持库可被旧版易语言或易程序使用,旧版支持库也可被新版易语言或易程序使用(只是不支持静态编译)。 静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个EXE/DLL中的支持库,该支持库中的数据或资源将不能再被其它EXE/DLL中所使用的同名支持库访问。这是因为代码被静态链接接到各个独立模块(EXE/DLL)中。 易语言5.0精简版安装包(不包括知识库、多媒体教程)下载地址:http://www.eyuyan.com/edown/e/E5.0/e5_chs.exe 易语言5.0完全版安装包(包括知识库、多媒体教程)下载地址:http://www.eyuyan.com/edown/e/E5.0/e5_chs_all.exe 编译器下载:http://www.m5home.com/bbs/thread-3408-1-1.html5 101浏览会员免费
- 操作系统进程调度算法大小:951KB操作系统进程调度算法 先来先服务 短作业优先 时间片轮转 优先级。有大量注释,帮助理解。目前没有错误操作系统进程调度算法 先来先服务 短作业优先 时间片轮转 优先级。有大量注释,帮助理解。目前没有错误5 3413浏览会员免费
- AutoGuarder2大小:2MB一个非常实用的U盘病毒专杀工具,还能彻底清除顽固的流氓软件,更重要的是它能查处KV200730天试用版中,在你每次更新过病毒数据库后,江民服务器偷偷下载到你电脑中的病毒文件,完全避免了KV200730天试用版到期后你系统的瘫痪问题!!!一个非常实用的U盘病毒专杀工具,还能彻底清除顽固的流氓软件,更重要的是它能查处KV200730天试用版中,在你每次更新过病毒数据库后,江民服务器偷偷下载到你电脑中的病毒文件,完全避免了KV200730天试用版到期后你系统的瘫痪问题!!!5 215浏览免费
- 反编译类大小:3MB在PB论坛看到有朋友放出来这个版本,应该就是本网站原来带木马的那个版本,木马已经去除,但是并没有破解。在PB论坛看到有朋友放出来这个版本,应该就是本网站原来带木马的那个版本,木马已经去除,但是并没有破解。4 145浏览会员免费
- EXE大小:67KB一款可以用来查看pe的工具,可以在windows 下查看pe一款可以用来查看pe的工具,可以在windows 下查看pe5 737浏览会员免费
- 注册机大小:172KB、算法注册机 1 运行未注册软件,得到软件机器码。 2 运行算法注册机,由注册机算出注册码。 3 然后在原软件注册处输入即可注册成功。 或者直接由注册机得到Name和Code等信息进行注册。 二、内存注册机(内存补丁) 1 前提安装原版软件;下载内存注册机。 2 把内存补丁复制到软件所在(硬盘的)目录内;运行内存补丁,接着输入任意注册码点注册或确定。此时将弹出正确的注册码。 3 把你得到的正确注册码填入原软件需要注册的地方,点击确定或注册即可。 三、破解补丁(情况通常两种) 1 把破解补丁复制到软件所在(硬盘的)目录内,运行破解补丁,此时软件就被成功破解或输入任意注册信息后,点确定/注册即可。 2 运行破解补丁,点“浏览”寻找原程序所在硬盘上的位置,找到并选中原程序后,确定,将会提示修补成功,即为注册成功了。 四、*.reg 破解信息。 运行该*.reg,导入注册表即可。 五、破解版 破解版通常是提供了破解信息或已经被破解过,可以当正版来使用的软件。 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ☆ 本站软件如无特殊说明,均为免装版,解压后就能正常使用; ☆ 但解压后看到里面有“install.*”“绿化.*”“绿化文件.*”“*.reg”等文件,请先运行它 ☆“uninstall.*”“卸载.*”等文件一般是用来卸除软件残余用的。 ☆ 破解补丁及注册机使用方法http://bbs.ankty.com/simple/index.php?t475.html ☆ 部分注册机、破解补丁可能会误报病毒,电脑新手、商业电脑请支持正版勿测试。 说明:现在小部分国内杀毒软件把注册机(特别是内存注册机)报告为病毒(一般报为hack.psw.foxmail病毒)这是为了打击破解,盗版。 如果你觉得软件好用,建议向作者注册或购买!如果你对误报病毒很在乎,请不要使用!如果您想试用这些破解,请先把病毒防火墙关闭再进行注册,注册成功后再开启病毒防火墙 ^_^、算法注册机 1 运行未注册软件,得到软件机器码。 2 运行算法注册机,由注册机算出注册码。 3 然后在原软件注册处输入即可注册成功。 或者直接由注册机得到Name和Code等信息进行注册。 二、内存注册机(内存补丁) 1 前提安装原版软件;下载内存注册机。 2 把内存补丁复制到软件所在(硬盘的)目录内;运行内存补丁,接着输入任意注册码点注册或确定。此时将弹出正确的注册码。 3 把你得到的正确注册码填入原软件需要注册的地方,点击确定或注册即可。 三、破解补丁(情况通常两种) 1 把破解补丁复制到软件所在(硬盘的)目录内,运行破解补丁,此时软件就被成功破解或输入任意注册信息后,点确定/注册即可。 2 运行破解补丁,点“浏览”寻找原程序所在硬盘上的位置,找到并选中原程序后,确定,将会提示修补成功,即为注册成功了。 四、*.reg 破解信息。 运行该*.reg,导入注册表即可。 五、破解版 破解版通常是提供了破解信息或已经被破解过,可以当正版来使用的软件。 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ☆ 本站软件如无特殊说明,均为免装版,解压后就能正常使用; ☆ 但解压后看到里面有“install.*”“绿化.*”“绿化文件.*”“*.reg”等文件,请先运行它 ☆“uninstall.*”“卸载.*”等文件一般是用来卸除软件残余用的。 ☆ 破解补丁及注册机使用方法http://bbs.ankty.com/simple/index.php?t475.html ☆ 部分注册机、破解补丁可能会误报病毒,电脑新手、商业电脑请支持正版勿测试。 说明:现在小部分国内杀毒软件把注册机(特别是内存注册机)报告为病毒(一般报为hack.psw.foxmail病毒)这是为了打击破解,盗版。 如果你觉得软件好用,建议向作者注册或购买!如果你对误报病毒很在乎,请不要使用!如果您想试用这些破解,请先把病毒防火墙关闭再进行注册,注册成功后再开启病毒防火墙 ^_^5 207浏览会员免费
- java大小:8MB非常小巧方便的java反编译工具非常小巧方便的java反编译工具5 369浏览会员免费
- WinCE大小:251KBWinCE6.0下的驱动调试助手,包括了进程管理器、截屏工具和寄存器读写工具等调试WinCE时的实用功能,该程序只能在ARM平台的WinCE6.0下使用,不支持WinCE5.0和其他平台。WinCE6.0下的驱动调试助手,包括了进程管理器、截屏工具和寄存器读写工具等调试WinCE时的实用功能,该程序只能在ARM平台的WinCE6.0下使用,不支持WinCE5.0和其他平台。5 274浏览会员免费
- cpu大小:5KB可以获取单个多个进程cpu的使用率,ms没有提供获取cpu使用率的方法,目前有几种方法,1。通过cpu时间计算,2。通过windows性能计数器(PDH库) <br>这里提供了第一种方法,由于第二种方法问题较多,而且不能保证系统中已经安装了windows性能计数器可以获取单个多个进程cpu的使用率,ms没有提供获取cpu使用率的方法,目前有几种方法,1。通过cpu时间计算,2。通过windows性能计数器(PDH库) <br>这里提供了第一种方法,由于第二种方法问题较多,而且不能保证系统中已经安装了windows性能计数器5 461浏览会员免费
- 进程的创建大小:759B进程的创建 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果进程的创建 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果5 2w+浏览会员免费
- 进程防杀大小:485KB09年初刚到现在这家公司,头让做一个进程防杀的功能,为了保护我们的软件的服务程序,类似360或瑞星这样的安全产品都有进程防杀的功能。研究了一个多月,总结网上的各种防杀方法并参考其代码,特此将各种实现方法归纳为以下6种,并将其对应源码奉上。 源码全部经过自己修改调试,部分为原创,在vs2005下调试通过,在各种windows操作系统下测试过 1. ring3提升线程为系统线程 原理:windows在强制结束进程的时候会先结束掉所有的线程,把程序的线程改成系统线程,就可以达到防杀的目的 优点:ring3实现的进程防杀,无驱动无hook,原理及代码都较为简单,能防止任务管理器杀掉进程 缺点:只能下xp下有效(与xp打的补丁也有关,有的xp系统会失败)防杀能力有限,例如不能防住IceSword等工具 该方法是参考了csdn一位朋友的做法,原文地址为 http://blog.csdn.net/KeSummer/archive/2008/05/18/2455379.aspx 2.hookApi之NtQuerySystemInformation 原理:hook NtQuerySystemInformation 来隐藏进程 优点:ring3实现的进程隐藏,无驱动,能在任务管理器里隐藏进程 缺点:只能在nt2000下隐藏进程,通用性较差 3.detours库实现进程防杀 原理:和2类似,hook OpenProcess 来防杀进程 优点:防杀能力和通用性都较强,在nt2000,xp,2003均可防杀 缺点:hookApi是用detours库来实现的,2008下防杀失败,不能防住某些进程工具 4.hook任务管理器结束进程事件 原理:挂钩任务管理器窗口,利用CBT钩子拦截结束进程消息 优点:通用性较强,任意的windows平台均可防止任务管理器杀进程 缺点:只能针对windows任务管理起到防杀作用 5.双进程保护 原理:主进程和守护进程互相监控,发现对方不在就启动对方。为了避免父子进程关系,主进程启动临时进程,临时进程启动守护进程 优点:通用性较强,保护能力较强,可保护windows服务程序。hook防杀需要主程序和桌面交互的,而服务程序是不和桌面交互的 缺点:非真正的防杀,只是杀了又启,手段有点不入流 6.驱动级进程保护 原理:驱动级的ZwQuerySystemInformation hook,来隐藏或防杀进程 优点:防杀能力较强,在IceSword 1.2.2版本下测试通过 缺点:加载有驱动,程序实现较为复杂,驱动级hook被360等杀毒工具检测为木马 yipihaoma qq:4948904709年初刚到现在这家公司,头让做一个进程防杀的功能,为了保护我们的软件的服务程序,类似360或瑞星这样的安全产品都有进程防杀的功能。研究了一个多月,总结网上的各种防杀方法并参考其代码,特此将各种实现方法归纳为以下6种,并将其对应源码奉上。 源码全部经过自己修改调试,部分为原创,在vs2005下调试通过,在各种windows操作系统下测试过 1. ring3提升线程为系统线程 原理:windows在强制结束进程的时候会先结束掉所有的线程,把程序的线程改成系统线程,就可以达到防杀的目的 优点:ring3实现的进程防杀,无驱动无hook,原理及代码都较为简单,能防止任务管理器杀掉进程 缺点:只能下xp下有效(与xp打的补丁也有关,有的xp系统会失败)防杀能力有限,例如不能防住IceSword等工具 该方法是参考了csdn一位朋友的做法,原文地址为 http://blog.csdn.net/KeSummer/archive/2008/05/18/2455379.aspx 2.hookApi之NtQuerySystemInformation 原理:hook NtQuerySystemInformation 来隐藏进程 优点:ring3实现的进程隐藏,无驱动,能在任务管理器里隐藏进程 缺点:只能在nt2000下隐藏进程,通用性较差 3.detours库实现进程防杀 原理:和2类似,hook OpenProcess 来防杀进程 优点:防杀能力和通用性都较强,在nt2000,xp,2003均可防杀 缺点:hookApi是用detours库来实现的,2008下防杀失败,不能防住某些进程工具 4.hook任务管理器结束进程事件 原理:挂钩任务管理器窗口,利用CBT钩子拦截结束进程消息 优点:通用性较强,任意的windows平台均可防止任务管理器杀进程 缺点:只能针对windows任务管理起到防杀作用 5.双进程保护 原理:主进程和守护进程互相监控,发现对方不在就启动对方。为了避免父子进程关系,主进程启动临时进程,临时进程启动守护进程 优点:通用性较强,保护能力较强,可保护windows服务程序。hook防杀需要主程序和桌面交互的,而服务程序是不和桌面交互的 缺点:非真正的防杀,只是杀了又启,手段有点不入流 6.驱动级进程保护 原理:驱动级的ZwQuerySystemInformation hook,来隐藏或防杀进程 优点:防杀能力较强,在IceSword 1.2.2版本下测试通过 缺点:加载有驱动,程序实现较为复杂,驱动级hook被360等杀毒工具检测为木马 yipihaoma qq:494890475 576浏览会员免费
- keil大小:304KB正版注册机,防止当病毒杀了(请下载前关闭对软件的杀毒功能)正版注册机,防止当病毒杀了(请下载前关闭对软件的杀毒功能)5 422浏览会员免费
- 弱口令字典大小:16KB弱口令字典,包括常见用户名,top1000的弱口令,常见协议的弱口令如ftp、telnet等。用户和密码分文件保存,非常实用!弱口令字典,包括常见用户名,top1000的弱口令,常见协议的弱口令如ftp、telnet等。用户和密码分文件保存,非常实用!4 2603浏览会员免费
- RAR大小:378KB乐都WIL编辑器3.2版 编辑传奇客户端图片用的 做传奇的朋友可以用到乐都WIL编辑器3.2版 编辑传奇客户端图片用的 做传奇的朋友可以用到4 2413浏览会员免费
- 更改XP配置文件路径大小:592KBXP用户配置文件管理工具 v1.0 在病毒泛滥,恶意软件横行的今天,采用硬盘保护卡或ghost保护自己的系统分区,已成为大多数采用的理想方案,然尔采用上述方法进行系统保护时,美中不足的是用户的配置文件往往也被恢复到备份时的状态,虽然在XP下可以将\"我的文档\"移动到其它分区,但用户的配置信息特别是桌面上的文档,如果在还原时未及时转移到其它分区,则会造成数据丢失。 本软件可以帮您轻松的将配置文件移动到硬盘的其它分区,包括\"我的文档\"、\"桌面\"、\"收藏夹\"等均被同时转移,然后再备份您的系统分区,这样在您恢复数据时,就不用担心上述数据会被覆盖了。 本软件为绿色免费软件,不需要安装即可使用,您可以复制、分发和传播无限制数量的软件产品,但您必须保证每一份复制、分发和传播都必须是完整和真实的,包括所有有关本软件产品的软件、电子文档,版权等。 本软件产品只许可使用,而不出售。不收取任何费用,不得用于商业目的的活动之中。XP用户配置文件管理工具 v1.0 在病毒泛滥,恶意软件横行的今天,采用硬盘保护卡或ghost保护自己的系统分区,已成为大多数采用的理想方案,然尔采用上述方法进行系统保护时,美中不足的是用户的配置文件往往也被恢复到备份时的状态,虽然在XP下可以将\"我的文档\"移动到其它分区,但用户的配置信息特别是桌面上的文档,如果在还原时未及时转移到其它分区,则会造成数据丢失。 本软件可以帮您轻松的将配置文件移动到硬盘的其它分区,包括\"我的文档\"、\"桌面\"、\"收藏夹\"等均被同时转移,然后再备份您的系统分区,这样在您恢复数据时,就不用担心上述数据会被覆盖了。 本软件为绿色免费软件,不需要安装即可使用,您可以复制、分发和传播无限制数量的软件产品,但您必须保证每一份复制、分发和传播都必须是完整和真实的,包括所有有关本软件产品的软件、电子文档,版权等。 本软件产品只许可使用,而不出售。不收取任何费用,不得用于商业目的的活动之中。3 233浏览会员免费
- LoadPE大小:404KBLoadPE目前网上大多数都在病毒,这个已经用卡巴杀过了。没有病毒。大家放心使用。LoadPE目前网上大多数都在病毒,这个已经用卡巴杀过了。没有病毒。大家放心使用。4 209浏览会员免费
- minidwep-gtk大小:1MBminidwep-gtk-21026-cdl.tgz 网上很难找的啊,是tgz格式的啊,用于CDLinux的21026版的minidwep-gtk 新版支持的功能: 1.可以选择多种注入方式,但不能提高注入的速度,提高的是抓到合法数据包注入的机率。选择2-3种方式比较合适。 2.单独选择aireplay-ng -3,程序会在检测到有无线客户端时,自动使用deauthentication,使客户端重新连接ap,从而获得ARP包注入。 3.可以自动检测WPA加密路由是否有客户端,无客户端时自动等待。 4.当抓到握手包后,程序会提示并引导你把抓到的WPA握手包拷贝到硬盘分区目录中。 5.可以利用“跑字典”的功能,分别选择以前抓到的握手包文件和字典来搜寻key。没有加入HASH表功能。 6.自动判断系统使用的语言,显示中英文。 7. aircrack-ng 1.0不支持中文essid的虚拟连接,minidwep-gtk在BT4,CDlinux0.95,slax6.11,ubuntu9.10中 已经支持中文essid的虚拟连接。但在BT3下,minidwep-gtk可能支持atheros芯片的网卡连接中文essid, BT3中,minidwep-gtk不支持绝大部分网卡芯片虚拟连接中文essid. 8.找到密码后,会把密码和对应的ap名称,mac地址保存到/tmp目录下,以ap的mac为文件名称。 9.添加了扫描时间切换功能。点击扫描进度条时,扫描时间会在24,36,48,60秒切换。 10.增加了用字典猜测隐藏essid名称的功能,方便建立虚拟连接。字典文件位于/tmp/minidwep_essid,可以用文本编辑器编辑修改增加。minidwep-gtk-21026-cdl.tgz 网上很难找的啊,是tgz格式的啊,用于CDLinux的21026版的minidwep-gtk 新版支持的功能: 1.可以选择多种注入方式,但不能提高注入的速度,提高的是抓到合法数据包注入的机率。选择2-3种方式比较合适。 2.单独选择aireplay-ng -3,程序会在检测到有无线客户端时,自动使用deauthentication,使客户端重新连接ap,从而获得ARP包注入。 3.可以自动检测WPA加密路由是否有客户端,无客户端时自动等待。 4.当抓到握手包后,程序会提示并引导你把抓到的WPA握手包拷贝到硬盘分区目录中。 5.可以利用“跑字典”的功能,分别选择以前抓到的握手包文件和字典来搜寻key。没有加入HASH表功能。 6.自动判断系统使用的语言,显示中英文。 7. aircrack-ng 1.0不支持中文essid的虚拟连接,minidwep-gtk在BT4,CDlinux0.95,slax6.11,ubuntu9.10中 已经支持中文essid的虚拟连接。但在BT3下,minidwep-gtk可能支持atheros芯片的网卡连接中文essid, BT3中,minidwep-gtk不支持绝大部分网卡芯片虚拟连接中文essid. 8.找到密码后,会把密码和对应的ap名称,mac地址保存到/tmp目录下,以ap的mac为文件名称。 9.添加了扫描时间切换功能。点击扫描进度条时,扫描时间会在24,36,48,60秒切换。 10.增加了用字典猜测隐藏essid名称的功能,方便建立虚拟连接。字典文件位于/tmp/minidwep_essid,可以用文本编辑器编辑修改增加。4 307浏览会员免费
- 作 者:(美)克拉克 著,黄晓磊,李化 译 SQL注入是Internet上最危险、最有名的安全漏洞之一,本书是目前唯一一本专门致力于讲解SQL威胁的图书。本书作者均是专门研究SQL注入的安全专家,他们集众家之长,对应用程序的基本编码和升级维护进行全面跟踪,详细讲解可能引发SQL注入的行为以及攻击者的利用要素,并结合长期实践经验提出了相应的解决方案。针对SQL注入隐蔽性极强的特点,本书重点讲解了SQL注入的排查方法和可以借助的工具,总结了常见的利用SQL漏洞的方法。另外,本书还专门从代码层和系统层的角度介绍了避免SQL注入的各种策略和需要考虑的问题。 本书主要内容 SQL注入一直长期存在,但最近有所增强。本书包含所有与SQL注入攻击相关的、当前已知的信息,凝聚了由本书作者组成的、无私奉献的SQL注入专家团队的所有深刻见解。 什么是SQL注入?理解它是什么以及它的基本原理 查找、确认和自动发现SQL注入 查找代码中SQL注入时的提示和技巧 使用SQL注入创建利用 通过设计来避免由SQL攻击所带来的危险 目录: 第1章 什么是SQL注入 1.1 概述 1.2 理解Web应用的工作原理 1.2.1 一种简单的应用架构 1.2.2 一种较复杂的架构 1.3 理解SQL注入 1.4 理解SQL注入的产生过程 1.4.1 构造动态字符串 1.4.2 不安全的数据库配置 1.5 本章小结 1.6 快速解决方案 1.7 常见问题解答 第2章 SQL注入测试 2.1 概述 2.2 寻找SQL注入 2.2.1 借助推理进行测试 2.2.2 数据库错误 2.2.3 应用响应 2.2.4 SQL盲注 2.3 确认SQL注入 2.3.1 区分数字和字符串 2.3.2 内联SQL注入 2.3.3 终止式SQL注入 2.3.4 时间延迟 2.4 自动寻找SQL注入 2.5 本章小结 2.6 快速解决方案 2.7 常见问题解答 第3章 复查代码中的SQL注入 3.1 概述 3.2 复查源代码中的SQL注入 3.2.1 危险的编码行为 3.2.2 危险的函数 3.2.3 跟踪数据 3.2.4 复查PL/SQL和T-SQL代码 3.3 自动复查源代码第1章 什么是SQL注入 3.3.1 YASCA 3.3.2 Pixy 3.3.3 AppCodeScan 3.3.4 LAPSE 3.3.5 SWAAT 3.3.6 Microsoft SQL注入源代码分析器 3.3.7 CAT.NET 3.3.8 商业源代码复查工具 3.3.9 Ounce 3.3.10 Fortify源代码分析器 3.3.11 CodeSecure 3.4 本章小结 3.5 快速解决方案 3.6 常见问题解答 第4章 利用SQL注入 4.1 概述 4.2 理解常见的利用技术 4.3 识别数据库 4.3.1 非盲跟踪 4.3.2 盲跟踪 4.4 使用UINON语句提取数据 4.4.1 匹配列 4.4.2 匹配数据类型 4.5 使用条件语句 4.5.1 方法1:基于时间 4.5.2 方法2:基于错误 4.5.3 方法3:基于内容 4.5.4 处理字符串 4.5.5 扩展攻击 4.5.6 利用SQL注入错误 4.5.7 Oracle中的错误消息 4.6 枚举数据库模式 4.6.1 SQL Server 4.6.2 MySQL 4.6.3 Oracle 4.7 提升权限 4.7.1 SQL Server 4.7.2 Oracle 4.8 窃取哈希口令 4.8.1 SQL Server 4.8.2 MySQL 4.8.3 Oracle 4.9 带外通信 4.9.1 E-mail 4.9.2 HTTP/DNS 4.9.3 文件系统 4.10 自动利用SQL注入 4.10.1 Sqlmap 4.10.2 Bobcat 4.10.3 BSQL 4.10.4 其他工具 4.11 本章小结 4.12 快速解决方案 4.13 常见问题解答 第5章 SQL盲注利用 5.1 概述 5.2 寻找并确认SQL盲注 5.2.1 强制产生通用错误 5.2.2 注入带副作用的查询 5.2.3 拆分与平衡 5.2.4 常见的SQL盲注场景 5.2.5 SQL盲注技术 5.3 使用基于时间的技术 5.3.1 延迟数据库查询 5.3.2 基于时间推断的考虑 5.4 使用基于响应的技术 5.4.1 MySQL响应技术 5.4.2 SQL Server响应技术 5.4.3 Oracle响应技术 5.4.4 返回多位信息 5.5 使用非主流通道 5.5.1 数据库连接 5.5.2 DNS渗漏 5.5.3 E-mail渗漏 5.5.4 HTTP渗漏 5.6 自动SQL盲注利用 5.6.1 Absinthe 5.6.2 BSQL Hacker 5.6.3 SQLBrute 5.6.4 Sqlninja 5.6.5 Squeeza 5.7 本章小结 5.8 快速解决方案 5.9 常见问题解答 第6章 利用操作系统 6.1 概述 6.2 访问文件系统 6.2.1 读文件 6.2.2 写文件 6.3 执行操作系统命令 6.4 巩固访问 6.5 本章小结 6.6 快速解决方案 6.7 常见问题解答 6.8 尾注 第7章 高级话题 7.1 概述 7.2 避开输入过滤器 7.2.1 使用大小写变种 7.2.2 使用SQL注释 7.2.3 使用URL编码 7.2.4 使用动态的查询执行 7.2.5 使用空字节 7.2.6 嵌套剥离后的表达式 7.2.7 利用截断 7.2.8 避开自定义过滤器 7.2.9 使用非标准入口点 7.3 利用二阶SQL注入 7.4 使用混合攻击 7.4.1 修改捕获的数据 7.4.2 创建跨站脚本 7.4.3 在Oracle上运行操作系统命令 7.4.4 利用验证过的漏洞 7.5 本章小结 7.6 快速解决方案 7.7 常见问题解答 第8章 代码层防御 8.1 概述 8.2 使用参数化语句 8.2.1 Java中的参数化语句 8.2.2 .NET(C#)中的参数化语句 8.2.3 PHP中的参数化语句 8.2.4 PL/SQL中的参数化语句 8.3 输入验证 8.3.1 白名单 8.3.2 黑名单 8.3.3 Java中的输入验证 8.3.4 .NET中的输入验证 8.3.5 PHP中的输入验证 8.4 编码输出 8.5 规范化 8.6 通过设计来避免SQL注入的危险 8.6.1 使用存储过程 8.6.2 使用抽象层 8.6.3 处理敏感数据 8.6.4 避免明显的对象名 8.6.5 创建数据库Honeypot 8.6.6 附加的安全开发资源 8.7 本章小结 8.8 快速解决方案 8.9 常见问题解答 第9章 平台层防御 9.1 概述 9.2 使用运行时保护 9.2.1 Web应用防火墙 9.2.2 截断过滤器 9.2.3 不可编辑的输入保护与可编辑的输入保护 9.2.4 URL策略/页面层策略 9.2.5 面向方面编程 9.2.6 应用入侵检测系统 9.2.7 数据库防火墙 9.3 确保数据库安全 9.3.1 锁定应用数据 9.3.2 锁定数据库服务器 9.4 额外的部署考虑 9.4.1 最小化不必要信息的泄露 9.4.2 提高Web服务器日志的冗余 9.4.3 在独立主机上部署Web服务器和数据库服务器 9.4.4 配置网络访问控制 9.5 本章小结 9.6 快速解决方案 9.7 常见问题解答 第10章 参考资料 10.1 概述 10.2 SQL入门 10.3 SQL注入快速参考 10.3.1 识别数据库平台 10.3.2 Microsoft SQL Server备忘单 10.3.3 MySQL备忘单 10.3.4 Oracle备忘单5 891浏览会员免费
- hao123网址之家大小:24KB可以修复病毒等引起的host破坏,或者对屏蔽的host进行修复,很好用的可以修复病毒等引起的host破坏,或者对屏蔽的host进行修复,很好用的5 619浏览免费
- 泡泡堂大小:1MB易语言泡泡堂无限针穿墙无限盾源码 全套 带DLL文件 要就速度秒易语言泡泡堂无限针穿墙无限盾源码 全套 带DLL文件 要就速度秒4 466浏览会员免费
- AES大小:5MBAES 5.1.0 版 加密与解密软件 此版本软件较早前版本的作了较大修改,特别是调整了软件的界面布局,以使软件更加动感和美观。除此之外此版本软件还在早前的版本上作了以下改进: 1、软件的运行效率较早前版本的略有提升。 2、修正了直接将文件或文件夹拖动到编辑框或列表框中以设置相应路径的功能,以方便用户使用。 3、解决了在加密/解密字符串模块下,修改源字符串或滚动加密后字符串时,对应编辑框内的数据显示混乱这一问题。 4、新增了以十六进制编码显示加密后字符串的功能,以符合某些用户的特殊需求(此功能是依一网友的要求而增加的)。 5、新增了加密/解密单个文件时,给出将要处理(选择待处理文件后)或正处理的文件所需剩余时间,以方便用户进一步了解文件的处理进程。 6、新增了在加密单个文件时保存原文件扩展名的功能,以使用户不会因时间推移而忘记自己所加密的原文件的文件类型(此功能是依一网友的要求而增加的)。 7、放宽了用户在加密/解密批量文件下,用增加文件(而非目录)功能来新增待处理文件时一次只能选择一个文件的限制,允许用户一次选择多个待处理文件,方便了用户的操作。 8、新增了“加密包”这一概念与功能,即用户可以将多个待加密的文件加密成一个加密包,当然也可以将一个加密包中的已加密后的文件数据解密到指定的目录之下。此功能类似于压缩包,但并非先将文件压缩之后再作加密;且其与“加密/解密批量文件”功能也是完全不同的。 9、新增了自动关联文件类型(共三种文件类型:“.cryp”、“.cryb”、“.key”)的功能(在Windows XP及以上的操作系统下需要以管理员权限来运行软件才能真正地关联文件类型)。使得文件的相应的文件在您的电脑里不再是以未知类型文件的图标来显示;当然,您可以更换skins目录下的“CrypedFileIcon.ico”、“CrypedPackageIcon.ico”或“KeyFileIcon.ico”文件来更改图标。这一功能使得用户可以在Windows系统的资源管理器下双击“.cryp”的文件时会自动打开软件并切换到加密/解密单个文件的界面同时设置好“待解密文件路径”与“解密后文件路径”这两个参数。双击“.cryb”的文件时会自动打开软件并切换到加密/解密加密包的界面同时设置“执行模式”为“解密文件”,并以列表的形式给出该加密包中所保存的加密后的文件信息列表。双击“.key”的文件时会自动打开记事本,并将该文件的信息显示在记事本中,以供用户编辑。 当然,本版本软件保存了本系列软件的早前版的所有功能。 注: 1、本软件中在所给定的密钥长度小于所需的密钥长度时采取了自动补全的策略,同时将其中的不可显示字符(如:回车符)用空格取代策略。在初始向量的导入也采用了将其中的不可显示的字符(如:回车符)用空格取代的策略。 2、软件的速度测试是在电脑的配置为:系统类型:32位操作系统;操作系统版本:Windows 7 旗舰版;处理器:Intel(R) Core(TM)2 Duo CPU T5870 @2.00GHZ 2.00GHZ 前端总线/二级缓存:800MHz/2M;内存(RAM):2.00G 速度:667MHz 类型:PC2-5300 DDR2;硬盘类型:SATA 硬盘转速:5400rpm时所得到的。其平均速度不低于16MB/s。 3、建议在Windows 2000及以上版本的操作系统上运行本软件。AES 5.1.0 版 加密与解密软件 此版本软件较早前版本的作了较大修改,特别是调整了软件的界面布局,以使软件更加动感和美观。除此之外此版本软件还在早前的版本上作了以下改进: 1、软件的运行效率较早前版本的略有提升。 2、修正了直接将文件或文件夹拖动到编辑框或列表框中以设置相应路径的功能,以方便用户使用。 3、解决了在加密/解密字符串模块下,修改源字符串或滚动加密后字符串时,对应编辑框内的数据显示混乱这一问题。 4、新增了以十六进制编码显示加密后字符串的功能,以符合某些用户的特殊需求(此功能是依一网友的要求而增加的)。 5、新增了加密/解密单个文件时,给出将要处理(选择待处理文件后)或正处理的文件所需剩余时间,以方便用户进一步了解文件的处理进程。 6、新增了在加密单个文件时保存原文件扩展名的功能,以使用户不会因时间推移而忘记自己所加密的原文件的文件类型(此功能是依一网友的要求而增加的)。 7、放宽了用户在加密/解密批量文件下,用增加文件(而非目录)功能来新增待处理文件时一次只能选择一个文件的限制,允许用户一次选择多个待处理文件,方便了用户的操作。 8、新增了“加密包”这一概念与功能,即用户可以将多个待加密的文件加密成一个加密包,当然也可以将一个加密包中的已加密后的文件数据解密到指定的目录之下。此功能类似于压缩包,但并非先将文件压缩之后再作加密;且其与“加密/解密批量文件”功能也是完全不同的。 9、新增了自动关联文件类型(共三种文件类型:“.cryp”、“.cryb”、“.key”)的功能(在Windows XP及以上的操作系统下需要以管理员权限来运行软件才能真正地关联文件类型)。使得文件的相应的文件在您的电脑里不再是以未知类型文件的图标来显示;当然,您可以更换skins目录下的“CrypedFileIcon.ico”、“CrypedPackageIcon.ico”或“KeyFileIcon.ico”文件来更改图标。这一功能使得用户可以在Windows系统的资源管理器下双击“.cryp”的文件时会自动打开软件并切换到加密/解密单个文件的界面同时设置好“待解密文件路径”与“解密后文件路径”这两个参数。双击“.cryb”的文件时会自动打开软件并切换到加密/解密加密包的界面同时设置“执行模式”为“解密文件”,并以列表的形式给出该加密包中所保存的加密后的文件信息列表。双击“.key”的文件时会自动打开记事本,并将该文件的信息显示在记事本中,以供用户编辑。 当然,本版本软件保存了本系列软件的早前版的所有功能。 注: 1、本软件中在所给定的密钥长度小于所需的密钥长度时采取了自动补全的策略,同时将其中的不可显示字符(如:回车符)用空格取代策略。在初始向量的导入也采用了将其中的不可显示的字符(如:回车符)用空格取代的策略。 2、软件的速度测试是在电脑的配置为:系统类型:32位操作系统;操作系统版本:Windows 7 旗舰版;处理器:Intel(R) Core(TM)2 Duo CPU T5870 @2.00GHZ 2.00GHZ 前端总线/二级缓存:800MHz/2M;内存(RAM):2.00G 速度:667MHz 类型:PC2-5300 DDR2;硬盘类型:SATA 硬盘转速:5400rpm时所得到的。其平均速度不低于16MB/s。 3、建议在Windows 2000及以上版本的操作系统上运行本软件。5 312浏览会员免费
- 网络通信类大小:123KB该软件是游戏软件,主要用于捉弄人 1、远程文件操作:包括创建、上传、下载、复制、删除文件或目录、打开文件(提供了四中不同的打开方式??正常方式、最大化、最小化和隐藏方式)等多项文件操作功能; 2、远程关机、重启、睡眠,拨号控制,光驱控制,注册表锁定,鼠标锁定,键盘锁定,对桌面图标、任务栏等锁定和隐藏等系统控制; 3、更改系统墙纸、分辨率、颜色、主机名、创建网络共享等系统配置功能; 4、获取计算机名、注册公司、当前用户、系统路径、操作系统版本、当前显示分辨率、物理及逻辑磁盘信息等多项系统数据; 5、对按键监视、剪切板监视、文件操作监视、任务监视和终止以及直接的屏幕监视和控制; 6、口令获取:上网密码,用户登陆密码,以星星出现过的密码,以及“Password”,“密码”,“登陆”,“口令”,“连接”,“帐号”,“用户”,“login”,“account”,“connect”等敏感字符进行获取,内存和CPU利用率也并不高。 7、短信息发送:以四种常用图标向被控端发送简短信息; 8、点对点聊天:与被控端进行点对点聊天交谈; 9、骷髅、地震、乱屏等耍人操作; 10、命令提示符操作:对DIR、NET VIEW等什么的Command命令操作; 11、注册表操作:主键的浏览、增删、重命名和对键值的读写等所有注册表操作功能; 12、EXE处理器:帮你的木马瞒天过海,帮你的EXE文件进行捆绑,加密,更换图标; 13、服务断配置:可更改端口、密码IP通知采用Email通知和客户端内置服务器侍待两种通知方式,Email通知将你的动态IP和密码星星等发走,采用静态IP通知5分钟刷新一次; 14、增加系统安全性,用户需要密码才能访问,可自动卸载,重新加载 15、新版单一采用TCP/IP协议传输,没用到UDP协议,消除了服务端在Win2k/NT下的不稳定情况 一些问题: 1、自动搜索:计算机自动扫描指定端口下的IP,该服务器程序指定端口为8011,又分高级搜索和低级搜索 2、低级搜索:在指定C类子网下扫描IP,用时短,显示中木马的计算机 3、高级搜索:穷举所有IP,用时长,显示中木马的计算机 4、因为要等待对方响应,根据你搜索的网大小定致延时 5、退出会终止搜索并把列表中的IP地址列在IP列表中,未保存 6、屏幕跟踪时,按键盘、鼠标相当对方按键盘鼠标,完全模拟,采用了JPEG图象传输适合Internet传输 7、IP列表中,读入记录可把保存的IP列举出来 8、IP列表中,保存记录可把列表中的IP保存进文件 9、IP列表中,清空记录删除文件记录 10、IP列表中,删除记录可在文件中删除该条记录 11、IP列表中,双击列表可自动把IP列入连接IP上 12、如用新建文件夹、复制、粘贴等,可能有影射错误,可用文件自动刷新,注册表同理,建议手动刷新 13、更换计算机名字要下次重启才有效 14、文件管理器中注意底下的当前目录可能和你左边的目录树不同,这没有错,因为数据未接收完时你按键 太多了 15、对键值的新建或删除不会自动刷新,请重新展开根键 16、 更换墙纸 命令无效,这个问题的可能性太多了,较常见的原因是被监控端的桌面设置为 按WEB页查看 17、二进制修改支持到0x200的偏移量修改 18、IP通知,分Email通知(动态IP适用)和内置IP服务侍待器(局域网适用),不需要Email通知请清空SMTP和Email 19、更改了配置采用重载服务断后立即有效 20、由于采用防DES复杂加密技术,EXE加密器如果采用随机码加密则运行解密时会慢点 21、加密后的程序只不过是来帮木马、病毒之类的瞒天过海,运行后当然会原形毕露,也只能做到这一步 22、所以要先配置服务端后再进行EXE捆绑才有效 23、配置服务断程序端口请用1024-65535之间的端口,以免冲突 24、由于2.1之后版本的内核和方法都完全改了,支持对2.1后的版本在线升级服务该软件是游戏软件,主要用于捉弄人 1、远程文件操作:包括创建、上传、下载、复制、删除文件或目录、打开文件(提供了四中不同的打开方式??正常方式、最大化、最小化和隐藏方式)等多项文件操作功能; 2、远程关机、重启、睡眠,拨号控制,光驱控制,注册表锁定,鼠标锁定,键盘锁定,对桌面图标、任务栏等锁定和隐藏等系统控制; 3、更改系统墙纸、分辨率、颜色、主机名、创建网络共享等系统配置功能; 4、获取计算机名、注册公司、当前用户、系统路径、操作系统版本、当前显示分辨率、物理及逻辑磁盘信息等多项系统数据; 5、对按键监视、剪切板监视、文件操作监视、任务监视和终止以及直接的屏幕监视和控制; 6、口令获取:上网密码,用户登陆密码,以星星出现过的密码,以及“Password”,“密码”,“登陆”,“口令”,“连接”,“帐号”,“用户”,“login”,“account”,“connect”等敏感字符进行获取,内存和CPU利用率也并不高。 7、短信息发送:以四种常用图标向被控端发送简短信息; 8、点对点聊天:与被控端进行点对点聊天交谈; 9、骷髅、地震、乱屏等耍人操作; 10、命令提示符操作:对DIR、NET VIEW等什么的Command命令操作; 11、注册表操作:主键的浏览、增删、重命名和对键值的读写等所有注册表操作功能; 12、EXE处理器:帮你的木马瞒天过海,帮你的EXE文件进行捆绑,加密,更换图标; 13、服务断配置:可更改端口、密码IP通知采用Email通知和客户端内置服务器侍待两种通知方式,Email通知将你的动态IP和密码星星等发走,采用静态IP通知5分钟刷新一次; 14、增加系统安全性,用户需要密码才能访问,可自动卸载,重新加载 15、新版单一采用TCP/IP协议传输,没用到UDP协议,消除了服务端在Win2k/NT下的不稳定情况 一些问题: 1、自动搜索:计算机自动扫描指定端口下的IP,该服务器程序指定端口为8011,又分高级搜索和低级搜索 2、低级搜索:在指定C类子网下扫描IP,用时短,显示中木马的计算机 3、高级搜索:穷举所有IP,用时长,显示中木马的计算机 4、因为要等待对方响应,根据你搜索的网大小定致延时 5、退出会终止搜索并把列表中的IP地址列在IP列表中,未保存 6、屏幕跟踪时,按键盘、鼠标相当对方按键盘鼠标,完全模拟,采用了JPEG图象传输适合Internet传输 7、IP列表中,读入记录可把保存的IP列举出来 8、IP列表中,保存记录可把列表中的IP保存进文件 9、IP列表中,清空记录删除文件记录 10、IP列表中,删除记录可在文件中删除该条记录 11、IP列表中,双击列表可自动把IP列入连接IP上 12、如用新建文件夹、复制、粘贴等,可能有影射错误,可用文件自动刷新,注册表同理,建议手动刷新 13、更换计算机名字要下次重启才有效 14、文件管理器中注意底下的当前目录可能和你左边的目录树不同,这没有错,因为数据未接收完时你按键 太多了 15、对键值的新建或删除不会自动刷新,请重新展开根键 16、 更换墙纸 命令无效,这个问题的可能性太多了,较常见的原因是被监控端的桌面设置为 按WEB页查看 17、二进制修改支持到0x200的偏移量修改 18、IP通知,分Email通知(动态IP适用)和内置IP服务侍待器(局域网适用),不需要Email通知请清空SMTP和Email 19、更改了配置采用重载服务断后立即有效 20、由于采用防DES复杂加密技术,EXE加密器如果采用随机码加密则运行解密时会慢点 21、加密后的程序只不过是来帮木马、病毒之类的瞒天过海,运行后当然会原形毕露,也只能做到这一步 22、所以要先配置服务端后再进行EXE捆绑才有效 23、配置服务断程序端口请用1024-65535之间的端口,以免冲突 24、由于2.1之后版本的内核和方法都完全改了,支持对2.1后的版本在线升级服务4 587浏览会员免费
- SPCOMM的主要属性,方法和事件大小:26KBSPCOMM的主要属性,方法和事件 1.属性 CommName:填写COM1,COM2…等串口的名字,在打开串口前,必须填写好此值。 BaudRate:设定波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。 ParityCheck:奇偶校验。 ByteSize:字节长度_5,_6,_7,_8等,根据实际情况设定。 Parity:奇偶校验位 pBits:停止位 SendDataEmpty:这是一个布尔属性,为true时表示发送缓存为空,或者发送队列里没有信息;为False时表示表示发送缓存不为空,或者发送队列里有信息。 2.方法 Startcomm过程用于打开串口,当打开失败时通常会报错,错误主要有7种: ⑴串口已经打开 ; ⑵打开串口错误 ; ⑶文件句柄不是通讯句柄; ⑷不能够安装通讯缓存; ⑸不能产生事件 ; ⑹不能产生读进程; ⑺不能产生写进程; StopComm过程用于关闭串口,没有返回值。 函数WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于发送一个字符串到写线程,发送成功返回true,发送失败返回false, 执行此函数将立即得到返回值,发送操作随后执行。函数有两个参数,其中 pdatatowrite是要发送的字符串,dwsizeofdatatowrite 是发送的长度。 3.事件 OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object 当输入缓存有数据时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,bufferlength是收到的数据长度。 OnReceiveError : procedure(Sender: TObject; EventMask : DWORD) 当接受数据时出现错误将触发该事件。SPCOMM的主要属性,方法和事件 1.属性 CommName:填写COM1,COM2…等串口的名字,在打开串口前,必须填写好此值。 BaudRate:设定波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。 ParityCheck:奇偶校验。 ByteSize:字节长度_5,_6,_7,_8等,根据实际情况设定。 Parity:奇偶校验位 pBits:停止位 SendDataEmpty:这是一个布尔属性,为true时表示发送缓存为空,或者发送队列里没有信息;为False时表示表示发送缓存不为空,或者发送队列里有信息。 2.方法 Startcomm过程用于打开串口,当打开失败时通常会报错,错误主要有7种: ⑴串口已经打开 ; ⑵打开串口错误 ; ⑶文件句柄不是通讯句柄; ⑷不能够安装通讯缓存; ⑸不能产生事件 ; ⑹不能产生读进程; ⑺不能产生写进程; StopComm过程用于关闭串口,没有返回值。 函数WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于发送一个字符串到写线程,发送成功返回true,发送失败返回false, 执行此函数将立即得到返回值,发送操作随后执行。函数有两个参数,其中 pdatatowrite是要发送的字符串,dwsizeofdatatowrite 是发送的长度。 3.事件 OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object 当输入缓存有数据时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,bufferlength是收到的数据长度。 OnReceiveError : procedure(Sender: TObject; EventMask : DWORD) 当接受数据时出现错误将触发该事件。5 289浏览会员免费
- C++大小:3MB监视进程的时间,运行状态等信息的程序 守护指定的程序监视进程的时间,运行状态等信息的程序 守护指定的程序5 347浏览会员免费
- AspackDie.eXe大小:29KB脱壳工具 破解软件 脱壳软件 AspackDie.eXe 还不错脱壳工具 破解软件 脱壳软件 AspackDie.eXe 还不错4 860浏览会员免费
- EXE病毒专杀大小:655KB杀毒文件.如果你的文件里有.EXE病毒,试试吧!杀毒文件.如果你的文件里有.EXE病毒,试试吧!2 75浏览会员免费
- Acunetix大小:45MBAcunetix Web Vulnerability Scanner 10.x Consultant Edition KeyGen By Hmily[LCG] 神器应用扫描Acunetix Web Vulnerability Scanner 10.x Consultant Edition KeyGen By Hmily[LCG] 神器应用扫描5 209浏览会员免费
- 东芝169打印驱动大小:3MB东芝169复印机打印驱动,原厂驱动,绝无病毒,敬请放心。东芝169复印机打印驱动,原厂驱动,绝无病毒,敬请放心。5 201浏览会员免费
- RAR大小:49KB同之前的进程隐藏工具一样,比如HIDE,详细请查阅附件。同之前的进程隐藏工具一样,比如HIDE,详细请查阅附件。4 253浏览会员免费
- 黑客帝国,数字雨大小:763KB黑客帝国数字雨黑客帝国数字雨4 202浏览会员免费
- SQL注入;XSS攻击大小:43KB针对SQL注入与XSS攻击的前期扫描工具,能够全面的对你网站进行透彻详细的扫描,它能扫描出远远比你能想想的多的多的链接地址,功能很强大,无毒,可以完一完,但不得用于恶意攻击,后果自负!针对SQL注入与XSS攻击的前期扫描工具,能够全面的对你网站进行透彻详细的扫描,它能扫描出远远比你能想想的多的多的链接地址,功能很强大,无毒,可以完一完,但不得用于恶意攻击,后果自负!4 1040浏览会员免费
- 《Snort轻量级入侵检测系统全攻略》共11章,主要内容包括四个方面,较为全面地介绍了Snort入侵检测系统的安装部署、配置、调整及使用,基本涵盖了Snort有关的方方面面。《Snort轻量级入侵检测系统全攻略》的特点是实用性非常强,概念准确、实例丰富,能够培养读者建立一套实用IDS的实际动手能力。另外,《Snort轻量级入侵检测系统全攻略》深入到Snort的具体技术细节中,是一本不可多得的全面掌握Snort的技术图书。《Snort轻量级入侵检测系统全攻略》面向的对象为具有基本网络技术知识的读者,即使读者以前从未接触过IDS,书中穿插的实例也能帮助读者成为IDS高手。对于资深网管,《Snort轻量级入侵检测系统全攻略》能提供一种性价比高的安全解决方案。同时,对于已学习过网络课程的大中专在校生,《Snort轻量级入侵检测系统全攻略》也可作为入侵检测或信息安全课程的授课辅助材料。5 862浏览会员免费
- ictclas大小:506KB中科院开源的ictprop源码,原来的没有工程文件,我自己整理了一下,挂了两个按钮将就可以跑了。不过大家下载了自己要改源码中的txt文件地址才能跑!<br>bug:<br> 关闭的时候会死掉,要关闭进程。<br>使用方法:<br>1、修改源码中的InputComboBox.cpp文件<br> InvokeAction里面的txt文件路径换成你的本地路径;<br>2、入口在帮助里面,先G_A,再G_B,然后P;结果就出来了,那几个子窗口不要关了,就可以看到句子的分析结果;<br>注:InvokeAction里面的txt文件都在压缩包里面;中科院开源的ictprop源码,原来的没有工程文件,我自己整理了一下,挂了两个按钮将就可以跑了。不过大家下载了自己要改源码中的txt文件地址才能跑!<br>bug:<br> 关闭的时候会死掉,要关闭进程。<br>使用方法:<br>1、修改源码中的InputComboBox.cpp文件<br> InvokeAction里面的txt文件路径换成你的本地路径;<br>2、入口在帮助里面,先G_A,再G_B,然后P;结果就出来了,那几个子窗口不要关了,就可以看到句子的分析结果;<br>注:InvokeAction里面的txt文件都在压缩包里面;5 199浏览会员免费
- 多功能大小:6MB一、本软件的相关介绍: 本软件是由梦幻卫士团队编写完成,期间得到了李文喜老师与秦永彬老师的极大帮助与支持,另外在本软件的优化时得到了姜太平老师的帮助与支持,在此对他们由衷地表示感谢。 梦幻卫士团队的队员组成如下: 队长:魏嘉银,队员:吕虹、唐瑞雪、郭春、郑洁、任丽娜 本软件主要是在队长魏嘉银的带领下依据美国国家标准技术研究所NIST (National Institute of Standard and Technology)于2001年11月26日正式公布并于2002年5月26日正式生效的高级加密标准AES(Advanced Encryption Standard)算法编写并不断地对其进行优化而成,团队的所有队员均参与了本本软件的框架设计、编码输入等一系列的工作。在此也对他们表示感谢。 二、本软件的功能: 1、软件的运行效率在同类软件产品中是较高的。 2、具有更换软件皮肤的功能。 3、具有“暂停”与“恢复”加/解密处理过程的功能。 4、具有类似于FlashGet、千千静听等软件的系统托盘特效的功能。 5、支持加/解密工作模式、初始向量的自定义功能,且初始向量可以从文件中导入。 6、支持加/解密时所使用密钥长度类型及密钥的自定义功能,且密钥可以从文件中导入。 7、提供在加/解密文件时,给合“多缓冲区”、“多线程”及“内存映射文件”三种技术进行文件的读写操作的功能,全面提升软件的加/解密效率。 8、具有自动计算待加密字符串长度及加/解密字符串时所用时间统计的功能。 9、支持以Unicode码、二进制码以及十六进制码三种编码方式显示加密后字符串的功能,其中二进制码和十六进制码两种显示方式主要是提供给从事密码学研究的人员使用的。 10、具有将对字符串加密后所得密文导出到文本文件(*.txt)、二进制文件(*.bin)以及十六进制文件(*.hex)的功能,此功能主要是用于将加密后所得的密文导出以作为软件加/解密时所用的初始向量或密钥。 11、具有可对任意类型文件进行加密的功能。 12、支持自定义解密生成文件的文件扩展名的功能。 13、支持直接将文件或文件夹拖动到编辑框或列表框中以设置相应路径的功能,以方便用户使用。 14、支持加/解密完成后删除源文件的功能。 15、支持在加密生成文件的文件名中保存原文件扩展名的功能,以使用户不会因时间推移而忘记自己所加密的原文件的文件类型。 16、具有加/解密单个文件时,自动计算出待处理文件长度、加/解密进度及将要处理(选择待处理文件后)或正处理的文件所需剩余时间的功能,以方便用户能够详细地了解文件的处理进程。 17、具有加/解密文件后,自动计算出加/解密所用时间、加/解密的速度及成功加/解密与加/解密失败的文件个数统计的功能。 18、支持用户在加/解密批量文件及加/解密加密包功能下,使用增加文件(而非目录)功能来新增待处理文件时,允许用户一次选择多个待处理文件的功能。 19、提出了“加密包”这一概念与功能,即用户可以将多个待加密的文件加密成一个加密包,当然也可以将一个加密包中的已加密后的文件数据解密到指定的目录之下。此功能类似于压缩包,但并非先将文件压缩之后再作加密;且其与“加/解密批量文件”功能也是完全不同的。 20、具有自动关联文件类型(共三种文件类型:“*.cryp”、“*.cryb”、“*.key”)的功能(在Windows Vista及以上的操作系统下需要以管理员权限来运行软件才能真正地关联文件类型)。这一功能使得用户可以在Windows系统的资源管理器下双击“.cryp”的文件时会自动打开软件并切换到加/解密单个文件的界面同时设置好“待解密文件路径”与“解密后文件路径”这两个参数。双击“.cryb”的文件时会自动打开软件并切换到加/解密加密包的界面同时设置“执行模式”为“解密文件”,并以列表的形式给出该加密包中所保存的加密后的文件信息列表。双击“.key”的文件时会自动打开记事本,并将该文件的信息显示在记事本中,以供用户编辑。 21、提供了与系统资源管理器的集成,此功能在使用之前要确保曾经运行过来软件。用户可以通过在资源管理器的任意文件上单击鼠标右键,然后在快捷菜单中选择“加密文件”或“生成加密包”功能以进行文件的加密;在加密后文件(*.cryp)上单击鼠标右键,然后在快捷菜单中选择“解密文件”功能以进行文件的加密;在加密包文件(*.cryb)上单击鼠标右键,然后在快捷菜单中选择“解密加密包”功能以进行文件的加密。提供此功能后,用户在加解密文件时就无需先运行本软件,而是可以通过快捷菜单来自动关联加载运行,使操作更加便利。一、本软件的相关介绍: 本软件是由梦幻卫士团队编写完成,期间得到了李文喜老师与秦永彬老师的极大帮助与支持,另外在本软件的优化时得到了姜太平老师的帮助与支持,在此对他们由衷地表示感谢。 梦幻卫士团队的队员组成如下: 队长:魏嘉银,队员:吕虹、唐瑞雪、郭春、郑洁、任丽娜 本软件主要是在队长魏嘉银的带领下依据美国国家标准技术研究所NIST (National Institute of Standard and Technology)于2001年11月26日正式公布并于2002年5月26日正式生效的高级加密标准AES(Advanced Encryption Standard)算法编写并不断地对其进行优化而成,团队的所有队员均参与了本本软件的框架设计、编码输入等一系列的工作。在此也对他们表示感谢。 二、本软件的功能: 1、软件的运行效率在同类软件产品中是较高的。 2、具有更换软件皮肤的功能。 3、具有“暂停”与“恢复”加/解密处理过程的功能。 4、具有类似于FlashGet、千千静听等软件的系统托盘特效的功能。 5、支持加/解密工作模式、初始向量的自定义功能,且初始向量可以从文件中导入。 6、支持加/解密时所使用密钥长度类型及密钥的自定义功能,且密钥可以从文件中导入。 7、提供在加/解密文件时,给合“多缓冲区”、“多线程”及“内存映射文件”三种技术进行文件的读写操作的功能,全面提升软件的加/解密效率。 8、具有自动计算待加密字符串长度及加/解密字符串时所用时间统计的功能。 9、支持以Unicode码、二进制码以及十六进制码三种编码方式显示加密后字符串的功能,其中二进制码和十六进制码两种显示方式主要是提供给从事密码学研究的人员使用的。 10、具有将对字符串加密后所得密文导出到文本文件(*.txt)、二进制文件(*.bin)以及十六进制文件(*.hex)的功能,此功能主要是用于将加密后所得的密文导出以作为软件加/解密时所用的初始向量或密钥。 11、具有可对任意类型文件进行加密的功能。 12、支持自定义解密生成文件的文件扩展名的功能。 13、支持直接将文件或文件夹拖动到编辑框或列表框中以设置相应路径的功能,以方便用户使用。 14、支持加/解密完成后删除源文件的功能。 15、支持在加密生成文件的文件名中保存原文件扩展名的功能,以使用户不会因时间推移而忘记自己所加密的原文件的文件类型。 16、具有加/解密单个文件时,自动计算出待处理文件长度、加/解密进度及将要处理(选择待处理文件后)或正处理的文件所需剩余时间的功能,以方便用户能够详细地了解文件的处理进程。 17、具有加/解密文件后,自动计算出加/解密所用时间、加/解密的速度及成功加/解密与加/解密失败的文件个数统计的功能。 18、支持用户在加/解密批量文件及加/解密加密包功能下,使用增加文件(而非目录)功能来新增待处理文件时,允许用户一次选择多个待处理文件的功能。 19、提出了“加密包”这一概念与功能,即用户可以将多个待加密的文件加密成一个加密包,当然也可以将一个加密包中的已加密后的文件数据解密到指定的目录之下。此功能类似于压缩包,但并非先将文件压缩之后再作加密;且其与“加/解密批量文件”功能也是完全不同的。 20、具有自动关联文件类型(共三种文件类型:“*.cryp”、“*.cryb”、“*.key”)的功能(在Windows Vista及以上的操作系统下需要以管理员权限来运行软件才能真正地关联文件类型)。这一功能使得用户可以在Windows系统的资源管理器下双击“.cryp”的文件时会自动打开软件并切换到加/解密单个文件的界面同时设置好“待解密文件路径”与“解密后文件路径”这两个参数。双击“.cryb”的文件时会自动打开软件并切换到加/解密加密包的界面同时设置“执行模式”为“解密文件”,并以列表的形式给出该加密包中所保存的加密后的文件信息列表。双击“.key”的文件时会自动打开记事本,并将该文件的信息显示在记事本中,以供用户编辑。 21、提供了与系统资源管理器的集成,此功能在使用之前要确保曾经运行过来软件。用户可以通过在资源管理器的任意文件上单击鼠标右键,然后在快捷菜单中选择“加密文件”或“生成加密包”功能以进行文件的加密;在加密后文件(*.cryp)上单击鼠标右键,然后在快捷菜单中选择“解密文件”功能以进行文件的加密;在加密包文件(*.cryb)上单击鼠标右键,然后在快捷菜单中选择“解密加密包”功能以进行文件的加密。提供此功能后,用户在加解密文件时就无需先运行本软件,而是可以通过快捷菜单来自动关联加载运行,使操作更加便利。5 0浏览会员免费
- Sql_Poizon_v1.1大小:365KBSql_Poizon_v1.1,Sql_Poizon_v1.1Sql_Poizon_v1.1,Sql_Poizon_v1.15 674浏览会员免费
- net大小:784KB流光最新版本教程,用过了,很方便, 适合新手老手!<br>请拿小日本机子试手哟!!! <br>如需要工具的朋友, 请复我, 我将工具放上来!!流光最新版本教程,用过了,很方便, 适合新手老手!<br>请拿小日本机子试手哟!!! <br>如需要工具的朋友, 请复我, 我将工具放上来!!4 338浏览会员免费
- 杀毒软件大小:21MBESET NOD32在国际上屡获殊荣,更是唯一一款连续46次通过国际权威防病毒认证VB100%的防病毒软件,成为其记录保持者。ESET NOD32拥有“轻、快、准、狠”四大特色,同时全面兼容Windows Vista操作系统。在中国,NOD32拥有众多的用户和极佳口碑。ESET NOD32在国际上屡获殊荣,更是唯一一款连续46次通过国际权威防病毒认证VB100%的防病毒软件,成为其记录保持者。ESET NOD32拥有“轻、快、准、狠”四大特色,同时全面兼容Windows Vista操作系统。在中国,NOD32拥有众多的用户和极佳口碑。4 380浏览会员免费
- 暴力破解大小:5MB这个不是一个图形界面的软件,需要在命令行界面执行。 在hydra文件夹下按住shift点击鼠标右键,选择终端打开(win10是在此处打开powershell) ctrl+r 输入cmd 然后进到这个目录也是一样的。 解压即可无需安装。 https://blog.csdn.net/qq_35311107/article/details/81083981 这是我自己用的心得 赠与新人这个不是一个图形界面的软件,需要在命令行界面执行。 在hydra文件夹下按住shift点击鼠标右键,选择终端打开(win10是在此处打开powershell) ctrl+r 输入cmd 然后进到这个目录也是一样的。 解压即可无需安装。 https://blog.csdn.net/qq_35311107/article/details/81083981 这是我自己用的心得 赠与新人4 9156浏览会员免费
- mailCrack2.6大小:615KBmailCrack2.6 或mailpswmailCrack2.6 或mailpsw3 178浏览会员免费
- C++教程大小:6MB一、ACE综述 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。ACE的目标用户是高性能和实时通信服务和应用的开发者。它简化了使用进程间通信、事件多路分离、显式动态链接和并发的OO网络应用和服务的开发。此外,通过服务在运行时与应用的动态链接,ACE还使系统的配置和重配置得以自动化。ACE正在进行持续的改进。Riverace公司(http://www.riverace.com)采用开放源码商业模式对ACE进行商业支持。此外,ACE开发组的许多成员目前正在进行The ACE ORB(TAO,http://www.cs.wustl.edu/~schmidt/TAO.html)的开发工作。二、使用ACE的好处使用ACE的好处有:l 增强可移植性:在ACE组件的帮助下,很容易在一种OS平台上编写并发网络应用,然后快速地将它们移植到各种其他的OS平台上。而且,因为ACE是开放源码的自由软件,你无需担心被锁定在特定的操作系统平台或编译器上。l 更好的软件质量:ACE的设计使用了许多可提高软件质量的关键模式,这些质量因素包括通信软件灵活性、可扩展性、可复用性和模块性。l 更高的效率和可预测性:ACE经仔细设计,支持广泛的应用服务质量(QoS)需求,包括延迟敏感应用的低响应等待时间、高带宽应用的高性能,以及实时应用的可预测性。l 更容易转换到标准的高级中间件:TAO使用了ACE提供的可复用组件和模式。它是CORBA的开发源码、遵循标准的实现,并为高性能和实时系统作了优化。为此,ACE和TAO被设计为能良好地协同工作,以提供全面的中间件解决方案。一、ACE综述 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。ACE的目标用户是高性能和实时通信服务和应用的开发者。它简化了使用进程间通信、事件多路分离、显式动态链接和并发的OO网络应用和服务的开发。此外,通过服务在运行时与应用的动态链接,ACE还使系统的配置和重配置得以自动化。ACE正在进行持续的改进。Riverace公司(http://www.riverace.com)采用开放源码商业模式对ACE进行商业支持。此外,ACE开发组的许多成员目前正在进行The ACE ORB(TAO,http://www.cs.wustl.edu/~schmidt/TAO.html)的开发工作。二、使用ACE的好处使用ACE的好处有:l 增强可移植性:在ACE组件的帮助下,很容易在一种OS平台上编写并发网络应用,然后快速地将它们移植到各种其他的OS平台上。而且,因为ACE是开放源码的自由软件,你无需担心被锁定在特定的操作系统平台或编译器上。l 更好的软件质量:ACE的设计使用了许多可提高软件质量的关键模式,这些质量因素包括通信软件灵活性、可扩展性、可复用性和模块性。l 更高的效率和可预测性:ACE经仔细设计,支持广泛的应用服务质量(QoS)需求,包括延迟敏感应用的低响应等待时间、高带宽应用的高性能,以及实时应用的可预测性。l 更容易转换到标准的高级中间件:TAO使用了ACE提供的可复用组件和模式。它是CORBA的开发源码、遵循标准的实现,并为高性能和实时系统作了优化。为此,ACE和TAO被设计为能良好地协同工作,以提供全面的中间件解决方案。5 196浏览会员免费
- 病毒清理,u盘解除写保护等多功能大小:2MB此工具可轻松解决很多U盘写保护,中病毒等问题! 使用方便快捷!此工具可轻松解决很多U盘写保护,中病毒等问题! 使用方便快捷!3 659浏览会员免费
- LL1大小:172KB编译原理的课程设计,使用Java语言编写的LL1文法分析器编译原理的课程设计,使用Java语言编写的LL1文法分析器5 252浏览会员免费
- VMP脱壳脚本,VMProtect脱壳,VMP脱壳, 脚本支持1.7--2.0版本, 对1.7以下版本稍微修改即可。4 1809浏览会员免费
- 杀毒工具类大小:3MBUSBCleaner 是一种纯绿色的辅助杀毒工具,支持简体与繁体语言系统,独有的分类查杀引擎具有检测查杀 470 余种 U 盘病毒,U 盘病毒广谱扫描,U 盘病毒免疫,修复显示隐藏文件及系统文件,安全卸载移动盘盘符等功能,全方位一体化修复杀除 U 盘病毒。同时 USBCleaner 能迅速对新出现的 U 盘病毒进行处理。<br>USBCleaner 是一种纯绿色的辅助杀毒工具,支持简体与繁体语言系统,独有的分类查杀引擎具有检测查杀 470 余种 U 盘病毒,U 盘病毒广谱扫描,U 盘病毒免疫,修复显示隐藏文件及系统文件,安全卸载移动盘盘符等功能,全方位一体化修复杀除 U 盘病毒。同时 USBCleaner 能迅速对新出现的 U 盘病毒进行处理。<br>0 126浏览会员免费
- EXE大小:3MBDomain4.3(明小子)10.10.10更新版主要更新内容如下: 1.驱除部分死连接,恢复部分官方连接 2.改变默认显示页面为本人BLOG 3.修正程序在检测时出错的BUG 4.修正程序在部分系统中无法启动的BUG 5.加了一个功能模块,但还不成熟,隐藏了,高手的话可以用OD调出来!>!< 6.修复前段时间一些朋友反映的错误和程序宏 7.增加四款SKN皮肤! 10.10.11紧急更新: 1.修正新版程序在部分系统中启动后直接导致系统蓝屏的BUG 2.修正域名查询的几个错误 3.修正程序批量检测查询到域名的时候无反映的BUG! Domain4.2(明小子)10.01.16更新版主要更新内容如下: 1.删除所有无关数据 2.优化急速代码 3.改变启动线程 4.增加SQL数据批量导出功能 5.加入几个优化进程模块,非后门.后台运行. 6.锁定主程序栏目宽和高,不在恢复 7.删除“辅助工具”模块中全部代码 8.修正XP SP3 程序下兼容问题 9.重新改写域名查询旁站线程 程序于2010年01月16号调试完毕! 提别提示:第4个功能只能运行在完整版的windows XP 平台系统中,其他平台无法运行,如果出现恢复按钮并不能保存请自行调试与本程序无关.谢谢合作! 宝宝的话:有朋友们的鼓励才会有这个版本的发布,这当是我送给大家2010年里的第一个礼物吧。 Domain4.1(明小子)0901更新版主要更新内容如下: 1.增加新系统兼容模块,全面兼容2000-2008各系统 (部分精简版系统除外) 2.优化网站打开速度,删减部分无用内核信息,全面加快程序启动速度. 3.基于09.05.20号内核提升,改变搜查循环的一个死BUG! 4.删除在0520上增加的一个补针函数,并使用新的函数替换.保证不报错. 5.不在兼容xpsp3,因为没时间去修正这个错误。所以可能部分SP3系统运行不起来本程序 6.增加部分程序扩充空格代码,为下个版本更新做好铺垫 小提示:保留旧的IP反查连接系统,原因没有找到新的和稳定的IP反差服务器!如果有能提供的请与本人联系!谢谢合作 Domain4.1(明小子)0520更新版主要更新内容如下: 1.基于08.10.01号内核提升,修正一次关键错误。 2.替换原程序自带的那个小马,该为最新美化免杀版的小马! 3.添加一个服务器挂钩程序(非插件),使修改后的新内核兼容vista系统。 4.程序数据库默认名为:SetData.mdb 请大家使用3.5版本以上的MDB数据.其他低版本程序可能不兼容! 5.删除后台下载统计代码(以前没发现,本人也是从网站上面下的软件,排除作者自添加行为) 6.加了一个补针,针对sql注入功能中的一个小BUG。 7.删除了很多没有用的代码,最大限度的优化程序启动速度。 8.更新部分在xpsp3下出错的几个小BUG(小问题小解决,这个错误仅针对部分优化过度的XPSP3系统)。 提记:很多朋友说需要修改下程序IP域名查询功能,这里说明下.由于内核找不到关键句柄导致无法更新,下个版本在仔细看看! Domain4.0(明小子)1001更新版主要更新内容如下: 1.更新部分过度优化过的系统不兼容问题。 2.修改内存识别函数,使其降低软件在使用期间所占用的内存大小。 3.基于08.09.15号内核提升,修正因修改软件所出现的几个导致软件崩溃的几个BUG。 4.换了软件自带的那个垃圾皮肤。加入兼容美化皮肤!更美观! 5.兼容前版本数据库支持功能 6.去掉了没有用的PHP入侵选项和几处小BUG...... 转贴是一种美德!分享也是一种快乐,工具仅做辅助作用请勿用在非法用途上! 程序自带本BLOG连接,启动比较慢!不喜勿用!谢谢合作! 程序所有权归: <明小子> 程序修改:宝宝Domain4.3(明小子)10.10.10更新版主要更新内容如下: 1.驱除部分死连接,恢复部分官方连接 2.改变默认显示页面为本人BLOG 3.修正程序在检测时出错的BUG 4.修正程序在部分系统中无法启动的BUG 5.加了一个功能模块,但还不成熟,隐藏了,高手的话可以用OD调出来!>!< 6.修复前段时间一些朋友反映的错误和程序宏 7.增加四款SKN皮肤! 10.10.11紧急更新: 1.修正新版程序在部分系统中启动后直接导致系统蓝屏的BUG 2.修正域名查询的几个错误 3.修正程序批量检测查询到域名的时候无反映的BUG! Domain4.2(明小子)10.01.16更新版主要更新内容如下: 1.删除所有无关数据 2.优化急速代码 3.改变启动线程 4.增加SQL数据批量导出功能 5.加入几个优化进程模块,非后门.后台运行. 6.锁定主程序栏目宽和高,不在恢复 7.删除“辅助工具”模块中全部代码 8.修正XP SP3 程序下兼容问题 9.重新改写域名查询旁站线程 程序于2010年01月16号调试完毕! 提别提示:第4个功能只能运行在完整版的windows XP 平台系统中,其他平台无法运行,如果出现恢复按钮并不能保存请自行调试与本程序无关.谢谢合作! 宝宝的话:有朋友们的鼓励才会有这个版本的发布,这当是我送给大家2010年里的第一个礼物吧。 Domain4.1(明小子)0901更新版主要更新内容如下: 1.增加新系统兼容模块,全面兼容2000-2008各系统 (部分精简版系统除外) 2.优化网站打开速度,删减部分无用内核信息,全面加快程序启动速度. 3.基于09.05.20号内核提升,改变搜查循环的一个死BUG! 4.删除在0520上增加的一个补针函数,并使用新的函数替换.保证不报错. 5.不在兼容xpsp3,因为没时间去修正这个错误。所以可能部分SP3系统运行不起来本程序 6.增加部分程序扩充空格代码,为下个版本更新做好铺垫 小提示:保留旧的IP反查连接系统,原因没有找到新的和稳定的IP反差服务器!如果有能提供的请与本人联系!谢谢合作 Domain4.1(明小子)0520更新版主要更新内容如下: 1.基于08.10.01号内核提升,修正一次关键错误。 2.替换原程序自带的那个小马,该为最新美化免杀版的小马! 3.添加一个服务器挂钩程序(非插件),使修改后的新内核兼容vista系统。 4.程序数据库默认名为:SetData.mdb 请大家使用3.5版本以上的MDB数据.其他低版本程序可能不兼容! 5.删除后台下载统计代码(以前没发现,本人也是从网站上面下的软件,排除作者自添加行为) 6.加了一个补针,针对sql注入功能中的一个小BUG。 7.删除了很多没有用的代码,最大限度的优化程序启动速度。 8.更新部分在xpsp3下出错的几个小BUG(小问题小解决,这个错误仅针对部分优化过度的XPSP3系统)。 提记:很多朋友说需要修改下程序IP域名查询功能,这里说明下.由于内核找不到关键句柄导致无法更新,下个版本在仔细看看! Domain4.0(明小子)1001更新版主要更新内容如下: 1.更新部分过度优化过的系统不兼容问题。 2.修改内存识别函数,使其降低软件在使用期间所占用的内存大小。 3.基于08.09.15号内核提升,修正因修改软件所出现的几个导致软件崩溃的几个BUG。 4.换了软件自带的那个垃圾皮肤。加入兼容美化皮肤!更美观! 5.兼容前版本数据库支持功能 6.去掉了没有用的PHP入侵选项和几处小BUG...... 转贴是一种美德!分享也是一种快乐,工具仅做辅助作用请勿用在非法用途上! 程序自带本BLOG连接,启动比较慢!不喜勿用!谢谢合作! 程序所有权归: <明小子> 程序修改:宝宝5 324浏览会员免费
- 远程控制大小:13MB藏鲸阁的绝版之作,黑洞远程控制2.2版,支持win7,杀软报毒,绝对原版无木马后门。藏鲸阁的绝版之作,黑洞远程控制2.2版,支持win7,杀软报毒,绝对原版无木马后门。3 426浏览会员免费
- IP,欺骗,IpMap,IP欺骗,黑客大小:293KB交换环境下的IP欺骗工具IpMap,本工具只供安全测试,严禁用于非法用途!交换环境下的IP欺骗工具IpMap,本工具只供安全测试,严禁用于非法用途!4 569浏览会员免费
- Java反序列化大小:101KB使用注意: 1. WebLogic反弹需要等5秒左右 2. 该工具为对外测试版,请尽量按照正常思路来用,比如Url填写清楚,IP地址写对了,报错或者抛异常神马的别怪我,调输入校验好蛋疼。 本工具与网上已公布工具优点: 1. 综合实现网上公布的代码执行、反弹 2. jboss利用里添加一键getshell功能,利用的是jboss的热部署功能,直接部署一个war包,一键返回一个菜刀shell 3. 反弹shell部分更完美,不再加载远程war包,直接发包完成反弹。 4. jboss回显执行命令部分利用异常抛出机制,本地(4.2.3.GA)测试成功,其他版本请自测 5. 体积更小,不再依赖java环境,但程序采用.net编写,需要.net 4.0环境 待完成: weblogic回显结果测试中,稍后加入使用注意: 1. WebLogic反弹需要等5秒左右 2. 该工具为对外测试版,请尽量按照正常思路来用,比如Url填写清楚,IP地址写对了,报错或者抛异常神马的别怪我,调输入校验好蛋疼。 本工具与网上已公布工具优点: 1. 综合实现网上公布的代码执行、反弹 2. jboss利用里添加一键getshell功能,利用的是jboss的热部署功能,直接部署一个war包,一键返回一个菜刀shell 3. 反弹shell部分更完美,不再加载远程war包,直接发包完成反弹。 4. jboss回显执行命令部分利用异常抛出机制,本地(4.2.3.GA)测试成功,其他版本请自测 5. 体积更小,不再依赖java环境,但程序采用.net编写,需要.net 4.0环境 待完成: weblogic回显结果测试中,稍后加入5 1579浏览会员免费
- 黑客渗透笔记完整版 pdf,非常好的资料。需要的下载。5 1850浏览会员免费
- 汉化补丁大小:19MB首先感谢在我学习过程帮助过我的人。 汉化方法: 1.安装原始版本。 2.解压汉化文件。把汉化文件直接复制到虚拟机文件夹中,替 换原文件即可。 3.替换时,个别文件可能提示无法替换,请在任务管理器中先 结束相应文件进程,之后在替换。 4.说明一下,注册机由于机理可能不过部分杀毒软件,不过可 以放心,文件本身并不是病毒。 汉化人:kingzee 邮箱:kingzee@yahoo.cn 本人在学习汉化过程中曾得到过 WZQZQ 的帮助 注:此次没有提供注册码,防止个别不能注册,特提供 注册机。祝大家使用愉快。首先感谢在我学习过程帮助过我的人。 汉化方法: 1.安装原始版本。 2.解压汉化文件。把汉化文件直接复制到虚拟机文件夹中,替 换原文件即可。 3.替换时,个别文件可能提示无法替换,请在任务管理器中先 结束相应文件进程,之后在替换。 4.说明一下,注册机由于机理可能不过部分杀毒软件,不过可 以放心,文件本身并不是病毒。 汉化人:kingzee 邮箱:kingzee@yahoo.cn 本人在学习汉化过程中曾得到过 WZQZQ 的帮助 注:此次没有提供注册码,防止个别不能注册,特提供 注册机。祝大家使用愉快。5 129浏览会员免费
- 第1章概论 显然,未来对计算速度、系统可靠性和成本实效性的要求必将促使发展另外的计算机模型 来取代传统的冯·诺依曼型结构的计算机。随着计算机网络的出现,一个新的梦想成为可能 —分布式计算。当用户需要完成任何任务时,分布式计算提供对尽可能多的计算机能力和数 据的透明访问,同时实现高性能与高可靠性的目标。在过去的1 0年里,人们对分布式计算系统 的兴趣迅猛发展。有关分布式计算的主题是多种多样的,许多研究人员正在研究关于分布式硬 件结构和分布式软件设计的各方面问题以开发利用其潜在的并行性和容错性。在这一章里,我 们将考虑一些基本概念以及与分布式计算相关的一些问题,并列出了本书所覆盖的主题。 1.1 推动因素 计算机技术的发展可以通过使用计算机的不同方式来描述。在5 0年代,计算机是串行处理 机,一次运行一个作业直至完成。这些处理机通过一个操作员从控制台操纵,而对于普通用户 则是不可访问的。在6 0年代,需求相似的作业作为一个组以批处理的方式通过计算机运行以减 少计算机的空闲时间。同一时期还提出了其他一些技术,如利用缓冲、假脱机和多道程序等的 脱机处理。7 0年代产生了分时系统,不仅作为提高计算机利用率的手段,也使用户离计算机更 近了。分时是迈向分布式系统的第一步:用户可以在不同的地点共享并访问资源。8 0年代是个 人计算的1 0年:人们有了他们自己专用的机器。由于基于微处理器的系统所提供的出色的性能/ 价格比和网络技术的稳步提高, 9 0年代是分布式系统的1 0年。 分布式系统可以有不同的物理组成:一组通过通信网络互连的个人计算机,一系列不仅共 享文件系统和数据库系统而且共享C P U周期的工作站(而且在大部分情况下本地进程比远程进 程有更高的优先级,其中一个进程就是一个运行中的程序),一个处理机池(其中终端不隶属于 任何一个处理机,而且不论本地进程还是远程进程,所有资源得以真正的共享)。 分布式系统是无缝的,也就是说网络功能单元间的接口很大程度上对用户不可见。分布式计 算的思想还被应用在数据库系统[16、38、49],文件系统[4、24、33、43、54],操作系统[2、39、46]和通用环境[19、32、35]。 另一种表示同样思想的说法是用户把系统看成一个虚拟的单处理机而不是不4 830浏览会员免费
- EWSA5.0大小:5MB这是最新版的EWSA5.0,中文版,已注册 。 如第一次开是英文的,请在options-->language下选择简体中文即可这是最新版的EWSA5.0,中文版,已注册 。 如第一次开是英文的,请在options-->language下选择简体中文即可4 161浏览会员免费
- 操作系统大小:212KB文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,您不必担心内存是如何管理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来说,理解您的内存管理器的能力与局限性至关重要。在大部分系统语言中,比如 C 和 C++,您必须进行内存管理。本文将介绍手工的、半手工的以及自动的内存管理实践的基本概念。 追溯到在 Apple II 上进行汇编语言编程的时代,那时内存管理还不是个大问题。您实际上在运行整个系统。系统有多少内存,您就有多少内存。您甚至不必费心思去弄明白它有多少内存,因为每一台机器的内存数量都相同。所以,如果内存需要非常固定,那么您只需要选择一个内存范围并使用它即可。 不过,即使是在这样一个简单的计算机中,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时。如果您的空间有限,而内存需求是变化的,那么您需要一些方法来满足这些需求: 确定您是否有足够的内存来处理数据。 从可用的内存中获取一部分内存。 向可用内存池(pool)中返回部分内存,以使其可以由程序的其他部分或者其他程序使用。 实现这些需求的程序库称为 分配程序(allocators),因为它们负责分配和回收内存。程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。 回页首 C 风格的内存分配程序 C 编程语言提供了两个函数来满足我们的三个需求: malloc:该函数分配给定的字节数,并返回一个指向它们的指针。如果没有足够的可用内存,那么它返回一个空指针。 free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要理解内存在程序中是如何分配的,首先需要理解如何将内存从操作系统分配给程序。计算机上的每一个进程都认为自己可以访问所有的物理内存。显然,由于同时在运行多个程序,所以每个进程不可能拥有全部内存。实际上,这些进程使用的是 虚拟内存。 只是作为一个例子,让我们假定您的程序正在访问地址为 629 的内存。不过,虚拟内存系统不需要将其存储在位置为 629 的 RAM 中。实际上,它甚至可以不在 RAM 中 —— 如果物理 RAM 已经满了,它甚至可能已经被转移到硬盘上!由于这类地址不必反映内存所在的物理位置,所以它们被称为虚拟内存。操作系统维持着一个虚拟地址到物理地址的转换的表,以便计算机硬件可以正确地响应地址请求。并且,如果地址在硬盘上而不是在 RAM 中,那么操作系统将暂时停止您的进程,将其他内存转存到硬盘中,从硬盘上加载被请求的内存,然后再重新启动您的进程。这样,每个进程都获得了自己可以使用的地址空间,可以访问比您物理上安装的内存更多的内存。 在 32-位 x86 系统上,每一个进程可以访问 4 GB 内存。现在,大部分人的系统上并没有 4 GB 内存,即使您将 swap 也算上, 每个进程所使用的内存也肯定少于 4 GB。因此,当加载一个进程时,它会得到一个取决于某个称为 系统中断点(system break)的特定地址的初始内存分配。该地址之后是未被映射的内存 —— 用于在 RAM 或者硬盘中没有分配相应物理位置的内存。因此,如果一个进程运行超出了它初始分配的内存,那么它必须请求操作系统“映射进来(map in)”更多的内存。(映射是一个表示一一对应关系的数学术语 —— 当内存的虚拟地址有一个对应的物理地址来存储内存内容时,该内存将被映射。) 基于 UNIX 的系统有两个可映射到附加内存中的基本系统调用: brk: brk() 是一个非常简单的系统调用。还记得系统中断点吗?该位置是进程映射的内存边界。 brk() 只是简单地将这个位置向前或者向后移动,就可以向进程添加内存或者从进程取走内存。 mmap: mmap(),或者说是“内存映像”,类似于 brk(),但是更为灵活。首先,它可以映射任何位置的内存,而不单单只局限于进程。其次,它不仅可以将虚拟地址映射到物理的 RAM 或者 swap,它还可以将它们映射到文件和文件位置,这样,读写内存将对文件中的数据进行读写。不过,在这里,我们只关心 mmap 向进程添加被映射的内存的能力。 munmap() 所做的事情与 mmap() 相反。 如您所见, brk() 或者 mmap() 都可以用来向我们的进程添加额外的虚拟内存。在我们的例子中将使用 brk(),因为它更简单,更通用。 实现一个简单的分配程序 如果您曾经编写过很多 C 程序,那么您可能曾多次使用过 malloc() 和 free()。不过,您可能没有用一些时间去思考它们在您的操作系统中是如何实现的。本节将向您展示 malloc 和 free 的一个最简化实现的代码,来帮助说明管理内存时都涉及到了哪些事情。 要试着运行这些示例,需要先 复制本代码清单,并将其粘贴到一个名为 malloc.c 的文件中。接下来,我将一次一个部分地对该清单进行解释。 在大部分操作系统中,内存分配由以下两个简单的函数来处理: void *malloc(long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。 void free(void *firstbyte):如果给定一个由先前的 malloc 返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。 malloc_init 将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,然后建立起指向我们管理的内存的指针。这三个变量都是全局变量: 清单 1. 我们的简单分配程序的全局变量 int has_initialized = 0; void *managed_memory_start; void *last_valid_address; 如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统中断点或者 当前中断点。在很多 UNIX® 系统中,为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk 根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。这里是我们的 malloc 初始化代码,它将找到当前中断点并初始化我们的变量: 清单 2. 分配程序初始化函数 /* Include the sbrk function */ #include <unistd.h> void malloc_init() { /* grab the last valid address from the OS */ last_valid_address = sbrk(0); /* we don't have any memory to manage yet, so *just set the beginning to be last_valid_address */ managed_memory_start = last_valid_address; /* Okay, we're initialized and ready to go */ has_initialized = 1; } 现在,为了完全地管理内存,我们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构: 清单 3. 内存控制块结构定义 struct mem_control_block { int is_available; int size; }; 现在,您可能会认为当程序调用 malloc 时这会引发问题 —— 它们如何知道这个结构?答案是它们不必知道;在返回指针之前,我们会将其移动到这个结构之后,把它隐藏起来。这使得返回的指针指向没有用于任何其他用途的内存。那样,从调用程序的角度来看,它们所得到的全部是空闲的、开放的内存。然后,当通过 free() 将该指针传递回来时,我们只需要倒退几个内存字节就可以再次找到这个结构。 在讨论分配内存之前,我们将先讨论释放,因为它更简单。为了释放内存,我们必须要做的惟一一件事情就是,获得我们给出的指针,回退 sizeof(struct mem_control_block) 个字节,并将其标记为可用的。这里是对应的代码: 清单 4. 解除分配函数 void free(void *firstbyte) { struct mem_control_block *mcb; /* Backup from the given pointer to find the * mem_control_block */ mcb = firstbyte - sizeof(struct mem_control_block); /* Mark the block as being available */ mcb->is_available = 1; /* That's It! We're done. */ return; } 如您所见,在这个分配程序中,内存的释放使用了一个非常简单的机制,在固定时间内完成内存释放。分配内存稍微困难一些。以下是该算法的略述: 清单 5. 主分配程序的伪代码 1. If our allocator has not been initialized, initialize it. 2. Add sizeof(struct mem_control_block) to the size requested. 3. start at managed_memory_start. 4. Are we at last_valid address? 5. If we are: A. We didn't find any existing space that was large enough -- ask the operating system for more and return that. 6. Otherwise: A. Is the current space available (check is_available from the mem_control_block)? B. If it is: i) Is it large enough (check "size" from the mem_control_block)? ii) If so: a. Mark it as unavailable b. Move past mem_control_block and return the pointer iii) Otherwise: a. Move forward "size" bytes b. Go back go step 4 C. Otherwise: i) Move forward "size" bytes ii) Go back to step 4 我们主要使用连接的指针遍历内存来寻找开放的内存块。这里是代码: 清单 6. 主分配程序 void *malloc(long numbytes) { /* Holds where we are looking in memory */ void *current_location; /* This is the same as current_location, but cast to a * memory_control_block */ struct mem_control_block *current_location_mcb; /* This is the memory location we will return. It will * be set to 0 until we find something suitable */ void *memory_location; /* Initialize if we haven't already done so */ if(! has_initialized) { malloc_init(); } /* The memory we search for has to include the memory * control block, but the users of malloc don't need * to know this, so we'll just add it in for them. */ numbytes = numbytes + sizeof(struct mem_control_block); /* Set memory_location to 0 until we find a suitable * location */ memory_location = 0; /* Begin searching at the start of managed memory */ current_location = managed_memory_start; /* Keep going until we have searched all allocated space */ while(current_location != last_valid_address) { /* current_location and current_location_mcb point * to the same address. However, current_location_mcb * is of the correct type, so we can use it as a struct. * current_location is a void pointer so we can use it * to calculate addresses. */ current_location_mcb = (struct mem_control_block *)current_location; if(current_location_mcb->is_available) { if(current_location_mcb->size >= numbytes) { /* Woohoo! We've found an open, * appropriately-size location. */ /* It is no longer available */ current_location_mcb->is_available = 0; /* We own it */ memory_location = current_location; /* Leave the loop */ break; } } /* If we made it here, it's because the Current memory * block not suitable; move to the next one */ current_location = current_location + current_location_mcb->size; } /* If we still don't have a valid location, we'll * have to ask the operating system for more memory */ if(! memory_location) { /* Move the program break numbytes further */ sbrk(numbytes); /* The new memory will be where the last valid * address left off */ memory_location = last_valid_address; /* We'll move the last valid address forward * numbytes */ last_valid_address = last_valid_address + numbytes; /* We need to initialize the mem_control_block */ current_location_mcb = memory_location; current_location_mcb->is_available = 0; current_location_mcb->size = numbytes; } /* Now, no matter what (well, except for error conditions), * memory_location has the address of the memory, including * the mem_control_block */ /* Move the pointer past the mem_control_block */ memory_location = memory_location + sizeof(struct mem_control_block); /* Return the pointer */ return memory_location; } 这就是我们的内存管理器。现在,我们只需要构建它,并在程序中使用它即可。 运行下面的命令来构建 malloc 兼容的分配程序(实际上,我们忽略了 realloc() 等一些函数,不过, malloc() 和 free() 才是最主要的函数): 清单 7. 编译分配程序 gcc -shared -fpic malloc.c -o malloc.so 该程序将生成一个名为 malloc.so 的文件,它是一个包含有我们的代码的共享库。 在 UNIX 系统中,现在您可以用您的分配程序来取代系统的 malloc(),做法如下: 清单 8. 替换您的标准的 malloc LD_PRELOAD=/path/to/malloc.so export LD_PRELOAD LD_PRELOAD 环境变量使动态链接器在加载任何可执行程序之前,先加载给定的共享库的符号。它还为特定库中的符号赋予优先权。因此,从现在起,该会话中的任何应用程序都将使用我们的 malloc(),而不是只有系统的应用程序能够使用。有一些应用程序不使用 malloc(),不过它们是例外。其他使用 realloc() 等其他内存管理函数的应用程序,或者错误地假定 malloc() 内部行为的那些应用程序,很可能会崩溃。ash shell 似乎可以使用我们的新 malloc() 很好地工作。 如果您想确保 malloc() 正在被使用,那么您应该通过向函数的入口点添加 write() 调用来进行测试。 我们的内存管理器在很多方面都还存在欠缺,但它可以有效地展示内存管理需要做什么事情。它的某些缺点包括: 由于它对系统中断点(一个全局变量)进行操作,所以它不能与其他分配程序或者 mmap 一起使用。 当分配内存时,在最坏的情形下,它将不得不遍历 全部进程内存;其中可能包括位于硬盘上的很多内存,这意味着操作系统将不得不花时间去向硬盘移入数据和从硬盘中移出数据。 没有很好的内存不足处理方案( malloc 只假定内存分配是成功的)。 它没有实现很多其他的内存函数,比如 realloc()。 由于 sbrk() 可能会交回比我们请求的更多的内存,所以在堆(heap)的末端会遗漏一些内存。 虽然 is_available 标记只包含一位信息,但它要使用完整的 4-字节 的字。 分配程序不是线程安全的。 分配程序不能将空闲空间拼合为更大的内存块。 分配程序的过于简单的匹配算法会导致产生很多潜在的内存碎片。 我确信还有很多其他问题。这就是为什么它只是一个例子! 其他 malloc 实现 malloc() 的实现有很多,这些实现各有优点与缺点。在设计一个分配程序时,要面临许多需要折衷的选择,其中包括: 分配的速度。 回收的速度。 有线程的环境的行为。 内存将要被用光时的行为。 局部缓存。 簿记(Bookkeeping)内存开销。 虚拟内存环境中的行为。 小的或者大的对象。 实时保证。 每一个实现都有其自身的优缺点集合。在我们的简单的分配程序中,分配非常慢,而回收非常快。另外,由于它在使用虚拟内存系统方面较差,所以它最适于处理大的对象。 还有其他许多分配程序可以使用。其中包括: Doug Lea Malloc:Doug Lea Malloc 实际上是完整的一组分配程序,其中包括 Doug Lea 的原始分配程序,GNU libc 分配程序和 ptmalloc。 Doug Lea 的分配程序有着与我们的版本非常类似的基本结构,但是它加入了索引,这使得搜索速度更快,并且可以将多个没有被使用的块组合为一个大的块。它还支持缓存,以便更快地再次使用最近释放的内存。 ptmalloc 是 Doug Lea Malloc 的一个扩展版本,支持多线程。在本文后面的 参考资料部分中,有一篇描述 Doug Lea 的 Malloc 实现的文章。 BSD Malloc:BSD Malloc 是随 4.2 BSD 发行的实现,包含在 FreeBSD 之中,这个分配程序可以从预先确实大小的对象构成的池中分配对象。它有一些用于对象大小的 size 类,这些对象的大小为 2 的若干次幂减去某一常数。所以,如果您请求给定大小的一个对象,它就简单地分配一个与之匹配的 size 类。这样就提供了一个快速的实现,但是可能会浪费内存。在 参考资料部分中,有一篇描述该实现的文章。 Hoard:编写 Hoard 的目标是使内存分配在多线程环境中进行得非常快。因此,它的构造以锁的使用为中心,从而使所有进程不必等待分配内存。它可以显著地加快那些进行很多分配和回收的多线程进程的速度。在 参考资料部分中,有一篇描述该实现的文章。 众多可用的分配程序中最有名的就是上述这些分配程序。如果您的程序有特别的分配需求,那么您可能更愿意编写一个定制的能匹配您的程序内存分配方式的分配程序。不过,如果不熟悉分配程序的设计,那么定制分配程序通常会带来比它们解决的问题更多的问题。要获得关于该主题的适当的介绍,请参阅 Donald Knuth 撰写的 The Art of Computer Programming Volume 1: Fundamental Algorithms 中的第 2.5 节“Dynamic Storage Allocation”(请参阅 参考资料中的链接)。它有点过时,因为它没有考虑虚拟内存环境,不过大部分算法都是基于前面给出的函数。 在 C++ 中,通过重载 operator new(),您可以以每个类或者每个模板为单位实现自己的分配程序。在 Andrei Alexandrescu 撰写的 Modern C++ Design 的第 4 章(“Small Object Allocation”)中,描述了一个小对象分配程序(请参阅 参考资料中的链接)。 基于 malloc() 的内存管理的缺点 不只是我们的内存管理器有缺点,基于 malloc() 的内存管理器仍然也有很多缺点,不管您使用的是哪个分配程序。对于那些需要保持长期存储的程序使用 malloc() 来管理内存可能会非常令人失望。如果您有大量的不固定的内存引用,经常难以知道它们何时被释放。生存期局限于当前函数的内存非常容易管理,但是对于生存期超出该范围的内存来说,管理内存则困难得多。而且,关于内存管理是由进行调用的程序还是由被调用的函数来负责这一问题,很多 API 都不是很明确。 因为管理内存的问题,很多程序倾向于使用它们自己的内存管理规则。C++ 的异常处理使得这项任务更成问题。有时好像致力于管理内存分配和清理的代码比实际完成计算任务的代码还要多!因此,我们将研究内存管理的其他选择。 回页首 半自动内存管理策略 引用计数 引用计数是一种 半自动(semi-automated)的内存管理技术,这表示它需要一些编程支持,但是它不需要您确切知道某一对象何时不再被使用。引用计数机制为您完成内存管理任务。 在引用计数中,所有共享的数据结构都有一个域来包含当前活动“引用”结构的次数。当向一个程序传递一个指向某个数据结构指针时,该程序会将引用计数增加 1。实质上,您是在告诉数据结构,它正在被存储在多少个位置上。然后,当您的进程完成对它的使用后,该程序就会将引用计数减少 1。结束这个动作之后,它还会检查计数是否已经减到零。如果是,那么它将释放内存。 这样做的好处是,您不必追踪程序中某个给定的数据结构可能会遵循的每一条路径。每次对其局部的引用,都将导致计数的适当增加或减少。这样可以防止在使用数据结构时释放该结构。不过,当您使用某个采用引用计数的数据结构时,您必须记得运行引用计数函数。另外,内置函数和第三方的库不会知道或者可以使用您的引用计数机制。引用计数也难以处理发生循环引用的数据结构。 要实现引用计数,您只需要两个函数 —— 一个增加引用计数,一个减少引用计数并当计数减少到零时释放内存。 一个示例引用计数函数集可能看起来如下所示: 清单 9. 基本的引用计数函数 /* Structure Definitions*/ /* Base structure that holds a refcount */ struct refcountedstruct { int refcount; } /* All refcounted structures must mirror struct * refcountedstruct for their first variables */ /* Refcount maintenance functions */ /* Increase reference count */ void REF(void *data) { struct refcountedstruct *rstruct; rstruct = (struct refcountedstruct *) data; rstruct->refcount++; } /* Decrease reference count */ void UNREF(void *data) { struct refcountedstruct *rstruct; rstruct = (struct refcountedstruct *) data; rstruct->refcount--; /* Free the structure if there are no more users */ if(rstruct->refcount == 0) { free(rstruct); } } REF 和 UNREF 可能会更复杂,这取决于您想要做的事情。例如,您可能想要为多线程程序增加锁,那么您可能想扩展 refcountedstruct,使它同样包含一个指向某个在释放内存之前要调用的函数的指针(类似于面向对象语言中的析构函数 —— 如果您的结构中包含这些指针,那么这是 必需的)。 当使用 REF 和 UNREF 时,您需要遵守这些指针的分配规则: UNREF 分配前左端指针(left-hand-side pointer)指向的值。 REF 分配后左端指针(left-hand-side pointer)指向的值。 在传递使用引用计数的结构的函数中,函数需要遵循以下这些规则: 在函数的起始处 REF 每一个指针。 在函数的结束处 UNREF 第一个指针。 以下是一个使用引用计数的生动的代码示例: 清单 10. 使用引用计数的示例 /* EXAMPLES OF USAGE */ /* Data type to be refcounted */ struct mydata { int refcount; /* same as refcountedstruct */ int datafield1; /* Fields specific to this struct */ int datafield2; /* other declarations would go here as appropriate */ }; /* Use the functions in code */ void dosomething(struct mydata *data) { REF(data); /* Process data */ /* when we are through */ UNREF(data); } struct mydata *globalvar1; /* Note that in this one, we don't decrease the * refcount since we are maintaining the reference * past the end of the function call through the * global variable */ void storesomething(struct mydata *data) { REF(data); /* passed as a parameter */ globalvar1 = data; REF(data); /* ref because of Assignment */ UNREF(data); /* Function finished */ } 由于引用计数是如此简单,大部分程序员都自已去实现它,而不是使用库。不过,它们依赖于 malloc 和 free 等低层的分配程序来实际地分配和释放它们的内存。 在 Perl 等高级语言中,进行内存管理时使用引用计数非常广泛。在这些语言中,引用计数由语言自动地处理,所以您根本不必担心它,除非要编写扩展模块。由于所有内容都必须进行引用计数,所以这会对速度产生一些影响,但它极大地提高了编程的安全性和方便性。以下是引用计数的益处: 实现简单。 易于使用。 由于引用是数据结构的一部分,所以它有一个好的缓存位置。 不过,它也有其不足之处: 要求您永远不要忘记调用引用计数函数。 无法释放作为循环数据结构的一部分的结构。 减缓几乎每一个指针的分配。 尽管所使用的对象采用了引用计数,但是当使用异常处理(比如 try 或 setjmp()/ longjmp())时,您必须采取其他方法。 需要额外的内存来处理引用。 引用计数占用了结构中的第一个位置,在大部分机器中最快可以访问到的就是这个位置。 在多线程环境中更慢也更难以使用。 C++ 可以通过使用 智能指针(smart pointers)来容忍程序员所犯的一些错误,智能指针可以为您处理引用计数等指针处理细节。不过,如果不得不使用任何先前的不能处理智能指针的代码(比如对 C 库的联接),实际上,使用它们的后果通实比不使用它们更为困难和复杂。因此,它通常只是有益于纯 C++ 项目。如果您想使用智能指针,那么您实在应该去阅读 Alexandrescu 撰写的 Modern C++ Design 一书中的“Smart Pointers”那一章。 内存池 内存池是另一种半自动内存管理方法。内存池帮助某些程序进行自动内存管理,这些程序会经历一些特定的阶段,而且每个阶段中都有分配给进程的特定阶段的内存。例如,很多网络服务器进程都会分配很多针对每个连接的内存 —— 内存的最大生存期限为当前连接的存在期。Apache 使用了池式内存(pooled memory),将其连接拆分为各个阶段,每个阶段都有自己的内存池。在结束每个阶段时,会一次释放所有内存。 在池式内存管理中,每次内存分配都会指定内存池,从中分配内存。每个内存池都有不同的生存期限。在 Apache 中,有一个持续时间为服务器存在期的内存池,还有一个持续时间为连接的存在期的内存池,以及一个持续时间为请求的存在期的池,另外还有其他一些内存池。因此,如果我的一系列函数不会生成比连接持续时间更长的数据,那么我就可以完全从连接池中分配内存,并知道在连接结束时,这些内存会被自动释放。另外,有一些实现允许注册 清除函数(cleanup functions),在清除内存池之前,恰好可以调用它,来完成在内存被清理前需要完成的其他所有任务(类似于面向对象中的析构函数)。 要在自己的程序中使用池,您既可以使用 GNU libc 的 obstack 实现,也可以使用 Apache 的 Apache Portable Runtime。GNU obstack 的好处在于,基于 GNU 的 Linux 发行版本中默认会包括它们。Apache Portable Runtime 的好处在于它有很多其他工具,可以处理编写多平台服务器软件所有方面的事情。要深入了解 GNU obstack 和 Apache 的池式内存实现,请参阅 参考资料部分中指向这些实现的文档的链接。 下面的假想代码列表展示了如何使用 obstack: 清单 11. obstack 的示例代码 #include <obstack.h> #include <stdlib.h> /* Example code listing for using obstacks */ /* Used for obstack macros (xmalloc is a malloc function that exits if memory is exhausted */ #define obstack_chunk_alloc xmalloc #define obstack_chunk_free free /* Pools */ /* Only permanent allocations should go in this pool */ struct obstack *global_pool; /* This pool is for per-connection data */ struct obstack *connection_pool; /* This pool is for per-request data */ struct obstack *request_pool; void allocation_failed() { exit(1); } int main() { /* Initialize Pools */ global_pool = (struct obstack *) xmalloc (sizeof (struct obstack)); obstack_init(global_pool); connection_pool = (struct obstack *) xmalloc (sizeof (struct obstack)); obstack_init(connection_pool); request_pool = (struct obstack *) xmalloc (sizeof (struct obstack)); obstack_init(request_pool); /* Set the error handling function */ obstack_alloc_failed_handler = &allocation_failed; /* Server main loop */ while(1) { wait_for_connection(); /* We are in a connection */ while(more_requests_available()) { /* Handle request */ handle_request(); /* Free all of the memory allocated * in the request pool */ obstack_free(request_pool, NULL); } /* We're finished with the connection, time * to free that pool */ obstack_free(connection_pool, NULL); } } int handle_request() { /* Be sure that all object allocations are allocated * from the request pool */ int bytes_i_need = 400; void *data1 = obstack_alloc(request_pool, bytes_i_need); /* Do stuff to process the request */ /* return */ return 0; } 基本上,在操作的每一个主要阶段结束之后,这个阶段的 obstack 会被释放。不过,要注意的是,如果一个过程需要分配持续时间比当前阶段更长的内存,那么它也可以使用更长期限的 obstack,比如连接或者全局内存。传递给 obstack_free() 的 NULL 指出它应该释放 obstack 的全部内容。可以用其他的值,但是它们通常不怎么实用。 使用池式内存分配的益处如下所示: 应用程序可以简单地管理内存。 内存分配和回收更快,因为每次都是在一个池中完成的。分配可以在 O(1) 时间内完成,释放内存池所需时间也差不多(实际上是 O(n) 时间,不过在大部分情况下会除以一个大的因数,使其变成 O(1))。 可以预先分配错误处理池(Error-handling pools),以便程序在常规内存被耗尽时仍可以恢复。 有非常易于使用的标准实现。 池式内存的缺点是: 内存池只适用于操作可以分阶段的程序。 内存池通常不能与第三方库很好地合作。 如果程序的结构发生变化,则不得不修改内存池,这可能会导致内存管理系统的重新设计。 您必须记住需要从哪个池进行分配。另外,如果在这里出错,就很难捕获该内存池。 回页首 垃圾收集 垃圾收集(Garbage collection)是全自动地检测并移除不再使用的数据对象。垃圾收集器通常会在当可用内存减少到少于一个具体的阈值时运行。通常,它们以程序所知的可用的一组“基本”数据 —— 栈数据、全局变量、寄存器 —— 作为出发点。然后它们尝试去追踪通过这些数据连接到每一块数据。收集器找到的都是有用的数据;它没有找到的就是垃圾,可以被销毁并重新使用这些无用的数据。为了有效地管理内存,很多类型的垃圾收集器都需要知道数据结构内部指针的规划,所以,为了正确运行垃圾收集器,它们必须是语言本身的一部分。 收集器的类型 复制(copying): 这些收集器将内存存储器分为两部分,只允许数据驻留在其中一部分上。它们定时地从“基本”的元素开始将数据从一部分复制到另一部分。内存新近被占用的部分现在成为活动的,另一部分上的所有内容都认为是垃圾。另外,当进行这项复制操作时,所有指针都必须被更新为指向每个内存条目的新位置。因此,为使用这种垃圾收集方法,垃圾收集器必须与编程语言集成在一起。 标记并清理(Mark and sweep):每一块数据都被加上一个标签。不定期的,所有标签都被设置为 0,收集器从“基本”的元素开始遍历数据。当它遇到内存时,就将标签标记为 1。最后没有被标记为 1 的所有内容都认为是垃圾,以后分配内存时会重新使用它们。 增量的(Incremental):增量垃圾收集器不需要遍历全部数据对象。因为在收集期间的突然等待,也因为与访问所有当前数据相关的缓存问题(所有内容都不得不被页入(page-in)),遍历所有内存会引发问题。增量收集器避免了这些问题。 保守的(Conservative):保守的垃圾收集器在管理内存时不需要知道与数据结构相关的任何信息。它们只查看所有数据类型,并假定它们 可以全部都是指针。所以,如果一个字节序列可以是一个指向一块被分配的内存的指针,那么收集器就将其标记为正在被引用。有时没有被引用的内存会被收集,这样会引发问题,例如,如果一个整数域中包含一个值,该值是已分配内存的地址。不过,这种情况极少发生,而且它只会浪费少量内存。保守的收集器的优势是,它们可以与任何编程语言相集成。 Hans Boehm 的保守垃圾收集器是可用的最流行的垃圾收集器之一,因为它是免费的,而且既是保守的又是增量的,可以使用 --enable-redirect-malloc 选项来构建它,并且可以将它用作系统分配程序的简易替代者(drop-in replacement)(用 malloc/ free 代替它自己的 API)。实际上,如果这样做,您就可以使用与我们在示例分配程序中所使用的相同的 LD_PRELOAD 技巧,在系统上的几乎任何程序中启用垃圾收集。如果您怀疑某个程序正在泄漏内存,那么您可以使用这个垃圾收集器来控制进程。在早期,当 Mozilla 严重地泄漏内存时,很多人在其中使用了这项技术。这种垃圾收集器既可以在 Windows® 下运行,也可以在 UNIX 下运行。 垃圾收集的一些优点: 您永远不必担心内存的双重释放或者对象的生命周期。 使用某些收集器,您可以使用与常规分配相同的 API。 其缺点包括: 使用大部分收集器时,您都无法干涉何时释放内存。 在多数情况下,垃圾收集比其他形式的内存管理更慢。 垃圾收集错误引发的缺陷难于调试。 如果您忘记将不再使用的指针设置为 null,那么仍然会有内存泄漏。 回页首 结束语 一切都需要折衷:性能、易用、易于实现、支持线程的能力等,这里只列出了其中的一些。为了满足项目的要求,有很多内存管理模式可以供您使用。每种模式都有大量的实现,各有其优缺点。对很多项目来说,使用编程环境默认的技术就足够了,不过,当您的项目有特殊的需要时,了解可用的选择将会有帮助。下表对比了本文中涉及的内存管理策略。 表 1. 内存分配策略的对比 策略 分配速度 回收速度 局部缓存 易用性 通用性 实时可用 SMP 线程友好 定制分配程序 取决于实现 取决于实现 取决于实现 很难 无 取决于实现 取决于实现 简单分配程序 内存使用少时较快 很快 差 容易 高 否 否 GNU malloc 中 快 中 容易 高 否 中 Hoard 中 中 中 容易 高 否 是 引用计数 N/A N/A 非常好 中 中 是(取决于 malloc 实现) 取决于实现 池 中 非常快 极好 中 中 是(取决于 malloc 实现) 取决于实现 垃圾收集 中(进行收集时慢) 中 差 中 中 否 几乎不 增量垃圾收集 中 中 中 中 中 否 几乎不 增量保守垃圾收集 中 中 中 容易 高 否 几乎不 参考资料 您可以参阅本文在 developerWorks 全球站点上的 英文原文。 Web 上的文档 GNU C Library 手册的 obstacks 部分 提供了 obstacks 编程接口。 Apache Portable Runtime 文档 描述了它们的池式分配程序的接口。 基本的分配程序 Doug Lea 的 Malloc 是最流行的内存分配程序之一。 BSD Malloc 用于大部分基于 BSD 的系统中。 ptmalloc 起源于 Doug Lea 的 malloc,用于 GLIBC 之中。 Hoard 是一个为多线程应用程序优化的 malloc 实现。 GNU Memory-Mapped Malloc(GDB 的组成部分) 是一个基于 mmap() 的 malloc 实现。 池式分配程序 GNU Obstacks(GNU Libc 的组成部分)是安装最多的池式分配程序,因为在每一个基于 glibc 的系统中都有它。 Apache 的池式分配程序(Apache Portable Runtime 中) 是应用最为广泛的池式分配程序。 Squid 有其自己的池式分配程序。 NetBSD 也有其自己的池式分配程序。 talloc 是一个池式分配程序,是 Samba 的组成部分。 智能指针和定制分配程序 Loki C++ Library 有很多为 C++ 实现的通用模式,包括智能指针和一个定制的小对象分配程序。 垃圾收集器 Hahns Boehm Conservative Garbage Collector 是最流行的开源垃圾收集器,它可以用于常规的 C/C++ 程序。 关于现代操作系统中的虚拟内存的文章 Marshall Kirk McKusick 和 Michael J. Karels 合著的 A New Virtual Memory Implementation for Berkeley UNIX 讨论了 BSD 的 VM 系统。 Mel Gorman's Linux VM Documentation 讨论了 Linux VM 系统。 关于 malloc 的文章 Poul-Henning Kamp 撰写的 Malloc in Modern Virtual Memory Environments 讨论的是 malloc 以及它如何与 BSD 虚拟内存交互。 Berger、McKinley、Blumofe 和 Wilson 合著的 Hoard -- a Scalable Memory Allocator for Multithreaded Environments 讨论了 Hoard 分配程序的实现。 Marshall Kirk McKusick 和 Michael J. Karels 合著的 Design of a General Purpose Memory Allocator for the 4.3BSD UNIX Kernel 讨论了内核级的分配程序。 Doug Lea 撰写的 A Memory Allocator 给出了一个关于设计和实现分配程序的概述,其中包括设计选择与折衷。 Emery D. Berger 撰写的 Memory Management for High-Performance Applications 讨论的是定制内存管理以及它如何影响高性能应用程序。 关于定制分配程序的文章 Doug Lea 撰写的 Some Storage Management Techniques for Container Classes 描述的是为 C++ 类编写定制分配程序。 Berger、Zorn 和 McKinley 合著的 Composing High-Performance Memory Allocators 讨论了如何编写定制分配程序来加快具体工作的速度。 Berger、Zorn 和 McKinley 合著的 Reconsidering Custom Memory Allocation 再次提及了定制分配的主题,看是否真正值得为其费心。 关于垃圾收集的文章 Paul R. Wilson 撰写的 Uniprocessor Garbage Collection Techniques 给出了垃圾收集的一个基本概述。 Benjamin Zorn 撰写的 The Measured Cost of Garbage Collection 给出了关于垃圾收集和性能的硬数据(hard data)。 Hans-Juergen Boehm 撰写的 Memory Allocation Myths and Half-Truths 给出了关于垃圾收集的神话(myths)。 Hans-Juergen Boehm 撰写的 Space Efficient Conservative Garbage Collection 是一篇描述他的用于 C/C++ 的垃圾收集器的文章。 Web 上的通用参考资料 内存管理参考 中有很多关于内存管理参考资料和技术文章的链接。 关于内存管理和内存层级的 OOPS Group Papers 是非常好的一组关于此主题的技术文章。 C++ 中的内存管理讨论的是为 C++ 编写定制的分配程序。 Programming Alternatives: Memory Management 讨论了程序员进行内存管理时的一些选择。 垃圾收集 FAQ 讨论了关于垃圾收集您需要了解的所有内容。 Richard Jones 的 Garbage Collection Bibliography 有指向任何您想要的关于垃圾收集的文章的链接。 书籍 Michael Daconta 撰写的 C++ Pointers and Dynamic Memory Management 介绍了关于内存管理的很多技术。 Frantisek Franek 撰写的 Memory as a Programming Concept in C and C++ 讨论了有效使用内存的技术与工具,并给出了在计算机编程中应当引起注意的内存相关错误的角色。 Richard Jones 和 Rafael Lins 合著的 Garbage Collection: Algorithms for Automatic Dynamic Memory Management 描述了当前使用的最常见的垃圾收集算法。 在 Donald Knuth 撰写的 The Art of Computer Programming 第 1 卷 Fundamental Algorithms 的第 2.5 节“Dynamic Storage Allocation”中,描述了实现基本的分配程序的一些技术。 在 Donald Knuth 撰写的 The Art of Computer Programming 第 1 卷 Fundamental Algorithms 的第 2.3.5 节“Lists and Garbage Collection”中,讨论了用于列表的垃圾收集算法。 Andrei Alexandrescu 撰写的 Modern C++ Design 第 4 章“Small Object Allocation”描述了一个比 C++ 标准分配程序效率高得多的一个高速小对象分配程序。 Andrei Alexandrescu 撰写的 Modern C++ Design 第 7 章“Smart Pointers”描述了在 C++ 中智能指针的实现。 Jonathan 撰写的 Programming from the Ground Up 第 8 章“Intermediate Memory Topics”中有本文使用的简单分配程序的一个汇编语言版本。 来自 developerWorks 自我管理数据缓冲区内存 (developerWorks,2004 年 1 月)略述了一个用于管理内存的自管理的抽象数据缓存器的伪 C (pseudo-C)实现。 A framework for the user defined malloc replacement feature (developerWorks,2002 年 2 月)展示了如何利用 AIX 中的一个工具,使用自己设计的内存子系统取代原有的内存子系统。 掌握 Linux 调试技术 (developerWorks,2002 年 8 月)描述了可以使用调试方法的 4 种不同情形:段错误、内存溢出、内存泄漏和挂起。 在 处理 Java 程序中的内存漏洞 (developerWorks,2001 年 2 月)中,了解导致 Java 内存泄漏的原因,以及何时需要考虑它们。 在 developerWorks Linux 专区中,可以找到更多为 Linux 开发人员准备的参考资料。 从 developerWorks 的 Speed-start your Linux app 专区中,可以下载运行于 Linux 之上的 IBM 中间件产品的免费测试版本,其中包括 WebSphere® Studio Application Developer、WebSphere Application Server、DB2® Universal Database、Tivoli® Access Manager 和 Tivoli Directory Server,查找 how-to 文章和技术支持。 通过参与 developerWorks blogs 加入到 developerWorks 社区。 可以在 Developer Bookstore Linux 专栏中定购 打折出售的 Linux 书籍。 关于作者 Jonathan Bartlett 是 Programming from the Ground Up 一书的作者,这本书介绍的是 Linux 汇编语言编程。Jonathan Bartlett 是 New Media Worx 的总开发师,负责为客户开发 Web、视频、kiosk 和桌面应用程序。您可以通过 johnnyb@eskimo.com 与 Jonathan 联系。文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,您不必担心内存是如何管理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来说,理解您的内存管理器的能力与局限性至关重要。在大部分系统语言中,比如 C 和 C++,您必须进行内存管理。本文将介绍手工的、半手工的以及自动的内存管理实践的基本概念。 追溯到在 Apple II 上进行汇编语言编程的时代,那时内存管理还不是个大问题。您实际上在运行整个系统。系统有多少内存,您就有多少内存。您甚至不必费心思去弄明白它有多少内存,因为每一台机器的内存数量都相同。所以,如果内存需要非常固定,那么您只需要选择一个内存范围并使用它即可。 不过,即使是在这样一个简单的计算机中,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时。如果您的空间有限,而内存需求是变化的,那么您需要一些方法来满足这些需求: 确定您是否有足够的内存来处理数据。 从可用的内存中获取一部分内存。 向可用内存池(pool)中返回部分内存,以使其可以由程序的其他部分或者其他程序使用。 实现这些需求的程序库称为 分配程序(allocators),因为它们负责分配和回收内存。程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。 回页首 C 风格的内存分配程序 C 编程语言提供了两个函数来满足我们的三个需求: malloc:该函数分配给定的字节数,并返回一个指向它们的指针。如果没有足够的可用内存,那么它返回一个空指针。 free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要理解内存在程序中是如何分配的,首先需要理解如何将内存从操作系统分配给程序。计算机上的每一个进程都认为自己可以访问所有的物理内存。显然,由于同时在运行多个程序,所以每个进程不可能拥有全部内存。实际上,这些进程使用的是 虚拟内存。 只是作为一个例子,让我们假定您的程序正在访问地址为 629 的内存。不过,虚拟内存系统不需要将其存储在位置为 629 的 RAM 中。实际上,它甚至可以不在 RAM 中 —— 如果物理 RAM 已经满了,它甚至可能已经被转移到硬盘上!由于这类地址不必反映内存所在的物理位置,所以它们被称为虚拟内存。操作系统维持着一个虚拟地址到物理地址的转换的表,以便计算机硬件可以正确地响应地址请求。并且,如果地址在硬盘上而不是在 RAM 中,那么操作系统将暂时停止您的进程,将其他内存转存到硬盘中,从硬盘上加载被请求的内存,然后再重新启动您的进程。这样,每个进程都获得了自己可以使用的地址空间,可以访问比您物理上安装的内存更多的内存。 在 32-位 x86 系统上,每一个进程可以访问 4 GB 内存。现在,大部分人的系统上并没有 4 GB 内存,即使您将 swap 也算上, 每个进程所使用的内存也肯定少于 4 GB。因此,当加载一个进程时,它会得到一个取决于某个称为 系统中断点(system break)的特定地址的初始内存分配。该地址之后是未被映射的内存 —— 用于在 RAM 或者硬盘中没有分配相应物理位置的内存。因此,如果一个进程运行超出了它初始分配的内存,那么它必须请求操作系统“映射进来(map in)”更多的内存。(映射是一个表示一一对应关系的数学术语 —— 当内存的虚拟地址有一个对应的物理地址来存储内存内容时,该内存将被映射。) 基于 UNIX 的系统有两个可映射到附加内存中的基本系统调用: brk: brk() 是一个非常简单的系统调用。还记得系统中断点吗?该位置是进程映射的内存边界。 brk() 只是简单地将这个位置向前或者向后移动,就可以向进程添加内存或者从进程取走内存。 mmap: mmap(),或者说是“内存映像”,类似于 brk(),但是更为灵活。首先,它可以映射任何位置的内存,而不单单只局限于进程。其次,它不仅可以将虚拟地址映射到物理的 RAM 或者 swap,它还可以将它们映射到文件和文件位置,这样,读写内存将对文件中的数据进行读写。不过,在这里,我们只关心 mmap 向进程添加被映射的内存的能力。 munmap() 所做的事情与 mmap() 相反。 如您所见, brk() 或者 mmap() 都可以用来向我们的进程添加额外的虚拟内存。在我们的例子中将使用 brk(),因为它更简单,更通用。 实现一个简单的分配程序 如果您曾经编写过很多 C 程序,那么您可能曾多次使用过 malloc() 和 free()。不过,您可能没有用一些时间去思考它们在您的操作系统中是如何实现的。本节将向您展示 malloc 和 free 的一个最简化实现的代码,来帮助说明管理内存时都涉及到了哪些事情。 要试着运行这些示例,需要先 复制本代码清单,并将其粘贴到一个名为 malloc.c 的文件中。接下来,我将一次一个部分地对该清单进行解释。 在大部分操作系统中,内存分配由以下两个简单的函数来处理: void *malloc(long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。 void free(void *firstbyte):如果给定一个由先前的 malloc 返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。 malloc_init 将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,然后建立起指向我们管理的内存的指针。这三个变量都是全局变量: 清单 1. 我们的简单分配程序的全局变量 int has_initialized = 0; void *managed_memory_start; void *last_valid_address; 如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统中断点或者 当前中断点。在很多 UNIX® 系统中,为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk 根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。这里是我们的 malloc 初始化代码,它将找到当前中断点并初始化我们的变量: 清单 2. 分配程序初始化函数 /* Include the sbrk function */ #include <unistd.h> void malloc_init() { /* grab the last valid address from the OS */ last_valid_address = sbrk(0); /* we don't have any memory to manage yet, so *just set the beginning to be last_valid_address */ managed_memory_start = last_valid_address; /* Okay, we're initialized and ready to go */ has_initialized = 1; } 现在,为了完全地管理内存,我们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构: 清单 3. 内存控制块结构定义 struct mem_control_block { int is_available; int size; }; 现在,您可能会认为当程序调用 malloc 时这会引发问题 —— 它们如何知道这个结构?答案是它们不必知道;在返回指针之前,我们会将其移动到这个结构之后,把它隐藏起来。这使得返回的指针指向没有用于任何其他用途的内存。那样,从调用程序的角度来看,它们所得到的全部是空闲的、开放的内存。然后,当通过 free() 将该指针传递回来时,我们只需要倒退几个内存字节就可以再次找到这个结构。 在讨论分配内存之前,我们将先讨论释放,因为它更简单。为了释放内存,我们必须要做的惟一一件事情就是,获得我们给出的指针,回退 sizeof(struct mem_control_block) 个字节,并将其标记为可用的。这里是对应的代码: 清单 4. 解除分配函数 void free(void *firstbyte) { struct mem_control_block *mcb; /* Backup from the given pointer to find the * mem_control_block */ mcb = firstbyte - sizeof(struct mem_control_block); /* Mark the block as being available */ mcb->is_available = 1; /* That's It! We're done. */ return; } 如您所见,在这个分配程序中,内存的释放使用了一个非常简单的机制,在固定时间内完成内存释放。分配内存稍微困难一些。以下是该算法的略述: 清单 5. 主分配程序的伪代码 1. If our allocator has not been initialized, initialize it. 2. Add sizeof(struct mem_control_block) to the size requested. 3. start at managed_memory_start. 4. Are we at last_valid address? 5. If we are: A. We didn't find any existing space that was large enough -- ask the operating system for more and return that. 6. Otherwise: A. Is the current space available (check is_available from the mem_control_block)? B. If it is: i) Is it large enough (check "size" from the mem_control_block)? ii) If so: a. Mark it as unavailable b. Move past mem_control_block and return the pointer iii) Otherwise: a. Move forward "size" bytes b. Go back go step 4 C. Otherwise: i) Move forward "size" bytes ii) Go back to step 4 我们主要使用连接的指针遍历内存来寻找开放的内存块。这里是代码: 清单 6. 主分配程序 void *malloc(long numbytes) { /* Holds where we are looking in memory */ void *current_location; /* This is the same as current_location, but cast to a * memory_control_block */ struct mem_control_block *current_location_mcb; /* This is the memory location we will return. It will * be set to 0 until we find something suitable */ void *memory_location; /* Initialize if we haven't already done so */ if(! has_initialized) { malloc_init(); } /* The memory we search for has to include the memory * control block, but the users of malloc don't need * to know this, so we'll just add it in for them. */ numbytes = numbytes + sizeof(struct mem_control_block); /* Set memory_location to 0 until we find a suitable * location */ memory_location = 0; /* Begin searching at the start of managed memory */ current_location = managed_memory_start; /* Keep going until we have searched all allocated space */ while(current_location != last_valid_address) { /* current_location and current_location_mcb point * to the same address. However, current_location_mcb * is of the correct type, so we can use it as a struct. * current_location is a void pointer so we can use it * to calculate addresses. */ current_location_mcb = (struct mem_control_block *)current_location; if(current_location_mcb->is_available) { if(current_location_mcb->size >= numbytes) { /* Woohoo! We've found an open, * appropriately-size location. */ /* It is no longer available */ current_location_mcb->is_available = 0; /* We own it */ memory_location = current_location; /* Leave the loop */ break; } } /* If we made it here, it's because the Current memory * block not suitable; move to the next one */ current_location = current_location + current_location_mcb->size; } /* If we still don't have a valid location, we'll * have to ask the operating system for more memory */ if(! memory_location) { /* Move the program break numbytes further */ sbrk(numbytes); /* The new memory will be where the last valid * address left off */ memory_location = last_valid_address; /* We'll move the last valid address forward * numbytes */ last_valid_address = last_valid_address + numbytes; /* We need to initialize the mem_control_block */ current_location_mcb = memory_location; current_location_mcb->is_available = 0; current_location_mcb->size = numbytes; } /* Now, no matter what (well, except for error conditions), * memory_location has the address of the memory, including * the mem_control_block */ /* Move the pointer past the mem_control_block */ memory_location = memory_location + sizeof(struct mem_control_block); /* Return the pointer */ return memory_location; } 这就是我们的内存管理器。现在,我们只需要构建它,并在程序中使用它即可。 运行下面的命令来构建 malloc 兼容的分配程序(实际上,我们忽略了 realloc() 等一些函数,不过, malloc() 和 free() 才是最主要的函数): 清单 7. 编译分配程序 gcc -shared -fpic malloc.c -o malloc.so 该程序将生成一个名为 malloc.so 的文件,它是一个包含有我们的代码的共享库。 在 UNIX 系统中,现在您可以用您的分配程序来取代系统的 malloc(),做法如下: 清单 8. 替换您的标准的 malloc LD_PRELOAD=/path/to/malloc.so export LD_PRELOAD LD_PRELOAD 环境变量使动态链接器在加载任何可执行程序之前,先加载给定的共享库的符号。它还为特定库中的符号赋予优先权。因此,从现在起,该会话中的任何应用程序都将使用我们的 malloc(),而不是只有系统的应用程序能够使用。有一些应用程序不使用 malloc(),不过它们是例外。其他使用 realloc() 等其他内存管理函数的应用程序,或者错误地假定 malloc() 内部行为的那些应用程序,很可能会崩溃。ash shell 似乎可以使用我们的新 malloc() 很好地工作。 如果您想确保 malloc() 正在被使用,那么您应该通过向函数的入口点添加 write() 调用来进行测试。 我们的内存管理器在很多方面都还存在欠缺,但它可以有效地展示内存管理需要做什么事情。它的某些缺点包括: 由于它对系统中断点(一个全局变量)进行操作,所以它不能与其他分配程序或者 mmap 一起使用。 当分配内存时,在最坏的情形下,它将不得不遍历 全部进程内存;其中可能包括位于硬盘上的很多内存,这意味着操作系统将不得不花时间去向硬盘移入数据和从硬盘中移出数据。 没有很好的内存不足处理方案( malloc 只假定内存分配是成功的)。 它没有实现很多其他的内存函数,比如 realloc()。 由于 sbrk() 可能会交回比我们请求的更多的内存,所以在堆(heap)的末端会遗漏一些内存。 虽然 is_available 标记只包含一位信息,但它要使用完整的 4-字节 的字。 分配程序不是线程安全的。 分配程序不能将空闲空间拼合为更大的内存块。 分配程序的过于简单的匹配算法会导致产生很多潜在的内存碎片。 我确信还有很多其他问题。这就是为什么它只是一个例子! 其他 malloc 实现 malloc() 的实现有很多,这些实现各有优点与缺点。在设计一个分配程序时,要面临许多需要折衷的选择,其中包括: 分配的速度。 回收的速度。 有线程的环境的行为。 内存将要被用光时的行为。 局部缓存。 簿记(Bookkeeping)内存开销。 虚拟内存环境中的行为。 小的或者大的对象。 实时保证。 每一个实现都有其自身的优缺点集合。在我们的简单的分配程序中,分配非常慢,而回收非常快。另外,由于它在使用虚拟内存系统方面较差,所以它最适于处理大的对象。 还有其他许多分配程序可以使用。其中包括: Doug Lea Malloc:Doug Lea Malloc 实际上是完整的一组分配程序,其中包括 Doug Lea 的原始分配程序,GNU libc 分配程序和 ptmalloc。 Doug Lea 的分配程序有着与我们的版本非常类似的基本结构,但是它加入了索引,这使得搜索速度更快,并且可以将多个没有被使用的块组合为一个大的块。它还支持缓存,以便更快地再次使用最近释放的内存。 ptmalloc 是 Doug Lea Malloc 的一个扩展版本,支持多线程。在本文后面的 参考资料部分中,有一篇描述 Doug Lea 的 Malloc 实现的文章。 BSD Malloc:BSD Malloc 是随 4.2 BSD 发行的实现,包含在 FreeBSD 之中,这个分配程序可以从预先确实大小的对象构成的池中分配对象。它有一些用于对象大小的 size 类,这些对象的大小为 2 的若干次幂减去某一常数。所以,如果您请求给定大小的一个对象,它就简单地分配一个与之匹配的 size 类。这样就提供了一个快速的实现,但是可能会浪费内存。在 参考资料部分中,有一篇描述该实现的文章。 Hoard:编写 Hoard 的目标是使内存分配在多线程环境中进行得非常快。因此,它的构造以锁的使用为中心,从而使所有进程不必等待分配内存。它可以显著地加快那些进行很多分配和回收的多线程进程的速度。在 参考资料部分中,有一篇描述该实现的文章。 众多可用的分配程序中最有名的就是上述这些分配程序。如果您的程序有特别的分配需求,那么您可能更愿意编写一个定制的能匹配您的程序内存分配方式的分配程序。不过,如果不熟悉分配程序的设计,那么定制分配程序通常会带来比它们解决的问题更多的问题。要获得关于该主题的适当的介绍,请参阅 Donald Knuth 撰写的 The Art of Computer Programming Volume 1: Fundamental Algorithms 中的第 2.5 节“Dynamic Storage Allocation”(请参阅 参考资料中的链接)。它有点过时,因为它没有考虑虚拟内存环境,不过大部分算法都是基于前面给出的函数。 在 C++ 中,通过重载 operator new(),您可以以每个类或者每个模板为单位实现自己的分配程序。在 Andrei Alexandrescu 撰写的 Modern C++ Design 的第 4 章(“Small Object Allocation”)中,描述了一个小对象分配程序(请参阅 参考资料中的链接)。 基于 malloc() 的内存管理的缺点 不只是我们的内存管理器有缺点,基于 malloc() 的内存管理器仍然也有很多缺点,不管您使用的是哪个分配程序。对于那些需要保持长期存储的程序使用 malloc() 来管理内存可能会非常令人失望。如果您有大量的不固定的内存引用,经常难以知道它们何时被释放。生存期局限于当前函数的内存非常容易管理,但是对于生存期超出该范围的内存来说,管理内存则困难得多。而且,关于内存管理是由进行调用的程序还是由被调用的函数来负责这一问题,很多 API 都不是很明确。 因为管理内存的问题,很多程序倾向于使用它们自己的内存管理规则。C++ 的异常处理使得这项任务更成问题。有时好像致力于管理内存分配和清理的代码比实际完成计算任务的代码还要多!因此,我们将研究内存管理的其他选择。 回页首 半自动内存管理策略 引用计数 引用计数是一种 半自动(semi-automated)的内存管理技术,这表示它需要一些编程支持,但是它不需要您确切知道某一对象何时不再被使用。引用计数机制为您完成内存管理任务。 在引用计数中,所有共享的数据结构都有一个域来包含当前活动“引用”结构的次数。当向一个程序传递一个指向某个数据结构指针时,该程序会将引用计数增加 1。实质上,您是在告诉数据结构,它正在被存储在多少个位置上。然后,当您的进程完成对它的使用后,该程序就会将引用计数减少 1。结束这个动作之后,它还会检查计数是否已经减到零。如果是,那么它将释放内存。 这样做的好处是,您不必追踪程序中某个给定的数据结构可能会遵循的每一条路径。每次对其局部的引用,都将导致计数的适当增加或减少。这样可以防止在使用数据结构时释放该结构。不过,当您使用某个采用引用计数的数据结构时,您必须记得运行引用计数函数。另外,内置函数和第三方的库不会知道或者可以使用您的引用计数机制。引用计数也难以处理发生循环引用的数据结构。 要实现引用计数,您只需要两个函数 —— 一个增加引用计数,一个减少引用计数并当计数减少到零时释放内存。 一个示例引用计数函数集可能看起来如下所示: 清单 9. 基本的引用计数函数 /* Structure Definitions*/ /* Base structure that holds a refcount */ struct refcountedstruct { int refcount; } /* All refcounted structures must mirror struct * refcountedstruct for their first variables */ /* Refcount maintenance functions */ /* Increase reference count */ void REF(void *data) { struct refcountedstruct *rstruct; rstruct = (struct refcountedstruct *) data; rstruct->refcount++; } /* Decrease reference count */ void UNREF(void *data) { struct refcountedstruct *rstruct; rstruct = (struct refcountedstruct *) data; rstruct->refcount--; /* Free the structure if there are no more users */ if(rstruct->refcount == 0) { free(rstruct); } } REF 和 UNREF 可能会更复杂,这取决于您想要做的事情。例如,您可能想要为多线程程序增加锁,那么您可能想扩展 refcountedstruct,使它同样包含一个指向某个在释放内存之前要调用的函数的指针(类似于面向对象语言中的析构函数 —— 如果您的结构中包含这些指针,那么这是 必需的)。 当使用 REF 和 UNREF 时,您需要遵守这些指针的分配规则: UNREF 分配前左端指针(left-hand-side pointer)指向的值。 REF 分配后左端指针(left-hand-side pointer)指向的值。 在传递使用引用计数的结构的函数中,函数需要遵循以下这些规则: 在函数的起始处 REF 每一个指针。 在函数的结束处 UNREF 第一个指针。 以下是一个使用引用计数的生动的代码示例: 清单 10. 使用引用计数的示例 /* EXAMPLES OF USAGE */ /* Data type to be refcounted */ struct mydata { int refcount; /* same as refcountedstruct */ int datafield1; /* Fields specific to this struct */ int datafield2; /* other declarations would go here as appropriate */ }; /* Use the functions in code */ void dosomething(struct mydata *data) { REF(data); /* Process data */ /* when we are through */ UNREF(data); } struct mydata *globalvar1; /* Note that in this one, we don't decrease the * refcount since we are maintaining the reference * past the end of the function call through the * global variable */ void storesomething(struct mydata *data) { REF(data); /* passed as a parameter */ globalvar1 = data; REF(data); /* ref because of Assignment */ UNREF(data); /* Function finished */ } 由于引用计数是如此简单,大部分程序员都自已去实现它,而不是使用库。不过,它们依赖于 malloc 和 free 等低层的分配程序来实际地分配和释放它们的内存。 在 Perl 等高级语言中,进行内存管理时使用引用计数非常广泛。在这些语言中,引用计数由语言自动地处理,所以您根本不必担心它,除非要编写扩展模块。由于所有内容都必须进行引用计数,所以这会对速度产生一些影响,但它极大地提高了编程的安全性和方便性。以下是引用计数的益处: 实现简单。 易于使用。 由于引用是数据结构的一部分,所以它有一个好的缓存位置。 不过,它也有其不足之处: 要求您永远不要忘记调用引用计数函数。 无法释放作为循环数据结构的一部分的结构。 减缓几乎每一个指针的分配。 尽管所使用的对象采用了引用计数,但是当使用异常处理(比如 try 或 setjmp()/ longjmp())时,您必须采取其他方法。 需要额外的内存来处理引用。 引用计数占用了结构中的第一个位置,在大部分机器中最快可以访问到的就是这个位置。 在多线程环境中更慢也更难以使用。 C++ 可以通过使用 智能指针(smart pointers)来容忍程序员所犯的一些错误,智能指针可以为您处理引用计数等指针处理细节。不过,如果不得不使用任何先前的不能处理智能指针的代码(比如对 C 库的联接),实际上,使用它们的后果通实比不使用它们更为困难和复杂。因此,它通常只是有益于纯 C++ 项目。如果您想使用智能指针,那么您实在应该去阅读 Alexandrescu 撰写的 Modern C++ Design 一书中的“Smart Pointers”那一章。 内存池 内存池是另一种半自动内存管理方法。内存池帮助某些程序进行自动内存管理,这些程序会经历一些特定的阶段,而且每个阶段中都有分配给进程的特定阶段的内存。例如,很多网络服务器进程都会分配很多针对每个连接的内存 —— 内存的最大生存期限为当前连接的存在期。Apache 使用了池式内存(pooled memory),将其连接拆分为各个阶段,每个阶段都有自己的内存池。在结束每个阶段时,会一次释放所有内存。 在池式内存管理中,每次内存分配都会指定内存池,从中分配内存。每个内存池都有不同的生存期限。在 Apache 中,有一个持续时间为服务器存在期的内存池,还有一个持续时间为连接的存在期的内存池,以及一个持续时间为请求的存在期的池,另外还有其他一些内存池。因此,如果我的一系列函数不会生成比连接持续时间更长的数据,那么我就可以完全从连接池中分配内存,并知道在连接结束时,这些内存会被自动释放。另外,有一些实现允许注册 清除函数(cleanup functions),在清除内存池之前,恰好可以调用它,来完成在内存被清理前需要完成的其他所有任务(类似于面向对象中的析构函数)。 要在自己的程序中使用池,您既可以使用 GNU libc 的 obstack 实现,也可以使用 Apache 的 Apache Portable Runtime。GNU obstack 的好处在于,基于 GNU 的 Linux 发行版本中默认会包括它们。Apache Portable Runtime 的好处在于它有很多其他工具,可以处理编写多平台服务器软件所有方面的事情。要深入了解 GNU obstack 和 Apache 的池式内存实现,请参阅 参考资料部分中指向这些实现的文档的链接。 下面的假想代码列表展示了如何使用 obstack: 清单 11. obstack 的示例代码 #include <obstack.h> #include <stdlib.h> /* Example code listing for using obstacks */ /* Used for obstack macros (xmalloc is a malloc function that exits if memory is exhausted */ #define obstack_chunk_alloc xmalloc #define obstack_chunk_free free /* Pools */ /* Only permanent allocations should go in this pool */ struct obstack *global_pool; /* This pool is for per-connection data */ struct obstack *connection_pool; /* This pool is for per-request data */ struct obstack *request_pool; void allocation_failed() { exit(1); } int main() { /* Initialize Pools */ global_pool = (struct obstack *) xmalloc (sizeof (struct obstack)); obstack_init(global_pool); connection_pool = (struct obstack *) xmalloc (sizeof (struct obstack)); obstack_init(connection_pool); request_pool = (struct obstack *) xmalloc (sizeof (struct obstack)); obstack_init(request_pool); /* Set the error handling function */ obstack_alloc_failed_handler = &allocation_failed; /* Server main loop */ while(1) { wait_for_connection(); /* We are in a connection */ while(more_requests_available()) { /* Handle request */ handle_request(); /* Free all of the memory allocated * in the request pool */ obstack_free(request_pool, NULL); } /* We're finished with the connection, time * to free that pool */ obstack_free(connection_pool, NULL); } } int handle_request() { /* Be sure that all object allocations are allocated * from the request pool */ int bytes_i_need = 400; void *data1 = obstack_alloc(request_pool, bytes_i_need); /* Do stuff to process the request */ /* return */ return 0; } 基本上,在操作的每一个主要阶段结束之后,这个阶段的 obstack 会被释放。不过,要注意的是,如果一个过程需要分配持续时间比当前阶段更长的内存,那么它也可以使用更长期限的 obstack,比如连接或者全局内存。传递给 obstack_free() 的 NULL 指出它应该释放 obstack 的全部内容。可以用其他的值,但是它们通常不怎么实用。 使用池式内存分配的益处如下所示: 应用程序可以简单地管理内存。 内存分配和回收更快,因为每次都是在一个池中完成的。分配可以在 O(1) 时间内完成,释放内存池所需时间也差不多(实际上是 O(n) 时间,不过在大部分情况下会除以一个大的因数,使其变成 O(1))。 可以预先分配错误处理池(Error-handling pools),以便程序在常规内存被耗尽时仍可以恢复。 有非常易于使用的标准实现。 池式内存的缺点是: 内存池只适用于操作可以分阶段的程序。 内存池通常不能与第三方库很好地合作。 如果程序的结构发生变化,则不得不修改内存池,这可能会导致内存管理系统的重新设计。 您必须记住需要从哪个池进行分配。另外,如果在这里出错,就很难捕获该内存池。 回页首 垃圾收集 垃圾收集(Garbage collection)是全自动地检测并移除不再使用的数据对象。垃圾收集器通常会在当可用内存减少到少于一个具体的阈值时运行。通常,它们以程序所知的可用的一组“基本”数据 —— 栈数据、全局变量、寄存器 —— 作为出发点。然后它们尝试去追踪通过这些数据连接到每一块数据。收集器找到的都是有用的数据;它没有找到的就是垃圾,可以被销毁并重新使用这些无用的数据。为了有效地管理内存,很多类型的垃圾收集器都需要知道数据结构内部指针的规划,所以,为了正确运行垃圾收集器,它们必须是语言本身的一部分。 收集器的类型 复制(copying): 这些收集器将内存存储器分为两部分,只允许数据驻留在其中一部分上。它们定时地从“基本”的元素开始将数据从一部分复制到另一部分。内存新近被占用的部分现在成为活动的,另一部分上的所有内容都认为是垃圾。另外,当进行这项复制操作时,所有指针都必须被更新为指向每个内存条目的新位置。因此,为使用这种垃圾收集方法,垃圾收集器必须与编程语言集成在一起。 标记并清理(Mark and sweep):每一块数据都被加上一个标签。不定期的,所有标签都被设置为 0,收集器从“基本”的元素开始遍历数据。当它遇到内存时,就将标签标记为 1。最后没有被标记为 1 的所有内容都认为是垃圾,以后分配内存时会重新使用它们。 增量的(Incremental):增量垃圾收集器不需要遍历全部数据对象。因为在收集期间的突然等待,也因为与访问所有当前数据相关的缓存问题(所有内容都不得不被页入(page-in)),遍历所有内存会引发问题。增量收集器避免了这些问题。 保守的(Conservative):保守的垃圾收集器在管理内存时不需要知道与数据结构相关的任何信息。它们只查看所有数据类型,并假定它们 可以全部都是指针。所以,如果一个字节序列可以是一个指向一块被分配的内存的指针,那么收集器就将其标记为正在被引用。有时没有被引用的内存会被收集,这样会引发问题,例如,如果一个整数域中包含一个值,该值是已分配内存的地址。不过,这种情况极少发生,而且它只会浪费少量内存。保守的收集器的优势是,它们可以与任何编程语言相集成。 Hans Boehm 的保守垃圾收集器是可用的最流行的垃圾收集器之一,因为它是免费的,而且既是保守的又是增量的,可以使用 --enable-redirect-malloc 选项来构建它,并且可以将它用作系统分配程序的简易替代者(drop-in replacement)(用 malloc/ free 代替它自己的 API)。实际上,如果这样做,您就可以使用与我们在示例分配程序中所使用的相同的 LD_PRELOAD 技巧,在系统上的几乎任何程序中启用垃圾收集。如果您怀疑某个程序正在泄漏内存,那么您可以使用这个垃圾收集器来控制进程。在早期,当 Mozilla 严重地泄漏内存时,很多人在其中使用了这项技术。这种垃圾收集器既可以在 Windows® 下运行,也可以在 UNIX 下运行。 垃圾收集的一些优点: 您永远不必担心内存的双重释放或者对象的生命周期。 使用某些收集器,您可以使用与常规分配相同的 API。 其缺点包括: 使用大部分收集器时,您都无法干涉何时释放内存。 在多数情况下,垃圾收集比其他形式的内存管理更慢。 垃圾收集错误引发的缺陷难于调试。 如果您忘记将不再使用的指针设置为 null,那么仍然会有内存泄漏。 回页首 结束语 一切都需要折衷:性能、易用、易于实现、支持线程的能力等,这里只列出了其中的一些。为了满足项目的要求,有很多内存管理模式可以供您使用。每种模式都有大量的实现,各有其优缺点。对很多项目来说,使用编程环境默认的技术就足够了,不过,当您的项目有特殊的需要时,了解可用的选择将会有帮助。下表对比了本文中涉及的内存管理策略。 表 1. 内存分配策略的对比 策略 分配速度 回收速度 局部缓存 易用性 通用性 实时可用 SMP 线程友好 定制分配程序 取决于实现 取决于实现 取决于实现 很难 无 取决于实现 取决于实现 简单分配程序 内存使用少时较快 很快 差 容易 高 否 否 GNU malloc 中 快 中 容易 高 否 中 Hoard 中 中 中 容易 高 否 是 引用计数 N/A N/A 非常好 中 中 是(取决于 malloc 实现) 取决于实现 池 中 非常快 极好 中 中 是(取决于 malloc 实现) 取决于实现 垃圾收集 中(进行收集时慢) 中 差 中 中 否 几乎不 增量垃圾收集 中 中 中 中 中 否 几乎不 增量保守垃圾收集 中 中 中 容易 高 否 几乎不 参考资料 您可以参阅本文在 developerWorks 全球站点上的 英文原文。 Web 上的文档 GNU C Library 手册的 obstacks 部分 提供了 obstacks 编程接口。 Apache Portable Runtime 文档 描述了它们的池式分配程序的接口。 基本的分配程序 Doug Lea 的 Malloc 是最流行的内存分配程序之一。 BSD Malloc 用于大部分基于 BSD 的系统中。 ptmalloc 起源于 Doug Lea 的 malloc,用于 GLIBC 之中。 Hoard 是一个为多线程应用程序优化的 malloc 实现。 GNU Memory-Mapped Malloc(GDB 的组成部分) 是一个基于 mmap() 的 malloc 实现。 池式分配程序 GNU Obstacks(GNU Libc 的组成部分)是安装最多的池式分配程序,因为在每一个基于 glibc 的系统中都有它。 Apache 的池式分配程序(Apache Portable Runtime 中) 是应用最为广泛的池式分配程序。 Squid 有其自己的池式分配程序。 NetBSD 也有其自己的池式分配程序。 talloc 是一个池式分配程序,是 Samba 的组成部分。 智能指针和定制分配程序 Loki C++ Library 有很多为 C++ 实现的通用模式,包括智能指针和一个定制的小对象分配程序。 垃圾收集器 Hahns Boehm Conservative Garbage Collector 是最流行的开源垃圾收集器,它可以用于常规的 C/C++ 程序。 关于现代操作系统中的虚拟内存的文章 Marshall Kirk McKusick 和 Michael J. Karels 合著的 A New Virtual Memory Implementation for Berkeley UNIX 讨论了 BSD 的 VM 系统。 Mel Gorman's Linux VM Documentation 讨论了 Linux VM 系统。 关于 malloc 的文章 Poul-Henning Kamp 撰写的 Malloc in Modern Virtual Memory Environments 讨论的是 malloc 以及它如何与 BSD 虚拟内存交互。 Berger、McKinley、Blumofe 和 Wilson 合著的 Hoard -- a Scalable Memory Allocator for Multithreaded Environments 讨论了 Hoard 分配程序的实现。 Marshall Kirk McKusick 和 Michael J. Karels 合著的 Design of a General Purpose Memory Allocator for the 4.3BSD UNIX Kernel 讨论了内核级的分配程序。 Doug Lea 撰写的 A Memory Allocator 给出了一个关于设计和实现分配程序的概述,其中包括设计选择与折衷。 Emery D. Berger 撰写的 Memory Management for High-Performance Applications 讨论的是定制内存管理以及它如何影响高性能应用程序。 关于定制分配程序的文章 Doug Lea 撰写的 Some Storage Management Techniques for Container Classes 描述的是为 C++ 类编写定制分配程序。 Berger、Zorn 和 McKinley 合著的 Composing High-Performance Memory Allocators 讨论了如何编写定制分配程序来加快具体工作的速度。 Berger、Zorn 和 McKinley 合著的 Reconsidering Custom Memory Allocation 再次提及了定制分配的主题,看是否真正值得为其费心。 关于垃圾收集的文章 Paul R. Wilson 撰写的 Uniprocessor Garbage Collection Techniques 给出了垃圾收集的一个基本概述。 Benjamin Zorn 撰写的 The Measured Cost of Garbage Collection 给出了关于垃圾收集和性能的硬数据(hard data)。 Hans-Juergen Boehm 撰写的 Memory Allocation Myths and Half-Truths 给出了关于垃圾收集的神话(myths)。 Hans-Juergen Boehm 撰写的 Space Efficient Conservative Garbage Collection 是一篇描述他的用于 C/C++ 的垃圾收集器的文章。 Web 上的通用参考资料 内存管理参考 中有很多关于内存管理参考资料和技术文章的链接。 关于内存管理和内存层级的 OOPS Group Papers 是非常好的一组关于此主题的技术文章。 C++ 中的内存管理讨论的是为 C++ 编写定制的分配程序。 Programming Alternatives: Memory Management 讨论了程序员进行内存管理时的一些选择。 垃圾收集 FAQ 讨论了关于垃圾收集您需要了解的所有内容。 Richard Jones 的 Garbage Collection Bibliography 有指向任何您想要的关于垃圾收集的文章的链接。 书籍 Michael Daconta 撰写的 C++ Pointers and Dynamic Memory Management 介绍了关于内存管理的很多技术。 Frantisek Franek 撰写的 Memory as a Programming Concept in C and C++ 讨论了有效使用内存的技术与工具,并给出了在计算机编程中应当引起注意的内存相关错误的角色。 Richard Jones 和 Rafael Lins 合著的 Garbage Collection: Algorithms for Automatic Dynamic Memory Management 描述了当前使用的最常见的垃圾收集算法。 在 Donald Knuth 撰写的 The Art of Computer Programming 第 1 卷 Fundamental Algorithms 的第 2.5 节“Dynamic Storage Allocation”中,描述了实现基本的分配程序的一些技术。 在 Donald Knuth 撰写的 The Art of Computer Programming 第 1 卷 Fundamental Algorithms 的第 2.3.5 节“Lists and Garbage Collection”中,讨论了用于列表的垃圾收集算法。 Andrei Alexandrescu 撰写的 Modern C++ Design 第 4 章“Small Object Allocation”描述了一个比 C++ 标准分配程序效率高得多的一个高速小对象分配程序。 Andrei Alexandrescu 撰写的 Modern C++ Design 第 7 章“Smart Pointers”描述了在 C++ 中智能指针的实现。 Jonathan 撰写的 Programming from the Ground Up 第 8 章“Intermediate Memory Topics”中有本文使用的简单分配程序的一个汇编语言版本。 来自 developerWorks 自我管理数据缓冲区内存 (developerWorks,2004 年 1 月)略述了一个用于管理内存的自管理的抽象数据缓存器的伪 C (pseudo-C)实现。 A framework for the user defined malloc replacement feature (developerWorks,2002 年 2 月)展示了如何利用 AIX 中的一个工具,使用自己设计的内存子系统取代原有的内存子系统。 掌握 Linux 调试技术 (developerWorks,2002 年 8 月)描述了可以使用调试方法的 4 种不同情形:段错误、内存溢出、内存泄漏和挂起。 在 处理 Java 程序中的内存漏洞 (developerWorks,2001 年 2 月)中,了解导致 Java 内存泄漏的原因,以及何时需要考虑它们。 在 developerWorks Linux 专区中,可以找到更多为 Linux 开发人员准备的参考资料。 从 developerWorks 的 Speed-start your Linux app 专区中,可以下载运行于 Linux 之上的 IBM 中间件产品的免费测试版本,其中包括 WebSphere® Studio Application Developer、WebSphere Application Server、DB2® Universal Database、Tivoli® Access Manager 和 Tivoli Directory Server,查找 how-to 文章和技术支持。 通过参与 developerWorks blogs 加入到 developerWorks 社区。 可以在 Developer Bookstore Linux 专栏中定购 打折出售的 Linux 书籍。 关于作者 Jonathan Bartlett 是 Programming from the Ground Up 一书的作者,这本书介绍的是 Linux 汇编语言编程。Jonathan Bartlett 是 New Media Worx 的总开发师,负责为客户开发 Web、视频、kiosk 和桌面应用程序。您可以通过 johnnyb@eskimo.com 与 Jonathan 联系。5 3205浏览会员免费
- MS12-020大小:140KBMS12-020 PoC RDP MS , ms12-020 for exe版本 ms12-020,下载,exp,0day ms12-020.exe 3389远程溢出0DAYMS12-020 PoC RDP MS , ms12-020 for exe版本 ms12-020,下载,exp,0day ms12-020.exe 3389远程溢出0DAY4 346浏览会员免费