How rdp passwords are encrypted

Ever wondered how mstsc saves passwords? If you open an RDP file with a text editor like Notepad you can see the encrypted password. In this article I will show you how to encrypt and decrypt these passwords. Besides password recovery this enables you to create rpd files programmatically or perhaps update the password in many rdp files with a batch file.

So if we save a password with mstsc what does it look like? To see that open an rdp file with a text editor (eg Notepad) and you will see something like this:

screen mode id:i:1 
desktopwidth:i:1280 
desktopheight:i:750 
session bpp:i:24 
winposstr:s:2,3,188,8,1062,721 
full address:s:MyServer 
compression:i:1 
keyboardhook:i:2 
audiomode:i:0 
redirectdrives:i:0 
redirectprinters:i:0 
redirectcomports:i:0 
redirectsmartcards:i:0 
displayconnectionbar:i:1 
autoreconnection enabled:i:1 
username:s:MyUserName 
domain:s:MyDomain 
alternate shell:s: 
shell working directory:s: 
password 51:b:01000000D08C9DDF0115D1118C7A00C04FC297EB0100000052A9E191EA75A948B359790578C9371A0000000008000000700073007700000003660000A8000000100000000A1DCCD2E50775CA25EC3857164B34DC0000000004800000A000000010000000FCE1A645B9B61AA450946BB6F955058108020000D83591CA47562D6DDAA689F050AE145039EBE22E00D1D3AEAA98373C7B63C3E8E7149072DF989EA43EFCE20513AD3D27B11BE7F17066A688E1DCE828AF85460AAC327B38E90776DB962888E4393D19637578984B19A187AAD95F6D2726ADE7DD315FF56C15FF5B3031014EDDCC3C24D1B81779AFDB006EE575F5BEFB8D2D2138D9D9D642BBB251CC5ED7226968764856EC660A646BACE748A13D6002A9A537AA70710615650B9387EED66DE28BD57B304BBDD7B581B943DA628EB0289E30A8BA784B76F7885BECCAB4FEF7820E97EE3C6E036EEAF6EAA669288DF2FCACC9BEC045C907EBBDE87AFB8CC6B07A600BD63AC891B61D95C2265DD9FD5E635D61BFBF5EDC28311375066611C610FB533D64515B643C82F57D9B183B05C156D91BC0974D38E546022B139E82452E6F1EDF76E52F732C3904E5E433F8F3D488DB0698427DBB0791A9F207F8CB6654CB8410BAF4A59C4F9E821E589ABC1E6E6E1D432181B690408F6884FE1007895A4D26D4A5A2C7458EE747DA35D44AC9FB08AB5477EA3E7CCDB3E37EE20FAFD0D0CF9584E420598B7003B347943AC28048F45E0FD21AD08148FFADCE0E7877219259A7BE722FFAE845A429BA2CF0A71F2D19EA7495530FABDB5106E8D404A38A7E6394C38457640EA7398C5D55F0C4D342CC6A39C77E10A2A5145AEA40B14F5C7C3760334D83C9BE748383FADE231248537353817D51F7B44F61B406ABC61400000071C354139F458B02D978015F785B97F7F6B307380 
disable wallpaper:i:1 
disable full window drag:i:1 
disable menu anims:i:1 
disable themes:i:0 
disable cursor setting:i:0 
bitmapcachepersistenable:i:1

As you can see the password is somehow encrypted before it was saved and automatically decrypted when you open the file with mstsc. .

I did some analysis on mstsc.exe and mstsc uses the functions CryptProtectData and CryptUnProtectData which are both exported by crypt32.dll. Since those API calls are documented let’s try to encrypt a password with mstsc and one ourselves and compare the output:

function CryptRDPPassword(sPassword: string): string; 
var DataIn: DATA_BLOB; 
    DataOut: DATA_BLOB; 
    pwDescription: PWideChar; 
    PwdHash: string; 
