将深山红叶放到U盘上的办法

这个网上有很多人说,有的人整出了非常复杂的办法,我也是很久之前研究的了,还是写下来,否则下次还要到处找。

方法超级简单,对于深山红叶,最终版似乎就是 V30正式版,也就是所谓的“嫦娥一号记念版”。

这个版本打开后目录结构如下:

I:.
│  WINNT.XPE
│  WINPE.IS_
│  深山红叶系统工具箱.EXE
│ 
├─BOOT
│  │  CDMENU.BIN
│  │  CDMENU.EZB
│  │  DOS98.IMG
│  │  GRLDR
│  │  ISOGRUB.BIN
│  │  LOADER.BIN
│  │  MEMTEST.BIN
│  │  MENU.BM1
│  │  MENU.BMP
│  │  SETDOS.CMD
│  │  STAGE2
│  │  WINDIAG
│  │  WINPE.INI
│  │  WINS.BIN
│  │  XLYBIG.IMG
│  │ 
│  └─GRUB
│          CDBOOT.BS
│          FAT_STAGE1_5
│          HD_MENU.LST
│          MEMDISK.GZ
│          MENU.LST
│          NTFS_STAGE1_5
│          STAGE1
│          STAGE2
│         
├─PROGRAMS (文件太多,此处省略)
│             
└─WXPE
        NTDETECT.COM
        SETUPLDR.BIN

先确保U盘可以启动NTLDR,

然后把所有文件copy到U盘上,把WXPE下的两个文件移到U盘根目录,将Setupldr.bin改名为NTLDR

BOOT目录下只留WINPE.ini,其它全删。

这样就完成了把深山红叶最终版的U盘化。汗,是不是太简单了,但在不知道方法去试的时候,还是很麻烦的。

最后的目录结构如下:

Z:.
│  NTLDR
│  WINPE.IS_
│  深山红叶系统工具箱.EXE
│  NTDETECT.COM
│  WINNT.XPE
│ 
├─PROGRAMS  (文件太多,此处省略)
│             
└─BOOT
        WINPE.INI

说明:BOOT下本来有很多文件,可以完成很多的功能,用了这种办法来启动后,这些功能都做不到了(比如启动到DOS,微软内存检测等)。试过了用ezboot的那些东西在非光盘上是用不了的。所以这些文件就都删了。

当然这些功能要加回来,还是很简单的,在这个方法上添加就行了。可以用grub4dos来启动,添加这些功能。

发表在 boot | 标签为 , | 留下评论

买了HM的独立IP。

由于host221.hostmonster.com被封了,只好买了HM的独立IP。

HM真狠,不给换机器,买独立IP也不给换机器,只是在原机器上给网卡加了个IP。

还有一件不爽的事,HM居然把我的php.ini改了,就改了extension_dir那一行,改成默认值了,害得我的gmp extesion不能运行。我晕,先改回去,得关注一下,看看他们是否还会改回去。

发表在 老当益愤 | 留下评论

debian 修复记

家里用来装debian的电脑是一台很老的电脑,老到它有一个毛病,就是硬盘经常掉线。以前用windows是这样,现在拿它改装linux,当然,也是这样了。这不,掉了几次,debian坏了。

首先是修复文件系统,用光盘rescue启动,fsck.ext3 /dev/hda4,修复了一下,报了很多错,坏了一堆文件。

进去后又发现dpkg坏了,使得apt-get ,apt-cache等无法用,报 /var/lib/dpkg/status 错。网上找了下这个错,还真是一堆一堆的,有的人说用status-old复制回去,但不幸,这个文件一起坏了。

用recover, repair等找了一下,最终装于找到一个能修得的bash文件:

http://tuxx-home.at/projects/restore-dpkg-status.sh

运行后会在tmp目录生成个新的status文件,换回去。

OK,然后又说 /var/lib/dpkg/available 坏了。靠,找了一下,这回好像没有修复的脚本了,找到一个说这样可以修复的:

dpkg –clear-avail
apt-get update

运行了一下,第一句把available 这个文件清空了,update完,还是0字节,被骗了,靠。

不过发现清空了之后,apt-get是可以用了。但是它也以为我装的很多包是没有装的状态。

只好再慢慢装回去了,反正是覆盖安装,不会多占空间。

比如运行apt-get install openssh-server

它就以为我没有装这个openssh,帮我重新装一下,这样处理了很多个包,后面还要慢慢处理一堆。碰到再说了。

