php6は、正常に動作しましたが
現行のバージョンは以下のコードでエラーが起きます
UTF8の文字に対してdirnameは、問題ないですが
現状 utf8でファイル名を取得できるのか?
// bug: php 5.3.3 , 5.2.14
// (php6:ok)
mb_language("ja");
mb_internal_encoding("SJIS");
$path = "c:\\tmp\\".chr(0x83).chr(0x8b); // japanese common charset (katakana ru)
$file = $path."\\test.txt"; // c:\tmp\ル\test.txt
printf(" \$file : %s\n" , $file);
printf(" dirname(\$file) : %s\n\n" , dirname($file));
if ( strcasecmp($path , dirname($file)) != 0 ) exit(" error : bug\n");
print "ok \n";
?>
» 続きを読む
ということで、変換が必要になります。
公式サイトから、sqlite.exe sqlite3.exeをダウンロードします
(※sqlite.exe(sqlite-2_8_17.zip): ソース sqlite-2.8.17.tar.gz)
コマンドプロンプトなどで
変換するコマンド
直接生成する場合
sqlite.exe old.db .dump | sqlite3.exe new.db
一度テキストに保存したい場合
sqlite.exe old.db .dump > old_db_dump.sql
ここで、必要に応じて、old_db_dump.sqlを修正します
sqlite3.exe new.db < old_db_dump.sql
※問題点
sqlite.exe(2.8.17) のダンプがキーワードをエスケープしない欠陥があるので
定義済みキーワードを使ったテーブル、列名などがある場合、
取り込みでエラーを起こす可能性があります
その場合、一度テキストにダンプして一括修正後、取り込みが必要になります
sqlite3.exeのダンプでは、問題ないようです。
例 sqlite.exe のダンプ: INSERT INTO item VALUES(1);
例 sqlite3.exe のダンプ: INSERT INTO "item" VALUES(1);
例: create table "where" (id text);
INSERT INTO "where" VALUES(1);
追記
sqlite.exe(sqlite 2.8.17)のパッチ
sqlite-2.8.17-47fee16ba9bd8ab2.diff
--- SQLite-47fee16ba9bd8ab2/src/shell.c 2007-01-08 16:20:28.000000000 +0900
+++ SQLite-47fee16ba9bd8ab2/src/shell.c 2010-11-04 23:00:00.000000000 +0900
@@ -421,7 +421,7 @@
p->zDestTable = 0;
}
if( zName==0 ) return;
- needQuote = !isalpha(*zName) && *zName!='_';
+ needQuote = *zName!='_';
for(i=n=0; zName[i]; i++, n++){
if( !isalnum(zName[i]) && zName[i]!='_' ){
needQuote = 1;
追記: 2011.12
バイナリデータを含んでいた場合、DUMPに失敗することがわかりました。
patch2を作りました。
別記事になります。
sqlite patch p2
で検索してください。
めざせ.Netアプリケーション
利点
・開発環境のバグから大幅に解放される
・ソフト開発に専念できる
・豊富な.Netライブラリを利用できる
・参考書がたくさん
・質問コーナーもたくさん
・熟練ユーザーもたくさん
欠点
・配布アセンブリの暗号化が必要で高価。
チューブの破けた自転車と新幹線くらいの差ですよ
もう時代は .Net
破けたチューブを自分で直せない人は、.Netに乗り換えるべし
編集:2010.1.11
編集:2016.04.01
アプリケーションがエラーで強制終了する仕様は
version 1.7 (リビジョン: 51739 日時: 2016年2月28日 16:33:49)
で、改善されました
今日の講義は、lazarus で作ったアプリケーションのエラー時の動作変更です。
今日の材料: lazarus 0.9.29
既定では、エラーが発生すると、強制終了しますか?と尋ねてきます。
間違って、OK以外を選択すると、Haltを呼び出し アプリケーションが消滅します。
データを扱っているアプリケーションの場合、この動作が致命的な場合もあります。
【まとめ】
- 最新版では、この不具合は修正されています
アプリを Lazarus Version1.8 以降でコンパイルしなします
- Lazarus Version1.7 以前の場合
procedure TForm1.FormCreate(Sender: TObject);
begin
with Application do Flags := Flags + [AppNoExceptionMessages];
end;
procedure TForm1.ApplicationProperties1Exception(Sender: TObject; E: Exception);
begin
{ uses節にLCLTypeを追加します }
with Application do
MessageBox(PChar(E.Message),PChar(Title),MB_OK+MB_ICONERROR);
end;
今日のキーワード:
lazarus
Exception
Press OK to ignore and risk data corruption. Press Cancel to kill the program.
Application.Flags
AppNoExceptionMessages
like Delphi
Delphi2005付属のDemeanorとフリーなNanDoKuをさわってみる
今日のDelphiの講義は、難読化です
みなさん用意はいいですか
聴講料は無料なので安心してください(^▽^;
【はじめに】
.netで作成した、exeファイルは、簡単に類似ソースコードに戻すことができるそうです。
実際、.net自体に低級言語に戻すildasmツールが付属しています
この非常に狭い地球には、任意の.net高等言語に戻すフリーツールも出回っているようです
これは、普通の開発者にとって脅威です
このことは利用するユーザーには、全く利もなく害もないのですが、
開発側にしてみれば多言語間で簡単に呼び出せるようにした弊害なのでしょう。
そこで、そのようなツールで、ソースコードに戻しても
変数名やクラス名をグチャグチャに変更して
- 「人が見ても理解し難いソース」
- 「そのまま使うとコンパイラエラーを起こし、手を加えないと使えないものにしてしまう」
- 「コードを流用する気力を根こそぎ奪う」
- 「動作原理を理解し難くして隠蔽する」
- 「名前短縮によりexeサイズの縮小を期待する」
などいろいろな目的の元で変換を行うのが .netの難読化ツールです
さいわいDelphi2005に付属しているのでインストールしておきましょう。
(冊子 Quick Start P.5)
【Demeanorの準備】
まず、パスが遠いのでユーザーの環境変数に
フルパスを登録すると便利です
PATHにパスを登録してもいいのですが、あまり長くなるのが好きではないので
ここでは、個別の環境変数を作成することにします。
環境変数 Demeanor を作成し、そこにフルパス
"C:\Program Files\Wise Owl, Inc\Demeanor for .NET, Personal Edition\Demeanor"
を登録しました
【Demeanorの使い方】
%Demeanor% dotnet実行ファイル名
PATHが取っている場合は
Demeanor dotnet実行ファイル名
で 難読化済みexe が作成できます
Demeanorフォルダに変更されたexeができます
出力先は、/out:パス
で変更できます
変換方法を変更するには
既定値 | /names:alpha |
/names:numeric | |
/names:Unicode |
その他詳しくは、DOSプロンプトを起動して、
Demeanor /?
で確認しましょう
【ildasm】
ildasm
"C:\Program Files\Microsoft.NET\SDK\v1.1\Bin\ildasm.exe"
のショートカットを作って置くと便利です
ildasmにできたファイルを投げ入れると
どの程度exeが書き換えられたか閲覧できます
DelphiでC#のexeを作ったものはかなり変更されたかなという感じを受けます
delphi.netのexeには、あまり変更が加わっていない気がします。
次に
NanDoKuというフリーソフトを使ってみましょう
【NanDoKu】
ということで
うーん、こ、これは・・・
delphi.netのexeにそのまま使うと飛びます
■まず、設定を開き コンパイラのildasm.exeを正しいパスに変更しましょう
■Nandokuデフォルトオプションだと
delphi.netのexeは、飛びます
オプションを変更して飛ばないようにします
変換項目の設定と作ったexeの動作 | |
○ | 名前空間 |
× | クラス名 |
×× | メソッド |
○ | プロパティ |
× | クラス変数とイベント |
○ | メソッド引数 |
○ | ジェネリックの型パラメータ |
Nandokuで作ったexeを実行した時 ○は、動作 ×は、実行時エラー発生 ××は、exe作成できず この表は、NanDoKu 3.1.0 に 空の Delphi.net TFormアプリケーション を入力としました |
変換項目の設定
メソッド
にチェックがあると
---------------------------
難読化失敗
---------------------------
難読化に失敗しました。
原因不明のエラーが発生しました
---------------------------
■exe→Demeanor→Nandoku
とするとNandokuで飛びます
●exe→Nandoku→Demeanor
という手順だと飛ばないようです
(この処理はバッチ処理すると楽です)
ildasmで確認をすると
適度に難読化がかかった感じでいい感じです。
Delphi2005でVB,C#のコードから作成したexeファイルの場合は、
メソッド名も変更されるので
難読化効果がさらにあるような気がします。
Delphi2005 C#で作った単純なアプリケーションをDemeanorで変換し、ildasm で表示した様子。
執筆:2008.1.31 おかめりん