begin 
  PwdHash := '';                                      

  DataOut.cbData := 0; 
  DataOut.pbData := nil;                                      

  // RDP uses UniCode 
  DataIn.pbData := Pointer(WideString(sPassword)); 
  DataIn.cbData := Length(sPassword) * SizeOf(WChar);                                      

  // RDP always sets description to psw 
  pwDescription := WideString('psw');                                      

  if CryptProtectData(@DataIn, 
                      pwDescription, 
                      nil, 
                      nil, 
                      nil, 
                      CRYPTPROTECT_UI_FORBIDDEN,  // Never show interface 
                      @DataOut) then 
  begin 
    PwdHash := BlobDataToHexStr(DataOut.pbData, DataOut.cbData); 
  end; 
  Result := PwdHash;                                      

  // Cleanup 
  LocalFree(Cardinal(DataOut.pbData)); 
  LocalFree(Cardinal(DataIn.pbData));                                      

end;

So we encrypt the password “secret” and compare this with the same password saved by mstsc
MSTSC:

01000000D08C9DDF0115D1118C7A00C04FC297EB0100000052A9E191EA75A948B359790578C9371A0000000008000000700073007700000003660000A8000000100000000A1DCCD2E50775CA25EC3857164B34DC0000000004800000A000000010000000FCE1A645B9B61AA450946BB6F955058108020000D83591CA47562D6DDAA689F050AE145039EBE22E00D1D3AEAA98373C7B63C3E8E7149072DF989EA43EFCE20513AD3D27B11BE7F17066A688E1DCE828AF85460AAC327B38E90776DB962888E4393D19637578984B19A187AAD95F6D2726ADE7DD315FF56C15FF5B3031014EDDCC3C24D1B81779AFDB006EE575F5BEFB8D2D2138D9D9D642BBB251CC5ED7226968764856EC660A646BACE748A13D6002A9A537AA70710615650B9387EED66DE28BD57B304BBDD7B581B943DA628EB0289E30A8BA784B76F7885BECCAB4FEF7820E97EE3C6E036EEAF6EAA669288DF2FCACC9BEC045C907EBBDE87AFB8CC6B07A600BD63AC891B61D95C2265DD9FD5E635D61BFBF5EDC28311375066611C610FB533D64515B643C82F57D9B183B05C156D91BC0974D38E546022B139E82452E6F1EDF76E52F732C3904E5E433F8F3D488DB0698427DBB0791A9F207F8CB6654CB8410BAF4A59C4F9E821E589ABC1E6E6E1D432181B690408F6884FE1007895A4D26D4A5A2C7458EE747DA35D44AC9FB08AB5477EA3E7CCDB3E37EE20FAFD0D0CF9584E420598B7003B347943AC28048F45E0FD21AD08148FFADCE0E7877219259A7BE722FFAE845A429BA2CF0A71F2D19EA7495530FABDB5106E8D404A38A7E6394C38457640EA7398C5D55F0C4D342CC6A39C77E10A2A5145AEA40B14F5C7C3760334D83C9BE748383FADE231248537353817D51F7B44F61B406ABC61400000071C354139F458B02D978015F785B97F7F6B307380

CryptRDPPassword:

01000000D08C9DDF0115D1118C7A00C04FC297EB0100000052A9E191EA75A948B359790578C9371A0000000008000000700073007700000003660000A800000010000000F68F88DF66E436846C077BF402E46EB90000000004800000A000000010000000FE8CEBCF943F9CEC9F3C3A1E0710BEC510000000A647D6ADB728E51F071C854F0BFFF66F140000003B271D41D3D256BCCC4DD255701C14B7489A081D

As you can see the length of a password encrypted by mstsc is 1329 bytes and the one from CryptRDPPassword is smaller. Actually mstsc generates fixed length passwords and our function’s length is based upon the password. Even more strange is that mstsc password is always 1329 bytes because the input password is unicode which should produce an even size length. It doesn’t really matter though because mstsc.exe accepts the smaller sized passwords without any problems.
For now I will leave with a demo tool I wrote to encrypt and decrypt rdp passwords. But in a followup article I will show you how te encrypt the passwords to the full length 1329 bytes the same way mstsc does.

Remote Desktop Password Encryption & Decryption Tool
Do you find this article usefull, why not leave a comment?

原文:https://www.remkoweijnen.nl/blog/2007/10/18/how-rdp-passwords-are-encrypted

DataTables列表移动端适配定义隐藏列

Responsive.breakpoints = [
    { name: 'desktop',  width: Infinity },
    { name: 'tablet-l', width: 1024 },
    { name: 'tablet-p', width: 768 },
    { name: 'mobile-l', width: 480 },
    { name: 'mobile-p', width: 320 }
];