最后查了一下,结合一直以来观察到的现象,感觉这台破电脑硬盘掉线的原因是电源问题,可能当电源带不动的时候硬件就歇菜了。过几天整个新电源试试。

 

发表在 linux | 留下评论

被hostmonster害了。

把php升级了,导致我的php全都报http 500 内部错误了。也不通知我一下,鄙视之。

一段时间忙着没来看,居然挂了。

于是重新设定了php.ini。把原来老的丢弃,用起hm默认的那个。

发现,我需要用到的gmp模块,升级后的php还是没有。很失望,我上次就要他们加的。

得,还是照老方法,自己加吧。由于可以自定义php.ini,所以加个gmp.so是可以的。

把原来的gmp.so放入对应目录,设定php.ini,不行!报不认识gmp的函数。这一步折腾了我最久,我以为是php版本的问题,又去重新下了对应的版本编译出gmp.so,结果还是不行。又把php.ini改得稀巴乱,照样不行。

也不知是怎么的,最后想到了,是fcgi没有重新加载我修改后的php.ini,尽管我一直在改。因为我把php.ini中的pdo模块都去掉了,phpinfo里还是返回有这个模块。于是想到了,应当想办法让它重新加载php.ini。

把extesion的目录改了一下,以便phpinfo中看到的时候,我可以立即知道已经重新加载了。通过cpanel把fcgi换回普通方式,试了一下,gmp.so可以用了。又换回fcgi,结果丫还是没加载新版的php.ini。回想起来我操作都太急了,没有让机器闲着,也许闲一下它就会重新加载了呢?过了几分钟,它真的重新加载了。试着运行了一下相关用到gmp的功能,正常了。又看了一眼phpinfo,里面出现gmp了。终于,一切又正常了。

 

发表在 老当益愤 | 留下评论

被sothink swf decompiler阴了一把

好久没写了,今天再灌一篇。

一个flash小游戏里的TEA算法,hack一把,结果发现,decompile出来的as,改成js运行后,得到的结果跟原游戏运算出的结果是不一样的。

心想难道js跟as有些差别?不得已,去下了一个adobe flash cs3。

发现自己快不会用flash了,还是flash5时学了几天,做了点皮毛,主要也是那时为了应付交了一下某堂课的作业。想起来当时那老师也很好心,这个flash作业给了我满分。

不过今天对flash cs3感觉 很不顺手了。一开始就遇到个问题 ,在cs3中如何使用外部类?直接写一个,报错误“类不能嵌套”,搜了一把是写在一个.as文件里,就写在一个TEA.as里。

加入代码 import TEA; 结果又报错,说TEA没有实现,查文档,原来说是要放到一个包(package)里。那就放吧,放完发现还是不对,最后看了一下flash自己的实现,终于整明白了。先建一个crypto的文件夹,在里面建个TEA.as,代码这样:

package crypto{ //crypto要跟文件夹名一致。

public class TEA{ //TEA跟文件名即TEA.as一致。public好像不能少。

…//省略

}

}

OK,可以运行了,然后发现,其实另存为flash 8的文档,就可以直接用不放在包里的TEA.as!晕倒。

运行发现,这个flash得到的结果跟html里的js算出来是一样的。敢情从下载flash起,事情就白做了。

最后没办法,回到sothink swf decompiler中,仔细看,看到一个疑点:

var _loc11 = 2.671213E+009;

为什么是这样呢?算法中不应有这样的代码。打开raw code,找到这一行:

 //96 09 00 06 ef e6 e3 41 00 00 20 37
 _push 2.67121e+009

对比一下其它的_push语句,发现ef e6 e3 41 00 00 20 37 是一个double值。

写个小程序:

 
debian:~# cat t2.c
#include <stdio.h>
 
int main()
{
        double d = 2.67121e+009;
        unsigned char * p = (unsigned char*)&d;
 
        int i;
        for ( i=0; i<8; ++i)
        {
                printf("%02x ", p[i]);
        }
        printf("\n");
        return 0;
}
debian:~# gcc t2.c 
debian:~# ./a.out
00 00 00 c2 ed e6 e3 41

对比00 00 00 c2 ed e6 e3 41 与ef e6 e3 41 00 00 20 37

只有一点儿不同,原double值应该是00 00 20 37 ef e6 e3 41

好,这样: printf(“%.14g\n”, *(double*)”\x00\x00\x20\x37\xef\xe6\xe3\x41″);

得到: 2671212985

