关于作者

用户名:zzzevazzz
笔名:zzzevazzz
地区: 浙江-杭州
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



Security

Program

Other

Blog

访问统计:
文章个数:24
评论个数:88
留言条数:34




Powered by BlogDriver 2.1

EVA的回收站

 

目的:把点滴想法都扔进回收站保存,以便多年后看清自己的成长轨迹。

内容:基本上是网络安全方面,只原创不转载。

文章

又到年终总结的时候了

    又到年终总结的时候了。去年一年只更新了两次Blog,实在是有违“记录点滴想法”的初衷呢。一年的时间里我的精力完全放在工作上,即便是业余时间也有一半的心思在思考工作上的问题,最后剩下的一点时间则花在卡通、漫画和电子小说上了。虽然在工作中得到了不少关于安全和Win内核的“想法”,但我无法轻易地将这些与大家共享。因为我发现安全环境的可靠度在某种意义上依赖的是“无知”。比如0DAY,当漏洞没有被发现或没有在补丁发布前被公开,那么大家是安全的,反之则蠕虫、病毒、木马流行。虽然我那些“想法”无法与0DAY的杀伤力媲美,而且刀可以杀人也可以救人,但如今这个资讯发达的年代,坏事总是传千里,破坏总比建设容易。

    我知道,草原上维持适当数量的狼对羊群是有好处的。黑客们每天都在发现安全漏洞,尝试入侵Internet的每个角落,但世界并没有变得更糟,而是更安全了。因此,除去前面说的冠冕堂皇的理由,让“想法”留在自己脑中的另一个原因是,我要靠它们混口饭吃。

    在安全行业混了一段时间后,我有两点体会:一是搞安全(或做黑客)拼的是灵感、创意。这一点我早就意识到了,这也是我最初对黑客技术产生浓厚兴趣的原因,现在我更确定这一点了。二是国内的安全产品(特别是软件)普遍缺乏核心技术。AV、防火墙、“防水墙”等传统的安全产品就不用说了,最近热门起来的电子文档保护产品也充斥着夸夸其谈、技术雷同等问题。要么是把机密文档转换为私有格式,完全把用户体验丢在一边(专用编辑器做的再好,能好过Word?)。要么是拿“驱动级透明加解密”当尚方宝剑,自以为所向无敌,结果连个线程插入读文件都对付不了。

    在我看来,缺乏核心技术的原因并不是技术实力差,而是产品设计思想落后。比如“透明加解密”,几乎所有人都认为,用文件系统过滤驱动来实现通用性好,效率高,安全性自然也强。事实上,他们忽略了一个朴素的道理——加密要尽可能早,解密要尽可能晚。也就是说,当应用程序产生机密数据的时候就应该加密它,直到应用程序需要使用数据的前一刻才解密它。这样才最大程度的降低了机密信息被截取的可能。一味地追求底层,恰恰和这种原则背道而驰(现在是要保护文档,不是写rootkit啊)。

    相比之下,国外的文档保护产品要好一点。特别是起步较早的韩国,几款产品水准较高(产品名字我就不说了,免得成为免费广告)。

    介于国内文档保护产品的保护措施普遍薄弱的现状,我还是让我的那些“想法”烂在肚子里吧。希望明年的这个时候,我可以一吐为快。呵呵。

- 作者: zzzevazzz 2007年01月3日, 星期三 23:12  回复(24) |  引用(0) 加入博采

一个反键盘记录工具的分析

(下面的文字本是我在某个论坛的回贴,后来发现跑题了,食之无味弃之可惜,于是转贴到这里)

除了nProtect,国外还有一些反键盘记录工具,比如下面这个还不错:
http://www.anti-keyloggers.com/

是个通用型的,与QQ的nProtect专门用于保护密码不同。
而且反破解做的不错(对我这种破解外行而言,呵呵)。

