﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-世界研究所-随笔分类-技术随笔</title><link>http://www.cppblog.com/crhackos/category/17076.html</link><description>新我的游乐园</description><language>zh-cn</language><lastBuildDate>Thu, 19 Mar 2015 12:22:58 GMT</lastBuildDate><pubDate>Thu, 19 Mar 2015 12:22:58 GMT</pubDate><ttl>60</ttl><item><title>VC2013 编译的程序在 XP 下运行的一些事</title><link>http://www.cppblog.com/crhackos/archive/2015/03/19/210105.html</link><dc:creator>CrHackOS</dc:creator><author>CrHackOS</author><pubDate>Thu, 19 Mar 2015 08:02:00 GMT</pubDate><guid>http://www.cppblog.com/crhackos/archive/2015/03/19/210105.html</guid><wfw:comment>http://www.cppblog.com/crhackos/comments/210105.html</wfw:comment><comments>http://www.cppblog.com/crhackos/archive/2015/03/19/210105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/crhackos/comments/commentRss/210105.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/crhackos/services/trackbacks/210105.html</trackback:ping><description><![CDATA[<div>　　选择 v120_xp 平台工具集即可使程序兼容 XP 系统。其实质就是加了一个 _USING_V110_SDK71_ 的宏，使用老版本的 Windows SDK，来防止用到 XP 没有的系统 API。另外就是链接器里把子系统的版本号定义成 5.1 了（默认是 6.0）。我做了一下实验，发现子系统的版本号只对 EXE 有效。6.0 的 EXE 在 XP 下运行会提示不是有效的 Win32 程序，而 DLL 似乎不会受到这个限制。所以只要没有用到 XP 没有的 API，VC2013 编译的 DLL 可以直接使用，而 EXE 相差的其实就是那个版本号。（这里的 VC2013 是打过最新的 Update 的，XP 是 SP3 的。）</div><img src ="http://www.cppblog.com/crhackos/aggbug/210105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/crhackos/" target="_blank">CrHackOS</a> 2015-03-19 16:02 <a href="http://www.cppblog.com/crhackos/archive/2015/03/19/210105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>嵌入式 Linux 下关闭串口控制台输出</title><link>http://www.cppblog.com/crhackos/archive/2014/08/16/208032.html</link><dc:creator>CrHackOS</dc:creator><author>CrHackOS</author><pubDate>Sat, 16 Aug 2014 05:23:00 GMT</pubDate><guid>http://www.cppblog.com/crhackos/archive/2014/08/16/208032.html</guid><wfw:comment>http://www.cppblog.com/crhackos/comments/208032.html</wfw:comment><comments>http://www.cppblog.com/crhackos/archive/2014/08/16/208032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/crhackos/comments/commentRss/208032.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/crhackos/services/trackbacks/208032.html</trackback:ping><description><![CDATA[<div>　　最近在玩新唐的 N32926。这颗芯片最大的优势就是把 DDR 内存和 ARM9 的芯片做在一起了，提供非 BGA 的芯片封装（QFP128）。比起三星之类的硬件可以简单不少，性价比也不错。缺点就是，可能是封装管脚太少的缘故，很多功能都是复用的，导致管脚资源紧张。例如，以太网接口和8位以上的 LCD 屏接口是冲突的。以太网切换到第二端口上又和一个串口冲突。本来芯片上就只有两个串口。这就造成，所有的串口设备必须要挂在同一个串口上，用一个模拟开关芯片去切换。可恶的是，Linux 内核和控制台也会时不时的输出东西。但是又不想彻底关掉它们，到时候还能看看调试信息。所以就去找了一下如何临时关闭控制台输出的方法。</div>
<div>　　临时关闭控制台输出（打开控制台输出即是把 tty0 重新设置为默认终端输出）：</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fd;<br />
</span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;open(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/dev/tty1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;O_RDONLY);<br />
</span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(fd&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ioctl(fd,&nbsp;TIOCCONS);<br />
</span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br />
</span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #000000; ">}</span><span style="color: #008080; "></span> <span style="color: #000000; "></span></div>
<div>　　临时关闭内核信息输出：echo 0 &gt; /proc/sys/kernel/printk；重新打开内核信息输出：echo 7 &gt; /proc/sys/kernel/printk。</div>
<div>　　这样，要用串口设备的时候，就先临时关闭，然后开关切换，搞完之后再切回来，最后打开输出。好在使用的串口设备都是被动的，可以临时用一下的，不用一直挂在上面，不然就麻烦了。</div>
<img src ="http://www.cppblog.com/crhackos/aggbug/208032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/crhackos/" target="_blank">CrHackOS</a> 2014-08-16 13:23 <a href="http://www.cppblog.com/crhackos/archive/2014/08/16/208032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RSA 算法简单流程及注意事项</title><link>http://www.cppblog.com/crhackos/archive/2014/03/17/206197.html</link><dc:creator>CrHackOS</dc:creator><author>CrHackOS</author><pubDate>Mon, 17 Mar 2014 05:55:00 GMT</pubDate><guid>http://www.cppblog.com/crhackos/archive/2014/03/17/206197.html</guid><wfw:comment>http://www.cppblog.com/crhackos/comments/206197.html</wfw:comment><comments>http://www.cppblog.com/crhackos/archive/2014/03/17/206197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/crhackos/comments/commentRss/206197.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/crhackos/services/trackbacks/206197.html</trackback:ping><description><![CDATA[（1）选取三个素数：P、Q、E；<br />（2）计算 N = P * Q，F = (P - 1) * (Q - 1)；<br />（3）求方程 E * x - F * y = 1 最小整数解 D；<br />（4）(E，N) 为公钥，(D，N) 为私钥；<br />（5）加密过程为：C = (M ^ E) mod N（C 为密文，M 为明文）；<br />（6）解密过程为：M = (C ^ D) mod N（C、M 不能大于 N）；<br />（7）P、Q 必须是有一定长度的强素数，使得 N 因式分解很难；<br />（8）P、Q 之间最好相差很大，一般相差个几位；<br />（9）E 不可取得太小，一般取16位的素数，65537是一个常用数；<br />（10）Java 下 RSA 和大整数运算的数据存放方式都是大端格式。<img src ="http://www.cppblog.com/crhackos/aggbug/206197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/crhackos/" target="_blank">CrHackOS</a> 2014-03-17 13:55 <a href="http://www.cppblog.com/crhackos/archive/2014/03/17/206197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些我常用的工具软件</title><link>http://www.cppblog.com/crhackos/archive/2013/03/24/198790.html</link><dc:creator>CrHackOS</dc:creator><author>CrHackOS</author><pubDate>Sun, 24 Mar 2013 14:25:00 GMT</pubDate><guid>http://www.cppblog.com/crhackos/archive/2013/03/24/198790.html</guid><wfw:comment>http://www.cppblog.com/crhackos/comments/198790.html</wfw:comment><comments>http://www.cppblog.com/crhackos/archive/2013/03/24/198790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/crhackos/comments/commentRss/198790.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/crhackos/services/trackbacks/198790.html</trackback:ping><description><![CDATA[（1）EditPlus<br />　　这个是我写代码的主要工具，几乎所有的代码都是用它写出来的。功能虽然没有其他编辑器或 IDE 那样强大，但是配置容易，简单清爽，上手很快，并且功能也没有像记事本那么弱，走的是中庸路线。<br /><br />
<div>（2）TortoiseSVN<br />
<div>　　每个做开发的人都应该自己搞一套版本管理系统，我的内部项目全都是用它管理的（不用装服务端，直接可以用它来建仓库）。自从用上了 SVN，已经彻底无法离开了。真无法想象从前人肉管理源代码的日子是怎么过来的。最早 TortoiseSVN 不带命令行工具，需要另外装一套工具，后来从某个版本开始自带了，所以只要装这一个就可以了。<br /><br />（3）TortoiseGit<br />
<div>　　这个是最近才开始用的版本管理工具外壳，它的操作方式与 TortoiseSVN 的差不多，上手很快。使用它前必须先装 Git for Windows 。Git 比 SVN 爽多了，GitHub 也是个很爽的网站，最喜欢里面的源代码统计功能，加了几行，删了几行，源码类型百分比统计，ZIP 打包下载等等。另外，建议使用英文版（包括 TortoiseSVN），一些词条换成中文就搞不清楚到底是哪个命令了。<br /><br />（4）HaSHer<br />
<div>　　这个是我自己写的工具，可以批量计算文件的哈希值，并且比较前后两次哈希值列表的差异（需要外部文本比较工具 TextDiff 和 TortoiseMerge）。我都是挂在右键菜单上用的。<br /><br /></div>（5）grepWin<br />
<div>　　TortoiseSVN 作者做的一个文本查找替换的小工具，挂在右键菜单上可以很方便的查找替换源码（脱离编辑环境）。<br /><br /></div>（6）HashCalc<br />
<div>　　一个计算哈希的免费工具。我主要用它来计算源代码里的字符串哈希值，同时用来对比自己代码计算哈希值的正确性，做个参考。<br /><br /></div>（7）Rapid Environment Editor<br />
<div>　　一个非常好的环境变量配置工具，免费的。配置编译器路径和环境变量时很方便（Windows 自带的环境变量设置工具到了 Win7 还是那副德性，完全没有可用性，让人忍无可忍，难道是为了留口饭给别人吃？）。<br /><br /></div>（8）FreeFileSync<br />
<div>　　免费开源的文件同步工具，用来备份文件很方便。我都是用它来把文件备份到移动硬盘里去的，使用镜像模式。<br /><br />
<div>（9）010 Editor<br />
<div>　　分析二进制文件的时候使用。虽然有不爽的地方，但是功能还算够用。在没有更好的选择之前用用还算不错。以后 QuestLAB 里会做一个类似的二进制观察分析工具，可以自己定制一些自己想要的功能。<br /><br />（10）Foxit Reader<br />
<div>
<div>　　看 DataSheet PDF 用的，比起又大又臭的那什么要小巧清爽多了，不过听说其安全漏洞很多。中文版貌似版本很老，一直没有更新，现在直接使用英文版。<br /><br />（11）Greenfish Icon Editor<br />
<div>
<div>
<div>　　一个免费的图标编辑工具。QuestLAB 里的图标都是用它编辑的（网上找来中意的图标，然后删除图标文件里的那些超大图标，并按大小排成一致的顺序）。</div></div></div><br />
<div>
<div>（12）Sysinternal Suite<br />　　微软出的一组免费的实用工具。常用的有 AutoRuns（删注册表僵尸、自启动和垃圾驱动用）、Desktops（可实现多个桌面）、Junction（XP 下用来实现 NTFS 文件链接）、SigCheck（检查文件的数字签名，我是挂在右键菜单上用的）、Sync（刷磁盘写缓存用，强行断移动硬盘前执行几次）。<br /><br />（13）WinDV<br />
<div>　　一个德国人写的视频采集小程序。抓 DV 视频的时候文件名会以拍摄日期命名并分割文件，这个是会声会影做不到的。<br />
<div>
<div>
<div>&nbsp;</div></div></div></div></div></div></div></div></div></div></div></div></div></div><img src ="http://www.cppblog.com/crhackos/aggbug/198790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/crhackos/" target="_blank">CrHackOS</a> 2013-03-24 22:25 <a href="http://www.cppblog.com/crhackos/archive/2013/03/24/198790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个限长度字符串替换的应对方法</title><link>http://www.cppblog.com/crhackos/archive/2011/06/14/148640.html</link><dc:creator>CrHackOS</dc:creator><author>CrHackOS</author><pubDate>Tue, 14 Jun 2011 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/crhackos/archive/2011/06/14/148640.html</guid><wfw:comment>http://www.cppblog.com/crhackos/comments/148640.html</wfw:comment><comments>http://www.cppblog.com/crhackos/archive/2011/06/14/148640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/crhackos/comments/commentRss/148640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/crhackos/services/trackbacks/148640.html</trackback:ping><description><![CDATA[　　多年前写的日志，其中的思路可能对汉化或者其他一些工作有借鉴作用，在这里再贴一遍。<br />　　有时候我们要修改/替换某些脚本系统里面的字符串，而这些字符串与指令都是以穿插的形式存放在脚本编译后生成的二进制文件的内部。如果修改的长度小于等于原来的长度，那就可以直接在上面修改了，不足的用空白字符什么的补完就行了。但是碰到超出原来长度的就没那么简单了，因为那些二进制指令代码里面可能存在各式各样的跳转指令，一旦改动了文件长度就会导致运行异常。<br />　　当然，你可以通过分析 exe 来搞懂那些指令的意思，至少要把所有与位置有关的指令格式搞出来。那需要不停的调试，得到所有与位置相关的指令格式后，写一个 HEX2TXT 的程序，然后再写一个 TXT2HEX 的程序。这些程序很难有通用性，而且调试也要花一定的时间和精力，毕竟东西是人家的，人家想怎么改就怎么改，研究这个也没有什么太大的意义。<br />　　很容易想到的就是用外挂的文本库实现运行时的替换，当然我这里说的不是那种根据原始字符串来匹配查找新字符串的替换（因为某人说了，在不同的环境下，相同的语句可以有不同的意思，所以存在一对多的情况）。因为无法把超出原来长度的字符串放进去，所以我们得改变一下思路，把其他东西放进去。<br />　　很简单，把数字放进去就可以了，因为 4 个字节的整数可以表示 4G 的范围的数，所以那样的东西放进去一定可以满足空间长度的需要。而这些数字表示的就是外部文本库里对应文本的编号索引。好了，现在我们需要一个导出原始文本和偏移的工具和一个把翻译文本的索引号写回去的工具就可以了。由于都是简单的操作，所以这些工具将有很大的可能是通用的。<br />　　接下来就在 exe 上做文章了，根据具体系统的不同，有不同的改法。大致上就是在他读取完字符串的后面再加上我们的根据索引来替换文本的程序段了。这个比调试一整个 VM 要简单的多了。<br /><img src ="http://www.cppblog.com/crhackos/aggbug/148640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/crhackos/" target="_blank">CrHackOS</a> 2011-06-14 16:52 <a href="http://www.cppblog.com/crhackos/archive/2011/06/14/148640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个未知压缩算法还原的应对方法</title><link>http://www.cppblog.com/crhackos/archive/2011/06/14/148639.html</link><dc:creator>CrHackOS</dc:creator><author>CrHackOS</author><pubDate>Tue, 14 Jun 2011 08:41:00 GMT</pubDate><guid>http://www.cppblog.com/crhackos/archive/2011/06/14/148639.html</guid><wfw:comment>http://www.cppblog.com/crhackos/comments/148639.html</wfw:comment><comments>http://www.cppblog.com/crhackos/archive/2011/06/14/148639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/crhackos/comments/commentRss/148639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/crhackos/services/trackbacks/148639.html</trackback:ping><description><![CDATA[　　多年前写的日志，其中的思路可能对汉化或者其他一些工作有借鉴作用，在这里再贴一遍。<br />　　如果包文件或图片里用了他们自己设计的压缩算法，想要回过去，但又不想分析他的程序，除了利用他算法里的一些简单的编码方式做伪压缩外，还可以使用替换压缩算法的方法。<br />　　一般来说，那些自己设计的压缩算法都是弱压缩（字典不大或考虑性能因素），我们可以使用一些现成的压缩算法来替换，只要保证压缩后的大小比他原来的大小小即可。这样做有一个好处就是不需要重新生成包文件了，只要在原来的文件位置上覆盖即可，不需要修改其他文件的偏移。<br />　　当然不是全部换成我们的算法了。只要在我们想要修改的文件数据块前加一个标志，然后 hook 了他的解码入口处，check 一下标志来决定使用那种解码即可，方便有效。至于压缩算法嘛可以使用 zlib，外挂一个 dll，也可以使用日本佬写的那几个 LZHUF/LZARI，都是相对的 call，可以直接植入 exe，虽然滑窗小了点效果还是不错的，压 3M 的高度图（24 位的灰度 BMP 文件）比 zlib 大了几十 K 而已。顺便补充一下，aPLib 也是很好的选择，只是小得有点让人受不了。<br /><img src ="http://www.cppblog.com/crhackos/aggbug/148639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/crhackos/" target="_blank">CrHackOS</a> 2011-06-14 16:41 <a href="http://www.cppblog.com/crhackos/archive/2011/06/14/148639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>