这就是正确的原flash的设定值。

修改一下TEA.as:

var _loc11 = 2.671213E+009;改为:

var _loc11 = 2671212985;

再运行一把,成功!算出来的值跟原flash是一样的,可以互相加/解密。

总结一下:sothink swf decompiler太土,居然不会用最恰当的方法格式化double值。bs之。

另外把TEA.as贴出来,版权不归我所有,是RE出来的,原作者如果有意见,请聊系本人删除。

hilight不支持actionscript,当就是javascript好了,反正差不多。

贴的这个是flash8格式,在CS3中使 用要放入一个 package里,前面说过了。

 
class TEA
{
    function TEA()
    {
    } // End of the function
    static function encrypt(src, key)
    {
        if (!key || key.length == 0)
        {
            key = "9F3779B99F3779B9";
        } // end if
        var _loc4 = TEA.charsToLongs(TEA.strToChars(src));
        var _loc9 = TEA.charsToLongs(TEA.strToChars(key));
        var _loc8 = _loc4.length;
        if (_loc8 == 0)
        {
            return ("");
        } // end if
        if (_loc8 == 1)
        {
            _loc4[_loc8++] = 0;
        } // end if
        var _loc2 = _loc4[_loc8 - 1];
        var _loc3 = _loc4[0];
        var _loc11 = 2671212985;
        var _loc5;
        var _loc7;
        var _loc10 = Math.floor(6 + 52 / _loc8);
        var _loc6 = 0;
        while (_loc10-- > 0)
        {
            _loc6 = _loc6 + _loc11;
            _loc7 = _loc6 >>> 2 & 3;
            for (var _loc1 = 0; _loc1 < _loc8 - 1; ++_loc1)
            {
                _loc3 = _loc4[_loc1 + 1];
                _loc5 = (_loc2 >>> 5 ^ _loc3 << 2) + (_loc3 >>> 3 ^ _loc2 << 4) ^ (_loc6 ^ _loc3) + (_loc9[_loc1 & 3 ^ _loc7] ^ _loc2);
                _loc2 = _loc4[_loc1] = _loc4[_loc1] + _loc5;
            } // end of for
            _loc3 = _loc4[0];
            _loc5 = (_loc2 >>> 5 ^ _loc3 << 2) + (_loc3 >>> 3 ^ _loc2 << 4) ^ (_loc6 ^ _loc3) + (_loc9[_loc1 & 3 ^ _loc7] ^ _loc2);
            _loc2 = _loc4[_loc8 - 1] = _loc4[_loc8 - 1] + _loc5;
        } // end while
        return (TEA.charsToHex(TEA.longsToChars(_loc4)));
    } // End of the function
    static function decrypt(src, key)
    {
        if (!key || key.length == 0)
        {
            key = "9F3779B99F3779B9";
        } // end if
        var _loc4 = TEA.charsToLongs(TEA.hexToChars(src));
        var _loc9 = TEA.charsToLongs(TEA.strToChars(key));
        var _loc8 = _loc4.length;
        if (_loc8 == 0)
        {
            return ("");
        } // end if
        var _loc2 = _loc4[_loc8 - 1];
        var _loc3 = _loc4[0];
        var _loc10 = 2671212985;
        var _loc6;
        var _loc7;
        var _loc12 = Math.floor(6 + 52 / _loc8);
        for (var _loc5 = _loc12 * _loc10; _loc5 != 0; _loc5 = _loc5 - _loc10)
        {
            _loc7 = _loc5 >>> 2 & 3;
            for (var _loc1 = _loc8 - 1; _loc1 > 0; --_loc1)
            {
                _loc2 = _loc4[_loc1 - 1];
                _loc6 = (_loc2 >>> 5 ^ _loc3 << 2) + (_loc3 >>> 3 ^ _loc2 << 4) ^ (_loc5 ^ _loc3) + (_loc9[_loc1 & 3 ^ _loc7] ^ _loc2);
                _loc3 = _loc4[_loc1] = _loc4[_loc1] - _loc6;
            } // end of for
            _loc2 = _loc4[_loc8 - 1];
            _loc6 = (_loc2 >>> 5 ^ _loc3 << 2) + (_loc3 >>> 3 ^ _loc2 << 4) ^ (_loc5 ^ _loc3) + (_loc9[_loc1 & 3 ^ _loc7] ^ _loc2);
            _loc3 = _loc4[0] = _loc4[0] - _loc6;
        } // end of for
        return (TEA.charsToStr(TEA.longsToChars(_loc4)));
    } // End of the function
    static function charsToLongs(chars)
    {
        var _loc3 = new Array(Math.ceil(chars.length / 4));
        for (var _loc1 = 0; _loc1 < _loc3.length; ++_loc1)
        {
            _loc3[_loc1] = chars[_loc1 * 4] + (chars[_loc1 * 4 + 1] << 8) + (chars[_loc1 * 4 + 2] << 16) + (chars[_loc1 * 4 + 3] << 24);
        } // end of for
        return (_loc3);
    } // End of the function
    static function longsToChars(longs)
    {
        var _loc3 = new Array();
        for (var _loc1 = 0; _loc1 < longs.length; ++_loc1)
        {
            _loc3.push(longs[_loc1] & 255, longs[_loc1] >>> 8 & 255, longs[_loc1] >>> 16 & 255, longs[_loc1] >>> 24 & 255);
        } // end of for
        return (_loc3);
    } // End of the function
    static function charsToHex(chars)
    {
        var _loc4 = new String("");
        var _loc3 = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f");
        for (var _loc1 = 0; _loc1 < chars.length; ++_loc1)
        {
            _loc4 = _loc4 + (_loc3[chars[_loc1] >> 4] + _loc3[chars[_loc1] & 15]);
        } // end of for
        return (_loc4);
    } // End of the function
    static function hexToChars(hex)
    {
        var _loc3 = new Array();
        for (var _loc1 = hex.substr(0, 2) == "0x" ? (2) : (0); _loc1 < hex.length; _loc1 = _loc1 + 2)
        {
            _loc3.push(parseInt(hex.substr(_loc1, 2), 16));
        } // end of for
        return (_loc3);
    } // End of the function
    static function charsToStr(chars)
    {
        var _loc3 = new String("");
        for (var _loc1 = 0; _loc1 < chars.length; ++_loc1)
        {
            _loc3 = _loc3 + String.fromCharCode(chars[_loc1]);
        } // end of for
        return (_loc3);
    } // End of the function
    static function strToChars(str)
    {
        var _loc3 = new Array();
        for (var _loc1 = 0; _loc1 < str.length; ++_loc1)
        {
            _loc3.push(str.charCodeAt(_loc1));
        } // end of for
        return (_loc3);
    } // End of the function
} // End of Class
发表在 破解狂 | 标签为 , , | 留下评论