它的原理我简单的说一下,就是替换键盘类驱动的KeyboardClassServiceCallback,然后把得到的ScanCode传递到用户态,由位于Winlogon.exe的一个线程负责调用NtUserSendInput,将按键消息发给当前焦点窗口。

应该说这款反键盘工具的设计思想是很先进的:
1,选用KeyboardClassServiceCallback的好处是,比键盘过滤驱动更底层,对PS/2或USB键盘通用。
2,用Winlogon转发消息的好处是,自动适应多用户(session)的情况。
3,用NtUserSendInput的好处是,不会被Windows消息钩子挂钩。
4,虽然它没有构建起完全独立的键盘输入通道(这么做太复杂,兼容性不好),但对于没有重建的部分,通过检测钩子的方式弥补。

它的钩子检测功能对于用户态不错,遗憾的是,居然漏掉了中断服务挂钩的检测,实在是个大疏忽。另外,作为通用型保护机制,不可避免的具有一些局限性,比如无法防御用窗口子类化来做键盘记录。

还有一款产品:

http://www.anti-keylogger.net/

以后有空再看看,呵呵。

- 作者: zzzevazzz 2007年01月3日, 星期三 21:22  回复(8) |  引用(0) 加入博采

Any2Bat.vbs

一个把任何文件转成批处理的脚本。
用Base64编码数据,好处是压缩了大小(相对bin2str而言),缺点是增加处理时间和脚本复杂度。
由于效率瓶颈是在bat生成vbs这一步,所以总的来说还是合算了。
写文件用ADODB.Recordset,比debug好使多了。
大部分事都是脚本做的,批处理只是用echo来生成脚本而已。
echo版的好处是,全选复制粘贴到cmd shell里就把文件上传了。