分别表示在什么屏幕下显示该列。
比如desktop表示在PC版大屏幕时才显示该列,否则隐藏。
tablet-l表示1024的大小才显示该列,否则隐藏。
以此类推。

所以修改的代码只需要修改列头th的class名即可,如下:

<thead>
    <tr>
        <th width="8%" class="mobile-l">姓名</th>
        <th width="10%" class="mobile-l">电话</th>
        <th width="10%" class="mobile-l">性别</th>
        <th width="10%" class="desktop">时间</th>
        <th width="8%" class="desktop">操作</th> 
    </tr>
</thead>

欢迎使用 MWeb

MWeb 是专业的 Markdown 写作、记笔记、静态博客生成软件,目前已支持 Mac,iPad 和 iPhone。MWeb 有以下特色:

软件本身:

  • 使用原生的 macOS 技术打造,追求与系统的完美结合。
  • 原则上,首先是追求界面简洁和高性能,然后才是强大易用,功能全面。

Markdown 语法:

  • 使用 GitHub Flavored Markdown 语法,简称 GFM 语法。
  • 支持表格、TOC、LaTeX、代码块、任务列表、脚注等。
  • 画图库支持 mermaid, viz, ECharts, PlantUML, Sequence, Flow。

Markdown 辅助:

  • 支持截图并粘贴、复制并粘贴、拖拽等方式插入图片并直接显示在编辑器内。
  • 在兼容 Markdown 语法的情况下支持设置图片宽度。
  • 好用的表格插入和 LaTeX 书写辅助。

Markdown 输出:

  • 支持导出为图片、HTML、Epub、PDF、RTF、Docx。
  • 支持发布到 WordPress、支持 Metaweblog API 协议的服务、Wordpress.com、印象笔记(Evernote)、Blogger、Medium、Tumblr、语雀、Ghost、少数派 Matrix。
  • 图片上传服务(图床)支持 Imgur、七牛云、又拍云、腾讯云 COS、阿里云 OSS、SM.MS和自定义的图床服务。

Markdown 笔记:

  • 强大的文档库支持分类树和标签管理文档,文档可归类于多个分类,可以把分类整个导出为 Epub、PDF 和生成静态网站。非常合适用于笔记、个人知识收集、管理和输出。
  • 快速笔记:随意增加笔记及图片等素材,支持以天为单位把增加的素材组合在一个文档内,方便整理及记录历史收集情况。
  • 快速搜索:目前已支持全局快捷键调出搜索。

外部 Markdown 文档:

  • 外部 Markdown 文档使用外部模式管理。外部模式使用目录树的方式编辑和管理你的 Markdown 文档,还能很好的支持 GitBook、Jekyll、Hexo 等等编辑和图片插入。

MWeb 文档:

如果要更详细了解 MWeb,建议你一定要去看一下官网的帮助文档,网址为:https://zh.mweb.im/help.html。我们建议在使用文档库之前,一定要阅读一下 MWeb 文档库详细介绍 这篇文章,以便更好的使用文档库。

帮助我们改进 MWeb

如果你喜欢 MWeb,想让它变得更好,你可以:

  1. 推荐 MWeb,让更多的人知道。
  2. 给我们发反馈和建议:coderforart+2333@gmail.com
  3. 在 Mac App Store 上评价 (如果是在 MAS 上购买的话)。

Piwigo Sylvia theme专辑图片垂直居中

修改 themes/Sylvia/theme.css

.thumbnailCategory .illustration {
    background: transparent url(images/cat_top-left.gif) no-repeat scroll left top;
    padding: 0 5px 0 10px;
    margin: 0 !important;
    text-align: center;
    line-height:145px;
}

.thumbnailCategory .illustration a {
    display: block;
    margin: 0 auto;
    padding: 20px 4px 0;
    border: 0;
}

.thumbnailCategory .illustration a img {
    display: inline-block;
    vertical-align: middle;
}

centOS7下SVN的安装和使用

转载:du_xian_sheng@CSDN

1. 安装

CentOS通过yum安装subversion。

# yum install subversion

subversion安装在/bin目录,查看目录命令:

# which svnserve
/usr/bin/svnserve