N72手机开发软件部署过程

我的手机是N72,唉,不先进。

去年给N72写了个软件,现在发现服务器升级用不了了。于是决定改一下。原来配软件花了好久好久,现在发现不太会配了,又折腾了好久才搞定,赶快把过程记下来:

  1. 安装j2re-1_4_2_16-windows-i586-p.exe,不能装新版的或旧版的。//shit
  2. 安装WinPcap_3_1.exe,不能装新版的或旧版的。//shit 2.
  3. 安装ActivePerl-5.6.1.635-MSWin32-x86,不能装新版的或旧版的。//shit 3.
  4. 安装carbide.c++_v1.2.exe。(download from nokia)
  5. 安装s60_2nd_sdk_fp3(其它版本不能用于N72)

都装完了后,模拟器可以运行了。但是还是不能上网。记得去年折腾了好多天才搞定,现在总结只要两步走:

首先,在模拟器选项里设好IP,子网掩网,网关,DNS等信息。

然后,关掉模拟器,运行两条命令:

C:\Symbian\8.1a\S60_2nd_FP3\Epoc32\Data>set EPOCROOT=\Symbian\8.1a\S60_2nd_FP3\
C:\Symbian\8.1a\S60_2nd_FP3\Epoc32\Data>perl ../tools/configchange.pl –config ethernetWithCommDB –kernel EKA1 –target winscw –variant UDEB
就可以了,注意第二条命令运行的目录不能错。

这样就可以上网了,用慢得像坨屎的carbide c++开发吧。另外这个s60_2nd_sdk_fp3还有几个大BUG,又是一坨屎啊。

最后,发现carbide用bld.inf文件导入的文件,不会生成.sis文件,又折腾了我好久才搞定!!方法,自己去修改pkg文件,然后手动调用makesis.exe,没啥别的办法。创建的工程carbide是会给生成.sis的,一旦把这个工程移除后再导入,就怎么也不会生成sis了,再一次说:shit!

生成sis文件命令:

C:\Symbian\8.1a\S60_2nd_FP3\Epoc32\tools\makesis.exe  myproj__.pkg output.sis -v