下面是代码。版面限制,排版有点乱:(

'Any2Bat.vbs by zzzEVAzzz
on error resume next
set arg=wscript.arguments
if arg.count=0 then wscript.quit
with CreateObject("ADODB.Stream")
.type=1:.open:.loadfromfile arg(0):bs=.read:l=.size:.close
end with
if err.number<>0 then wscript.quit
set fso=CreateObject("Scripting.FileSystemObject")
with fso.opentextfile(arg(0)&".bat",2,true)
if err.number<>0 then wscript.quit
.writeline "@echo bs=_>xx.vbs"
for k=1 to l step 129
.write "@echo """
.write b64b(midb(bs,k,129))
.writeline """+_>>xx.vbs"
next
.writeline "@echo """":set rs=CreateObject(""ADODB.Recordset"")>>xx.vbs"
.writeline "@echo set ado=CreateObject(""ADODB.Stream"")>>xx.vbs"
.writeline "@echo l=len(bs):ss="""":for k=1 to l step 4096:ss=ss+ub64(mid(bs,k,4096)):next:l=len(ss)>>xx.vbs"
.writeline "@echo rs.fields.append ""b"",205,l/2:rs.open:rs.addnew:rs(""b"")=ss+chrb(0):rs.update>>xx.vbs"
.writeline "@echo ado.mode=3:ado.type=1:ado.open:ado.write rs(""b"").getchunk(l/2)>>xx.vbs"
.writeline "@echo ado.savetofile """+fso.getfilename(arg(0))+""",2:ado.close>>xx.vbs"
.writeline "@echo function ub64(s):dim t(4),b(3):ub64="""":n=len(s):r=2 >>xx.vbs"
.writeline "@echo if n mod 4^<^>0 then exit function:end if:for i=1 to n step 4:for j=0 to 3 >>xx.vbs"
.writeline "@echo a=asc(mid(s,i+j,1)):if a=43 then:a=62:else if a=47 then:a=63:else if a^>47 and a^<58 then:_>>xx.vbs"
.writeline "@echo a=a+4:else if a=61 then:a=0:if r=2 then r=j-2:end if:else if a^>64 and a^<91 then:_>>xx.vbs"
.writeline "@echo a=a-65:else if a^>96 and a^<123 then:a=a-71:else:exit function:_>>xx.vbs"
.writeline "@echo end if:end if:end if:end if:end if:end if:t(j)=a:next>>xx.vbs"
.writeline "@echo b(0)=t(0)+t(1)*64 mod 256:b(1)=t(1)\4+t(2)*16 mod 256:b(2)=t(2)\16+t(3)*4 >>xx.vbs"
.writeline "@echo for j=0 to r:if b(j)^<16 then ub64=ub64+""0"":end if:ub64=ub64+hex(b(j))>>xx.vbs"
.writeline "@echo next:next:end function>>xx.vbs&&cscript.exe //nologo xx.vbs&del xx.vbs"
end with

const b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
function b64b(bin)
b64b=""
n=lenb(bin)
for i=1 to n step 3
   a=ascb(midb(bin,i,1))
   b64b=b64b+mid(b64,a mod 64+1,1)
   if i<n then
      b=ascb(midb(bin,i+1,1))
      b64b=b64b+mid(b64,(a\64+b*4)mod 64+1,1)
      if i+1<n then
         c=ascb(midb(bin,i+2,1))
         b64b=b64b+mid(b64,(b\16+c*16)mod 64+1,1)
         b64b=b64b+mid(b64,c\4+1,1)
      else
         b64b=b64b+mid(b64,b\16+1,1)
         b64b=b64b+"="
      end if
   else
      b64b=b64b+mid(b64,a\64+1,1)
      b64b=b64b+"=="
   end if
next
end function

function ub64(str)
dim t(4),b(3)
ub64=""
n=len(str)
r=2
if n mod 4<>0 then exit function
for i=1 to n step 4
   for j=0 to 3
      a=asc(mid(str,i+j,1))
      if a=43 then
         a=62
      elseif a=47 then
         a=63
      elseif a>47 and a<58 then
         a=a+4
      elseif a=61 then
         a=0
         if r=2 then r=j-2
      elseif a>64 and a<91 then
         a=a-65
      elseif a>96 and a<123 then
         a=a-71
      else
         exit function
      end if
      t(j)=a
   next
   b(0)=t(0)+t(1)*64 mod 256
   b(1)=t(1)\4+t(2)*16 mod 256
   b(2)=t(2)\16+t(3)*4
   for j=0 to r
      if b(j)<16 then ub64=ub64+"0"
      ub64=ub64+hex(b(j))
   next
next
end function

用法很简单,就一个参数——要转换的文件全路径。
也可以直接拖放文件到这个vbs的图标上。

- 作者: zzzevazzz 2006年11月30日, 星期四 18:22  回复(5) |  引用(0) 加入博采

评所谓的“主动防御软件”

真是好久没更新Blog了-_- 发一个我在EST论坛的回帖(第48楼)

原贴位置:http://forum.eviloctal.com/read-htm-tid-15522.html

   

    所谓的主动防御技术,目的是解决“病毒总是出现在杀毒软件更新病毒特征码之前”这个问题,但是,应用主动防御之后,仍然是杀毒软件在明,病毒/木马在暗。病毒/木马制作者可以在自己的电脑上安装一套所谓的主动防御软件,然后慢慢研究,不用费多少时间,无法“主动防御”的病毒/木马就会诞生。所以,说主动防御能解决AV软件杀毒能力滞后的问题,只是一种炒作。据我所知,主动防御或行为检测的概念,在DOS时代就有了,只是没有明确提出来而已。国内的AV要么是买国外的引擎(以至于没有版权,不能深入开发,甚至不能修正bug),要么烂得可以。只好搞点“新概念”吸引眼球,特别是在市场已经被瓜分完毕,新的AV想分杯羹的情况。我前段时间见到一个据说是国内最早(比江民早)搞AV的人,在他看来,国内的查杀毒技术,10几年来就没有大的进步,搞来搞去就那一套。

    主动防御依赖于行为检测,即所谓的“病毒行为动作特征库”。显然,这个行为特征库也存在信息滞后问题。比如对于木马修改注册表实现自启动这类行为,正常与否取决于注册表键值,没有一劳永逸的办法,只能是知道一个识别一个。大家可能都用过hijackThis或Autoruns,它们能列出系统中各种能实现自启动的地方,尤其是注册表特别多。随版本的升级,自启动项还在不多增加。再比如,我在《深入挖掘Windows脚本技术》中提到的WMI永久事件,这也是自启动,不知道现在市面上的AV有没有检测这个行为的。群众的创造力是无限的,再举个极端的例子,ACPI是可编程的,仍然写在注册表中(HKEY_LOCAL_MACHINE\HARDWARE\ACPI),有AV想到了吗?还有,写个dll取名和系统常用dll一样,导出的函数也一样,放在WINNT目录,当explorer.exe启动时,先加载的是这个Trojan Dll。有AV管这个吗?仅仅一个自启动,行为就层出不穷,再来个文件感染行为呢?

    如果说,从病毒特征值检测到行为检测,一定程度上减少了“特征库”更新的频率,这是个进步。那么另一方面,误报率恐怕反而会增加。仔细想想就会知道,“擦边球”实在太多了。比如金山词霸(消息钩子、远程线程),Serv-U(安装服务),SoftIce和VMWare(安装驱动),BT和eMule(修改防火墙规则)等等。当然,AV会采取加权方式,只有行为的权值累积到某个阈值才报警。再复杂点的算法是把行为分组,一些普通的行为连贯起来就有了权值。这类方案算不上创新,任谁来设计都能想到。且不论该方案本身的复杂度,即使实现了,离“智能”还差得远着呢。当行为检测碰上QQ——自启动、安装驱动、监听端口、文件传输、屏幕截图、远程控制、安装IE插件、弹出广告,这么多“恶意行为”集中在一个程序里,是木马吗??我开发安全产品的经验告诉我,控制粒度越精细,例外越多。QQ特例处理了,MSN呢?Skype呢?3721算不算木马?yahoo助手、网易泡泡,IE插件何其多。假设AV记录某个程序的各种行为,列成一张表,隐去文件名等信息后,交给“专家”来判断,能确定该程序是否木马吗?我看难说得很。人做不了的事,程序更搞不定了。

    最后,我统计了一下我的电脑(刚安装不久)上Program File下的30个软件,一半以上具有至少一个“恶意行为”,1/3具有两个或两个以上“恶意行为”。从概率上说,全世界有1/3的程序可能被拦截并提示用户,行为拦截机制多数情况在制造麻烦。要知道,多数AV用户是不熟悉计算机的,别指望拦截行为后给出提示,交给用户判断,就能“明辨是非”。而且,不是由用户自己装的就一定是正常的软件,也许是文件捆绑、伪装、欺骗用户执行,或者漏洞溢出执行,或者黑客入侵并像正常用户一般执行程序。当然,这种问题稍稍超出主动防御的范畴了。

    总之,我认为目前的主动防御技术,仅仅是原有技术的补充(很多AV已经这么做了),再往多的说就是炒作了。

- 作者: zzzevazzz 2006年04月25日, 星期二 11:28  回复(9) |  引用(0) 加入博采

又是一年春来到
    过去的一年,我的生活经历很大转变。从象牙塔走入社会,我感触很多,学到了很多,也成长了很多。这一年我过得很充实,充实得都没时间更新Blog^_^。今年是个暖冬,没有下雪。回首去年元旦,雪夜,我在寝室上网写Blog,心情与现在相比,就像那天气一样,冷暖分明。人生真是充满了机遇和挑战,就看你能否抓得住、扛得住。在此,我要感谢所有帮助支持我的人,祝你们,也祝自己,新年新气象,狗年旺旺旺!

- 作者: zzzevazzz 2006年01月29日, 星期日 01:59  回复(0) |  引用(0) 加入博采

给Blog换了个皮肤
    默认的模板没几个看得顺眼的,而且都看腻了,所以决定自己搞一个出来玩玩。可惜艺术细胞实在太少,只好抄milw0rm.com的,哈哈。不知道各位感觉如何。

    BTW, 由于广告泛滥,所以暂时关闭匿名评论。若有话说,请用“在线留言”。

- 作者: zzzevazzz 2005年11月23日, 星期三 00:27  回复(0) |  引用(0) 加入博采

破解QQ2005Beta3的“键盘加密保护技术”

  今天升级QQ,发现登陆界面的软键盘没有了,取而代之的是一个带金锁图标的密码框。试了两个键盘记录工具,原理分别是GetAsyncKeyState和键盘类过滤驱动,发现无效,恩,有点意思,正好用来打发时间。
  先看腾讯是怎么吹的:“QQ2005 Beta3采用了国际先进的nProtect键盘加密保护技术,能最大限度地防止用户的密码输入不被病毒、键盘记录程序所窃取,大大提高了QQ用户的帐号安全性。”
  nProtect是什么?从来没听过。还是老老实实看代码吧。既然能对付驱动级的嗅探,显然也用了驱动。对比QQ启动前后的驱动列表,很容易就定位到npkcrypt.sys。光凭这一点就让我不看好这个功能,这么容易就找到研究目标,设计者的反破解意识实在不怎么样。把驱动改名,重启系统,然后保护功能就失效了!当然,事情可没这么简单,因为这时那把金锁上多了个“禁用”图标,提醒用户保护功能已失效。
  明的不行就来暗的——代码级破解。首先看导入函数,用到了IoAttachDeviceToDeviceStack,似乎走的还是设备栈的老路。于是祭出WinDbg查看KeyboardClass0/1的设备栈,居然没有异常,那八成就是挂键盘中断了,导入的函数HalGetInterruptVector就是用来干这个的。列出所有中断向量(WinDbg没有类似SoftICE的idt命令,不爽的很),一眼就发现n个80开头的地址中有个f7开头的,哈,就是它。
  再次重启系统,先列出原先的IDT,启动QQ后还原被修改的条目,然后尝试键盘记录,无效。再看IDT,靠,又被改回去了!在这个中断向量的地址上设内存读写断点,只断到了读操作,却没有写操作。但明明就被改回去了啊。郁闷了一分钟之后,我开始看驱动的反汇编代码。从被断到的读操作开始跟踪,我发现读到的值被保存在全局变量里,而所有对这个变量的操作中,几乎都是赋值,只有一个cmp指令,比较保存的值和读取的值,如果不同就关中断,然后修改成QQ自己的中断服务地址(难怪断不到,关中断了嘛)。
  到这里问题就算解决了,把紧随cmp之后的jz改为jnz,中断向量再也不会被改回去啦,键盘记录(不管是哪种)当然也有效了,金锁还是老样子。所谓的“国际先进技术”原来只是从DOS时代就被大玩特玩的中断挂钩,钩住键盘中断后直接把ScanCode传给应用程序。如果QQ能绕过Windows的中断映射机制,控制PIC或APIC重新映射键盘中断,那还有点看头。(一个聊天工具而已,至于吗?)当然至于,因为她也许是世界上使用人数最多的聊天工具啊。
  详细的破解过程就不说了(我只是打发时间,不是存心和腾讯过不去哦),只说说一字节补丁的位置:npkcrypt.sys驱动模块(文件版本2005.6.22.1,大小20,386字节)加载基址偏移0x14b3,从0x74(jz)改为0x75(jnz),当然键盘中断向量也要还原。还有一种改法更简单,直接在QQ的键盘中断服务入口添加跳转指令,跳回到原服务地址。注意,这些都只是内存补丁,文件补丁比较麻烦,QQ似乎会在加载驱动前先对文件做校验。这就不是我所感兴趣的了,闪人。

      2005-11-29 补充: QQ密码输入框失去键盘焦点后,会还原中断向量。再次得到焦点时,又会修改IDT。这个修改不判断原中断向量,与前文说的jz指令无关。具体代码位置是基址偏移0x1e06(cli)至0x1e26(sti)这一段。用jmp指令跳过这段代码,IDT终于不会再被改了。实际破解时,还是在QQ的中断服务入口加jmp的办法简便易行。

      2006-01-23 补充:原来WinDbg是有!idt命令的,但自带的帮助文档里没有提到,我只能说——郁闷!

- 作者: zzzevazzz 2005年10月29日, 星期六 01:13  回复(11) |  引用(0) 加入博采

IceSword似乎被研究的差不多了
     驱动开发网上悬赏破解IceSword,重赏之下必有勇夫啊。

    http://bbs.zndev.com/read.php?tid=97320

    http://bbs.zndev.com/read.php?tid=98377

    最让我“吃惊”的是IS列举进程的办法竟然是通过PspCidTable,晕啊。我记得很久以前我写knlps0.4的时候,就在幻影论坛提到过这个办法。这个办法被公开就完全失效了,所以我没有用它来实现knlps0.5。我本以为,IS应该是利用了某些无法被轻易修改的系统数据结构来列举进程。线程调度链表算一种,但IS不是用它。我能想到的就只有在非分页内存里搜索EPROCESS了。其它各种各样的“表”都可以很容易的涂改掉,只要知道是哪张“表”。虽然非分页内存也可以看作一张“表”,但改起来比较麻烦。

    关于IS的反调试,知道谜底了自然觉得没什么大不了的。不过我是个完全不会猜谜的人,所以没猜到也不觉得可惜。既然pjf是挑战赛的裁判,估计IS2.0会有不小的改进吧。希望将来谜底公开的时候,不会让我“不觉得可惜”,呵呵。

    wuyanfeng对IS驱动的分析,没说是什么版本。所以我下载了一个1.12en版,看看有啥变化。反WinDbg调试有点不一样了,以前(1.06)是只在启动的时候判断一次KdDebuggerEnabled,如果非零就调用KdDisableDebugger,现在是不断地检查它。我把KdDisableDebugger入口改成了ret指令,结果调试器不会被断开了,但CPU占用100%。一计不成又生一计,我在KdDebuggerEnabled上设内存读断点,想等IS读的时候,给IS打个“补丁”。结果在调试状态下,总是系统的KeUpdateSystemTime和KdPollBreakIn例程在读取,IS完全没有机会动。两个系统例程读取KdDebuggerEnabled的值后,紧接着是jz和jnz指令,哈,分别改成jnz和jz,再把KdDebuggerEnabled改成0,搞定!建议pjf用关闭调试端口的办法反WinDbg。靠判断KdDebuggerEnabled实在太容易pass了。

    涂改了PspCidTable,发现还是可以隐藏进程,失望ing。

- 作者: zzzevazzz 2005年09月22日, 星期四 02:32  回复(9) |  引用(1) 加入博采

3个月没更新了

近3个月没更新,接下去的3个月恐怕也没时间。虽有千言万语,只能随时间流逝了。

- 作者: zzzevazzz 2005年06月30日, 星期四 03:42  回复(2) |  引用(0) 加入博采

沉痛悼念我的手机

我的Nokia3200于北京时间2005年4月9日11时25分

不慎掉入厕所下水管道

历时90分钟抢救无效(打捞失败)

不幸"光荣牺牲"

享年一岁零34天

在此

我沉痛悼念我的Nokia3200

........................(默哀三秒钟)

追授"EVA一等手机功勋奖章"

!@#$%^&*(奏Nokia开机铃声)

向遗体告别——敬礼

 


- 作者: zzzevazzz 2005年04月9日, 星期六 13:27  回复(13) |  引用(0) 加入博采