检查一下subversion是否安装成功。不要使用1.8版本

# svnserve --version
svnserve, version 1.7.14 (r1542130)

2. 建立版本库

subversion默认以/var/svn作为数据根目录,可以通过/etc/sysconfig/svnserve修改这个默认位置。

# vim /etc/sysconfig/svnserve

文件内容 OPTIONS=”-r /var/svn” 可修改

使用svnadmin建立版本库svntest。

# mkdir -p /var/svn/svntest //递归创建多个目录
# svnadmin create /var/svn/svntest
# ll /data/svn/svntest //查看目录中内容
drwxr-xr-x. 2 root root  51 Nov 10 14:42 conf
drwxr-sr-x. 6 root root 4096 Nov 10 14:42 db
-r--r--r--. 1 root root    2 Nov 10 14:42 format
drwxr-xr-x. 2 root root 4096 Nov 10 14:42 hooks
drwxr-xr-x. 2 root root  39 Nov 10 14:42 locks
-rw-r--r--. 1 root root  229 Nov 10 14:42 README.txt

3. 配置

#cd /var/svn/svntest

a、编辑用户文件passwd,新增两个用户:admin和guest。

# vim conf/passwd
[users]
admin = admin
guest = guest

b、编辑权限文件authz,用户admin设置可读写权限,guest设置只读权限。

# vim conf/authz
[/]
admin = rw
guest = r

c、编辑svnserve.conf:

# vim conf/svnserve.conf
[general]
anon-access = none #控制非鉴权用户访问版本库的权限
auth-access = write #控制鉴权用户访问版本库的权限
password-db = passwd #指定用户名口令文件名
authz-db = authz #指定权限配置文件名
//realm = svntest #指定版本库的认证域,即在登录时提示的认证域名称 //测试不需要

 4. SVN服务

启动SVN服务。

# systemctl start svnserve.service

检查服务是否启动成功。

# ps aux | grep svn
root 16349 0.0 0.1 162180 900 ? Ss 15:01 0:00 /usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid -r /opt/svn

通过netstat可以看到SVN打开了3690端口。

# netstat -tnlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 16349/svnserve

设置成开机启动。

# systemctl enable svnserve.service

5. 更改防火墙设置大坑,注意阿里云要开相应端口3690

# vim /etc/sysconfig/iptables

添加一下两行 vim操作 yy p

-A INPUT -m state –state NEW -m tcp -p tcp –dport 3690 -j ACCEPT
-A OUTPUT -m state –state NEW -m tcp -p tcp –dport 3690 -j ACCEPT //不需要

然后退出编辑,重启防火墙

查看 

# iptables -L -n
# service iptables restart //这是centOS6 的命令
# /bin/systemctl restart iptables.service

6. 客户端测试

客户端可以通过TortoriseSVN测试。

Linux下客户端使用SVN

将文件checkout到本地目录svn666

svn checkout svn://127.0.0.1 ./svn666

有修改的时候

# svn add * //添加文件
# svn commit -m '这是注释内容' //提交
# svn update //更新

网段划分例子

将172.17.0.0划分为14个子网(实际是16个),请计算出子网的子网掩码,以及在每个子网中主机IP地址的子网如下:

172.17.0.0/20
有效的地址范围是:172.17.0.1-172.17.15.254
172.17.16.0/20
有效的地址范围是:172.17.16.1-172.17.31.254
172.17.32.0/20
有效的地址范围是:172.17.32.1-172.17.47.254
172.17.48.0/20
有效的地址范围是:172.17.48.1-172.17.63.254
172.17.64.0/20
有效的地址范围是:172.17.64.1-172.17.79.254
172.17.80.0/20
有效的地址范围是:172.17.80.1-172.17.95.254
172.17.96.0/20
有效的地址范围是:172.17.96.1-172.17.111.254
172.17.112.0/20
有效的地址范围是:172.17.112.1-172.17.127.254
172.17.128.0/20
有效的地址范围是:172.17.128.1-172.17.143.254
172.17.144.0/20
有效的地址范围是:172.17.144.1-172.17.159.254
172.17.160.0/20
有效的地址范围是:172.17.160.1-172.17.175.254
172.17.176.0/20
有效的地址范围是:172.17.176.1-172.17.191.254
172.17.192.0/20
有效的地址范围是:172.17.192.1-172.17.207.254
172.17.208.0/20
有效的地址范围是:172.17.208.1-172.17.223.254
172.17.224.0/20
有效的地址范围是:172.17.224.1-172.17.239.254
172.17.240.0/20
有效的地址范围是:172.17.240.1-172.17.255.254