其中myproj__.pkg是从myproj.pkg改来,手动把其中的$(EPOCROOT)等宏展开。

 

最后,我的程序修正了服务器数据识别,又可以使用了。 真是够折腾的。

发表在 开发 | 留下评论

用户多就是麻烦啊

QQ2009 里的系统表情替换方案,要上四套:
1. 特殊像征符号,如/:)
2. 汉字拼音缩写,如/dk
3. 英文,如/kiss
4. 汉字原文,如 /大笑

其中2和4,已经发布版还没有,但不少用户强烈要求加上。
不同的人要求不同,奇怪的是有用户想要4这个方式。唉,谁让用户是上帝呢,这种东西,最后还是要做啊。

发表在 日经 | 一条评论

为灾区捐了500元

不多,几天前捐的,聊表寸心。

写一句。愿早点渡过灾难。

发表在 日经 | 留下评论

招商银行关远程桌面之原理与解决方案

招商银行网上银行客户端关远程桌面,已经不是一天两天了,任用户怎么骂也没有用。它就是要关。

不过,在我这xp sp3上,它却没有关掉。很奇怪。但同一个招行专业版,都是最新的MG5.5.1.2,在win2k3上还是一样关我的远程。

远程桌面我并不常用,但偶尔想用时发现被招行关了也挺麻烦的。所以就研究了一下它的原理。发现其实挺简单的:

右击我的电脑=>属性=>远程,在这里,如果勾上允许远程 连接并应用,则注册表

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server

下的fDenyTSConnections为0,如果去掉勾并应用,则为1.

同样,如果在regedit里把fDenyTSConnections改为1,则远程 那里的允许远程连接的勾被去除。如果设为0,则勾被启用。这样即可看出,招行就是改了一下这个注册表项而已。所以相应地,就会有以下这些解决方案:

  1. 修改招行客户端,使它不修改这个注册表项。(我想修改完后招行客户端可能就运行不起来了,就算可以运行也没有人敢运行了)
  2. 修改远程桌面的服务端,让它不读取这个注册表值,或者读取完后不判是否为1. 这个方案是可行的而且比较好的。不过我不常用远程,就懒 得折腾了。
  3. 啥也不改,每次要远程连接之前,远程修改一下注册表项,就可以连了。

对于我这种不常用远程的人来说,方案3最好用。于是每次远程前,执行以下命令:

 
net use “\\home\ipc$” * /user:administrator
 
reg add ”\\home\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server“  /v  fDenyTSConnections /t REG_DWORD /d 0 /f

注意:这里的home是连接的机器名或IP。如果你要连的机器名叫abcdef,就把home改为abcdef

就可以了,修改是即时生效的,可能是远程桌面服务端在不停的读取注册表。这种方案需要打开远程注册表服务,对于原版windows是默认打开的,对于精简版即俗称野鸡版的,有没有这个服务都难说,如果有就要手动打开。这个服务并不危险,相对于开了远程服务的人来说。

常用远程的人可以试一下方法2。肯定有办法做到的。

此外,在此之前曾想过设置注册表权限禁止修改fDenyTSConnections 值,结果发现不行。招行网银客户端直接报错退出。

发表在 软件使用 | 4条评论

一个有意思的warning.

今天看下属的代码才发现的,之前还真没碰到过。

 
#include <stdio.h>
int main()
{
        for (int i=0; i<10; ++i)
        {
                for (int i=0; i<10; ++i)
                {
                        ;
                }
                int x = i;
        }
        return 0;
}

gcc编译:

 
debian:~$ gcc t.cc
t.cc: In function ‘int main()’:
t.cc:10: warning: name lookup of ‘i’ changed
t.cc:4: warning:   matches this ‘i’ under ISO standard rules
t.cc:6: warning:   matches this ‘i’ under old rules

vc编译:

 
D:\tmp>cl c.cc
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
 
Copyright (C) Microsoft Corporation.  All rights reserved.
 
c.cc
c.cc(10) : warning C4258: 'i' : definition from the for loop is ignored; the def
inition from the enclosing scope is used
        c.cc(6) : definition of 'i' ignored
        c.cc(4) : definition of 'i' used

如果去掉int x = i;那一行,就没有这个warning。

这个倒也比较好理解,按照旧规则和新规则,int x=i有两种不同的解释,分别对应两个不同scope里的i。所以就给个warning。

发表在 开发 | 留下评论