Mac 终端里神秘的 bogon 及解决方法

如题,Mac 下的终端经常有时候前面的计算机名会错误的显示成 bogon. 这是因为终端会先向 DNS 请求查询当前 IP 的反向域名解析的结果,如果查询不到再显示我们设置的计算机名。而由于我们的 DNS 错误地将保留地址反向的 NS 查询结果返回了 bogon. 其中 bogon 本应该用来指虚假的 IP 地址,而非保留 IP 地址。因此就出现了会时不时地打印 bogon 这种奇怪名字作为计算机名的现象了。那么如何让终端只显示我们想要的计算机名而不总是从 DNS 返回结果呢?

解决方案:在终端中执行以下命令即可(需要输入一次管理员密码)

sudo hostname your-desired-host-name
sudo scutil --set LocalHostName $(hostname)
sudo scutil --set HostName $(hostname)

Linux下DNS查询

一般来说linux下查询域名解析有两种选择,nslookup或者dig,而在使用上我觉得dig更加方便顺手。

如果是在debian下的话,只要装上dnsutils这个包就可以使用dig命令了。最基本的使用方式就是

dig www.oolec.com

即查询域名的A记录,查询的dns服务器将采用系统配置的服务器,即/etc/resovle.conf 中的。如果要查询其他类型的记录,比如MX,CNAME,NS,PTR等,只需将类型加在命令后面即可

dig www.oolec.com mx
dig www.oolec.com ns

此外,如果你是一个系统管理员,部署好了一台dns服务器之后想对它进行解析测试,就必须要显式指定待测试的dns服务器地址了,例如

dig @202.106.0.20 www.oolec.com a

默认情况下dig将采用udp协议进行查询,如果要采用tcp方式,可以加上 +tcp参数

dig www.oolec.com a +tcp

另外一个重要的功能是+trace参数,使用这个参数之后将显示从根域逐级查询的过程

dig www.oolec.com a +trace

比如,对域名www.linuxers.cn A记录的trace查询可以看到根域.,顶级域.cn,以及linuxers.cn的域名权威服务器的地址及其各自的返回结果,这样对于追踪dns解析中的问题有很大的帮助。

dig www.linuxers.cn a +trace

datatable实现纵向单元格合并

转载:bird_tp@CSDN

实现效果如下:

在 drawCallback 函数里重画表格,引入以下代码即可

var api = this.api();
var rows = api.rows({ page: 'current' }).nodes();

var idx = 0;    // 第一列进行合并
var last = null;
var tr = null;
var ltd = null;

api.column(idx, { page: 'current' }).data().each(function (group, i) {
    tr = $(rows[i]);
    var td = $("td:eq(" + idx + ")", tr);
    if (last !== group) {
        td.attr("rowspan", 1);
        td.text(group);
        ltd = td;
        last = group;
        td.css("vertical-align", "middle");
    } else {
        ltd.attr("rowspan", parseInt(ltd.attr("rowspan")) + 1);
        td.remove();
    }
});

Delphi XE移动开发,将文件打包到程序中

用Delphi XE做移动开发的时候,有些情况下可能需要我们把一些文件打包到安装程序中,如网页、图片、数据库文件等,那么如何实现呢

1.首先,打开菜单 Project – Deployment

2.点击添加按钮,选择要添加的文件(文件最好放在工程目录中,这样,即使该工程在其他电脑上打开,也能找到该文件)

3.修改Remote Path:

    当开发Android程序时,Remote Path修改为 assets\internal\ 

    当开发iOS程序时,Remote Path修改为 StartUp\Documents

4.程序中使用文件的方法:

    首先,需要引用 System.IOUtils 文件,这样才能使用TPath类

    TPath.Combine(TPath.GetDocumentsPath,’a.htm’)

    或

    TPath.GetDocumentsPath + PathDelim + ‘a.htm’

    获取文件的绝对路径,然后就可以使用这个路径对文件进行操作了