CodeReverseは、片山博文MZが開発している、Windows用の逆アセンブラ兼ダンプツールです。
最終的には「リバーシブルな」逆コンパイラを目指しています。
CodeReverse公式サイト
http://katahiromz.web.fc2.com/codereverse/
GitHubレポジトリはこちら
https://github.com/katahiromz/CodeReverse
逆コンパイラCodeReverseを作る
■ このスレッドは過去ログ倉庫に格納されています
1片山博文MZコスモ ◆T6xkBnTXz7B0
2013/09/24(火) 14:58:48.34267デフォルトの名無しさん
2015/03/25(水) 18:23:14.55ID:0ab+jORs 敗北宣言乙www
269片山博文MZ ◆T6xkBnTXz7B0
2015/03/25(水) 20:18:57.15ID:0It7vtDM 宿題スレを荒らしてたのは俺じゃねーぜ。勘違いするな、Qzさん
270デフォルトの名無しさん
2015/03/25(水) 21:57:58.65ID:0ab+jORs 反応を待たずにレスをして何を焦っているのかな?www
271片山博文MZ ◆T6xkBnTXz7B0
2015/03/25(水) 22:43:10.00ID:0It7vtDM あの宿題はQzが居なくてもできるよ
272デフォルトの名無しさん
2015/03/25(水) 23:56:31.13ID:0ab+jORs ちゃんと"さん"をつけろよ若僧
273デフォルトの名無しさん
2015/03/26(木) 00:14:21.84ID:by79hXzC before: 宿題スレを荒らしてたのは俺じゃねーぜ。勘違いするな、Qzさん
v
after:あの宿題はQzが居なくてもできるよ
ウリのすぐバレる嘘ニダwww
v
after:あの宿題はQzが居なくてもできるよ
ウリのすぐバレる嘘ニダwww
274片山博文MZ ◆T6xkBnTXz7B0
2015/03/26(木) 01:50:45.61ID:H3hSXcrb 少なくともお下品な発言はしていない。
275デフォルトの名無しさん
2015/03/26(木) 02:31:26.49ID:KfdRsObn Qzさんだって下品な発言はしないし、大体お前のようにすぐバレる嘘をつくほどマヌケじゃない。
276片山博文MZ ◆T6xkBnTXz7B0
2015/03/29(日) 17:36:15.54ID:v4NwZmHf277片山博文MZ ◆T6xkBnTXz7B0
2015/03/29(日) 17:39:38.81ID:v4NwZmHf マクロ定数が正しく読み込めなければ、Win32 APIとは言えないので、
何とかがんばっているところ。
何とかがんばっているところ。
278片山博文MZ ◆T6xkBnTXz7B0
2015/04/01(水) 13:41:40.89ID:bTV2IHQs 2015年4月1日
Wonders API公開。
(動画) こんにちは、Wonders APIです
http://youtu.be/MSs4vto5u18
(Movie) Hello, this is Wonders API.
https://youtu.be/TvQZwOMPc8s
公式サイト
http://katahiromz.esy.es/wonders/
GitHubレポジトリ
https://github.com/katahiromz/DoWonders
Wonders API公開。
(動画) こんにちは、Wonders APIです
http://youtu.be/MSs4vto5u18
(Movie) Hello, this is Wonders API.
https://youtu.be/TvQZwOMPc8s
公式サイト
http://katahiromz.esy.es/wonders/
GitHubレポジトリ
https://github.com/katahiromz/DoWonders
279片山博文MZ ◆T6xkBnTXz7B0
2015/04/01(水) 13:55:05.94ID:bTV2IHQs いざ、第二ステージへ進め
280デフォルトの名無しさん
2015/04/03(金) 23:48:07.06ID:Nu5+KNg9 がんばれー
このスレから出てこないでね^^
このスレから出てこないでね^^
281デフォルトの名無しさん
2015/04/04(土) 00:02:02.48ID:vxW5Ds1X 47氏は崇拝されていたが、片山は軽蔑される
人格上の問題なのではないか?
人格上の問題なのではないか?
282デフォルトの名無しさん
2015/04/04(土) 18:35:11.56ID:AbppvLIl 片山ウザい氏ね
283デフォルトの名無しさん
2015/04/08(水) 00:10:56.21ID:yyUMrqSU こいつがあちことで出没するとスレが過疎るからやめてほしい
284片山博文MZ ◆T6xkBnTXz7B0
2015/04/08(水) 22:14:13.74ID:GMSIP3gO 約束のdeadlineは五月一日。それまでにWonders API Webを完成しないといけない。
285片山博文MZ ◆T6xkBnTXz7B0
2015/04/11(土) 21:01:51.44ID:ArDgKFW5 今、複合値とデータのバイナリーダンプのサポートに取り組
んでいるところ。明日、リリースの予定。
んでいるところ。明日、リリースの予定。
286片山博文MZ ◆T6xkBnTXz7B0
2015/04/12(日) 16:04:08.09ID:W8Ttx0kU287片山博文MZ ◆T6xkBnTXz7B0
2015/04/12(日) 17:44:44.25ID:Q9tFpytA288片山博文MZ ◆T6xkBnTXz7B0
2015/04/19(日) 19:24:52.19ID:Kws6M3Sz 株価が下がってる。動かない方がいいかな。
289片山博文MZ ◆T6xkBnTXz7B0
2015/05/02(土) 19:19:00.58ID:gAnCVUja Wonders APIをCodeReverseに取り込んで、CodeReverseのCパース箇所を破棄だ。
これでCodeReverseで型情報が使える。
GWにネットカフェが空いてないから、更新が遅くなるかも。
これでCodeReverseで型情報が使える。
GWにネットカフェが空いてないから、更新が遅くなるかも。
290片山博文MZ ◆T6xkBnTXz7B0
2015/05/03(日) 10:32:26.72ID:EPJ3sWKW よし、x86アセンブリを読みまくって勉強するぜ!
291片山博文MZ ◆T6xkBnTXz7B0
2015/05/05(火) 13:34:39.52ID:p1RbtT4Y CPU貸そうか?
292片山博文MZ ◆T6xkBnTXz7B0
2015/05/05(火) 17:34:29.60ID:p1RbtT4Y CPUレジスターや仮想的なアドレス空間の任意の抽象的な場所にアクセスするための全射なアドレスを文字列で表現する。
expressed address、略してexpr_addr。
expr_addrを解決すると未知の値、シンボル、もしくは具体的な値が得られる。
また、expr_addrから型の集合への写像を作ることができる。
expressed address、略してexpr_addr。
expr_addrを解決すると未知の値、シンボル、もしくは具体的な値が得られる。
また、expr_addrから型の集合への写像を作ることができる。
293片山博文MZ ◆T6xkBnTXz7B0
2015/05/05(火) 17:47:11.75ID:p1RbtT4Y 値の集合とシンボルの集合と型の集合が存在する。
値やシンボルはその格納場所(storage)によって類別できる。
格納場所は、スタック、ヒープ、レジスター、実行可能コード領域、その他のデータ領域などが挙げられる。
expr_addrから値やシンボルへの写像が存在する。
expr_addrから格納場所への写像が存在する。
値やシンボルはその格納場所(storage)によって類別できる。
格納場所は、スタック、ヒープ、レジスター、実行可能コード領域、その他のデータ領域などが挙げられる。
expr_addrから値やシンボルへの写像が存在する。
expr_addrから格納場所への写像が存在する。
294片山博文MZ ◆T6xkBnTXz7B0
2015/05/05(火) 18:06:31.59ID:p1RbtT4Y では、expr_addrの具体的な定義を決めよう。
(ea.1) expr_addrが数値ならばexpr_addrはexpr_addrが表す値の仮想アドレスを指し示す。
(ea.2) expr_addrがレジスターの名前ならばexpr_addrはそのレジスターの値が表す仮想アドレスを指す。
(ea.3) expr_addrが__cr.xxx[yy]といった文字列ならば、__cr.の後のxxxはストレージの名前であり、expr_addrはストレージxxxの(yy+1)バイト目を指し示す。
ここに、yyはexpr_addrである。
(ea.4) expr_addrに演算子+,-,*が含まれていれば、普通にexpr_addr上で足し算、引き算、掛け算を行う。
(ea.1) expr_addrが数値ならばexpr_addrはexpr_addrが表す値の仮想アドレスを指し示す。
(ea.2) expr_addrがレジスターの名前ならばexpr_addrはそのレジスターの値が表す仮想アドレスを指す。
(ea.3) expr_addrが__cr.xxx[yy]といった文字列ならば、__cr.の後のxxxはストレージの名前であり、expr_addrはストレージxxxの(yy+1)バイト目を指し示す。
ここに、yyはexpr_addrである。
(ea.4) expr_addrに演算子+,-,*が含まれていれば、普通にexpr_addr上で足し算、引き算、掛け算を行う。
295片山博文MZ ◆T6xkBnTXz7B0
2015/05/05(火) 18:49:16.52ID:p1RbtT4Y x86/x64のスタックは逆向きに成長するから、__cr.stackは特別扱いしなければならない。
296片山博文MZ ◆T6xkBnTXz7B0
2015/05/05(火) 19:59:48.40ID:p1RbtT4Y297片山博文MZ ◆T6xkBnTXz7B0
2015/05/06(水) 22:49:06.45ID:ROM3ZfOK コンパイラーなら型情報と構文に基づいてレジスター割り付けを行って、アセンブリを出力する。
逆コンパイラーはアセンブリから、オペランドと仮想アドレスに仮想的な値と
型を割り付け、それらを定数・変数・実引数・仮引数に抽象化し、式と構文を構築し、ソースを出力する。
逆コンパイラーはアセンブリから、オペランドと仮想アドレスに仮想的な値と
型を割り付け、それらを定数・変数・実引数・仮引数に抽象化し、式と構文を構築し、ソースを出力する。
298片山博文MZ ◆T6xkBnTXz7B0
2015/05/06(水) 23:19:53.32ID:ROM3ZfOK callの引数は関数アドレスであるから、それがAPI関数であれば、実引数や戻り値に型情報を付加できる。
代入においては同一の値になるオペランドが現れる。このとき、型も同一になる可能性が高い。
このようにオペランドや仮想アドレスやレジスターに型情報を再帰的に付加していく。
代入においては同一の値になるオペランドが現れる。このとき、型も同一になる可能性が高い。
このようにオペランドや仮想アドレスやレジスターに型情報を再帰的に付加していく。
299片山博文MZ ◆T6xkBnTXz7B0
2015/05/06(水) 23:32:41.79ID:ROM3ZfOK 仮想アドレス空間の状態は、プログラムの進行に従って遷移していく。
状態が変わる様子を再現するには、仮想マシンを作って動かしてみるのが、一番合理的だ。
状態が変わる様子を再現するには、仮想マシンを作って動かしてみるのが、一番合理的だ。
300片山博文MZ ◆T6xkBnTXz7B0
2015/05/06(水) 23:42:33.96ID:ROM3ZfOK 仮想マシンを動かすなら、アセンブリか中間言語のどちらのレイヤーで動かすべきか?
中間言語で動かすならば、アセンブリの情報をほとんどすべて中間言語に移行しなければならない。
中間言語で動かすならば、アセンブリの情報をほとんどすべて中間言語に移行しなければならない。
301片山博文MZ ◆T6xkBnTXz7B0
2015/05/07(木) 14:46:37.77ID:Eo5kGFlR GW明けて、ひさしぶりに更新。
CodeReverse
https://github.com/katahiromz/CodeReverse
Wonders API
http://katahiromz.esy.es/wonders/
CodeReverse
https://github.com/katahiromz/CodeReverse
Wonders API
http://katahiromz.esy.es/wonders/
302片山博文MZ ◆T6xkBnTXz7B0
2015/05/08(金) 19:46:46.08ID://zzhYF7 両方のレイヤーでやれってか? なら、2種類の仮想マシンを作らにゃあかんべえ。んだんだ。
303片山博文MZ ◆T6xkBnTXz7B0
2015/05/09(土) 02:41:25.84ID:IBcmzD7P 要件定義はもっと数学的に。。。
304片山博文MZ ◆T6xkBnTXz7B0
2015/05/09(土) 19:04:28.04ID:IBcmzD7P 要件定義をよく考えると、中間言語パーサーは不必要と判断した。
305片山博文MZ ◆T6xkBnTXz7B0
2015/05/10(日) 15:22:46.73ID:DYHSUNsH いや、中間言語パーサーは必要。パーサーがなければ、アセンブリのでっかいアーキテクチャを
ハードコーディングしなきゃいけなくなる。恐らく中間言語はアトリビュートベースになる。
ハードコーディングしなきゃいけなくなる。恐らく中間言語はアトリビュートベースになる。
306片山博文MZ ◆T6xkBnTXz7B0
2015/05/10(日) 15:52:17.96ID:DYHSUNsH 中間言語では、新しい値ができるたびに明示的にそのインスタンスを宣言する。
インスタンスは型情報、入出力に関する情報、値やアドレスを表す式などの属性を持つ。
インスタンスは型情報、入出力に関する情報、値やアドレスを表す式などの属性を持つ。
307片山博文MZ ◆T6xkBnTXz7B0
2015/05/10(日) 23:19:17.50ID:DYHSUNsH アーキテクチャを中間言語のデータで表現しないといけない。
中間言語の設計も完成していないのに。。。!
中間言語の設計も完成していないのに。。。!
308片山博文MZ社外取補 ◆T6xkBnTXz7B0
2015/05/15(金) 19:04:30.75ID:hBLf1mma たぶん、値を宣言してそれらに変数を割り当ててくという考え方は間違ってない。
これでうまく行きそうだ。
これでうまく行きそうだ。
309片山博文MZ ◆T6xkBnTXz7B0
2015/05/17(日) 16:50:06.36ID:9xJgx9ER https://github.com/katahiromz/CodeReverse
ファイルarch_x32.datを追加した。
このファイルにx86アセンブリから中間コードへの変換方法を記述する。
不完全。
ファイルarch_x32.datを追加した。
このファイルにx86アセンブリから中間コードへの変換方法を記述する。
不完全。
310片山博文MZ ◆T6xkBnTXz7B0
2015/05/18(月) 23:19:00.85ID:GE/vKBW3 我に力と自由時間を与えたまえ!(画面がパパっと2回点滅)
311片山博文MZ ◆T6xkBnTXz7B0
2015/05/21(木) 17:40:24.92ID:Dn/bDwTc きれいなデータ作るの大変だ。。。
312片山博文MZ ◆T6xkBnTXz7B0
2015/05/24(日) 10:54:19.49ID:DJktPktd313片山博文MZ ◆T6xkBnTXz7B0
2015/05/24(日) 11:08:32.59ID:DJktPktd トップにarch_x86.dat/arch_x64.datという二つのファイルを用意したから、
これを元にして、アセンブリを中間言語に逐次翻訳する。
翻訳方法は、基本的にパターンマッチを基本とする。
これを元にして、アセンブリを中間言語に逐次翻訳する。
翻訳方法は、基本的にパターンマッチを基本とする。
314片山博文MZ ◆T6xkBnTXz7B0
2015/05/24(日) 17:02:17.64ID:tHPLTcxB 翻訳の戦略について。
まず、前述の翻訳辞書データを読み込み、パースする。
次に全体を走査して、邪魔者を消す。nopやmov ax,axやlea eax,[eax]の
ような、人間にとって無意味な命令を全部取り除く。
さらに全体を走査して、技巧的な命令を「標準語」に直す。
さらにさらに逐次的にパターンマッチしたものを次々と翻訳していく。
この戦略がうまく行けば、アセンブリはすべて中間言語に翻訳される。
まず、前述の翻訳辞書データを読み込み、パースする。
次に全体を走査して、邪魔者を消す。nopやmov ax,axやlea eax,[eax]の
ような、人間にとって無意味な命令を全部取り除く。
さらに全体を走査して、技巧的な命令を「標準語」に直す。
さらにさらに逐次的にパターンマッチしたものを次々と翻訳していく。
この戦略がうまく行けば、アセンブリはすべて中間言語に翻訳される。
315片山博文MZ ◆T6xkBnTXz7B0
2015/05/25(月) 13:43:46.90ID:IMA5vj+0 https://github.com/katahiromz/CodeReverse
流れグラフができた。リーダーのみ、ラベルを出力するようにした。
CR_ICode32, CR_ICode64を追加した。中間言語の定義とパースに移る。
流れグラフができた。リーダーのみ、ラベルを出力するようにした。
CR_ICode32, CR_ICode64を追加した。中間言語の定義とパースに移る。
316片山博文MZ ◆T6xkBnTXz7B0
2015/05/25(月) 14:34:58.39ID:IMA5vj+0 こういう翻訳処理の過程は、「ステージ」という考え方でとらえるとわかりやすい。
たとえば、ステージ0が逆アセンブルしていない状態。
ステージ1が逆アセンブルした状態。ステージ2が中間言語に翻訳された状態。
ステージ0→ステージ1→ステージ2→...
逆アセンブルしていないコードが現れた場合などでは、その部分ではステージを戻って処理しないといけない。
たとえば、ステージ0が逆アセンブルしていない状態。
ステージ1が逆アセンブルした状態。ステージ2が中間言語に翻訳された状態。
ステージ0→ステージ1→ステージ2→...
逆アセンブルしていないコードが現れた場合などでは、その部分ではステージを戻って処理しないといけない。
317片山博文MZ ◆T6xkBnTXz7B0
2015/05/25(月) 15:12:05.33ID:IMA5vj+0 https://github.com/katahiromz/CodeReverse
>>316の考え方に基づいて、CR_DecompInfo32::GetFuncStageを追加した。
DisAsm32の前処理をPrepareForDisAsm32に分離した。
>>316の考え方に基づいて、CR_DecompInfo32::GetFuncStageを追加した。
DisAsm32の前処理をPrepareForDisAsm32に分離した。
318片山博文MZ ◆T6xkBnTXz7B0
2015/05/25(月) 17:28:38.36ID:LQzNccs7 本格的なプログラム言語の設計は初めてだが、やれることはやってみよう。
319片山博文MZ ◆T6xkBnTXz7B0
2015/05/26(火) 20:34:04.58ID:4TU/edTg アドレッシングの複雑性を乗り越えてオペランドをパターンマッチするんだ!!!
320デフォルトの名無しさん
2015/05/29(金) 14:46:50.24ID:08TmNpAe 中間状態をベタテキストで表現する気か
321片山博文MZ ◆T6xkBnTXz7B0
2015/05/29(金) 14:59:26.15ID:huri9Ebb https://github.com/katahiromz/CodeReverse
Coding.cppにCrParamPatternMatchを追加した。
CrParamPatternMatchはパラメーターの抽象化されたコードの
パターンマッチを行う重要な関数だ。
>>320 仮想化のため。
Coding.cppにCrParamPatternMatchを追加した。
CrParamPatternMatchはパラメーターの抽象化されたコードの
パターンマッチを行う重要な関数だ。
>>320 仮想化のため。
322片山博文MZ ◆T6xkBnTXz7B0
2015/05/31(日) 13:09:28.79ID:7/EzM6AH https://github.com/katahiromz/CodeReverse
CodeReverse.hをCommon.hに改名。Testing.cppを追加。
Testing.cppで$0, $1, ...のパターンマッチを実証。
中間言語の名前がiCodeに決まった。これからiCodeを具体的に設計する。
CodeReverse.hをCommon.hに改名。Testing.cppを追加。
Testing.cppで$0, $1, ...のパターンマッチを実証。
中間言語の名前がiCodeに決まった。これからiCodeを具体的に設計する。
323片山博文MZ ◆T6xkBnTXz7B0
2015/05/31(日) 13:46:34.69ID:7/EzM6AH324片山博文MZ ◆T6xkBnTXz7B0
2015/06/21(日) 00:15:52.18ID:szDYpocA Java to C++ converter面白そう
ちょっと中断して読んでみるよ
ちょっと中断して読んでみるよ
325片山博文MZ ◆T6xkBnTXz7B0
2015/06/21(日) 00:30:07.35ID:szDYpocA GitHubにマルチ環境の要望があるが、アーキテクチャを仮想化・プラグイン化するのは面倒くさ。
Windows .exe以外のフォーマット知らないし。LinuxやMacって何? 今はexploitが欲しいだけ。
Windows .exe以外のフォーマット知らないし。LinuxやMacって何? 今はexploitが欲しいだけ。
326片山博文MZ ◆T6xkBnTXz7B0
2015/06/21(日) 00:38:25.90ID:szDYpocA 分かったよ、勉強すりゃあいいんだろ? でも真夜中は監視役が居るからダメ。
パソコンはインターネットにつながってないし、家の構造が昭和時代だからな。
本当は24時間パソコンしたいんだ。
パソコンはインターネットにつながってないし、家の構造が昭和時代だからな。
本当は24時間パソコンしたいんだ。
327デフォルトの名無しさん
2015/06/22(月) 09:59:26.27ID:Cd6p9ZPV 昔LightConeとかいう基地外がいたが片山とよく似ているな
スレと関係ない雑談や脈絡もない妄言とか。
スレと関係ない雑談や脈絡もない妄言とか。
328デフォルトの名無しさん
2015/06/24(水) 06:25:31.35ID:B9zFFoB0 日記スレ
329デフォルトの名無しさん
2015/07/21(火) 01:49:23.11ID:PRXZAEwH catcher
330片山博文MZ ◆T6xkBnTXz7B0
2015/07/31(金) 16:19:13.79ID:VnmYQE5l 何か、forkやstarが増えてきたぞ。。。
やらないとまずいかな。。。
やらないとまずいかな。。。
331デフォルトの名無しさん
2015/08/11(火) 23:30:28.66ID:3zaQ4vWk 逆コンパイルって解が無数にあるから
例えばナイーブな逆コンパイルは、Cでアセンブラをエミュレーションすることだし
他にもインライン展開されたコードは展開後として逆コンパイルするのか
展開前として逆コンパイルするのかとか
だからなんらかの人間にとっての読みやすさを定義して
無数の解の中でなるべく読みやすい解をどれか一つ選ぶっていう風にするのが
方向性だと思った
例えばナイーブな逆コンパイルは、Cでアセンブラをエミュレーションすることだし
他にもインライン展開されたコードは展開後として逆コンパイルするのか
展開前として逆コンパイルするのかとか
だからなんらかの人間にとっての読みやすさを定義して
無数の解の中でなるべく読みやすい解をどれか一つ選ぶっていう風にするのが
方向性だと思った
333デフォルトの名無しさん
2015/09/17(木) 22:00:14.74ID:8Go7kMps catcher
334デフォルトの名無しさん
2015/09/28(月) 23:38:38.61ID:Rm5LrJSE catcher
335デフォルトの名無しさん
2015/10/21(水) 22:40:13.55ID:jRXObvXq catcher
336デフォルトの名無しさん
2015/12/04(金) 14:02:32.26ID:Vm+g5Kgg catcher
337片山博文MZ ◆T6xkBnTXz7B0
2016/01/14(木) 14:17:10.78ID:H3jYOyT9 VeySicKの開発が一段落ついたのでCodeReverseの開発を再開するよ。
ひとまずゼロからCコンパイラを作ってみる。
ひとまずゼロからCコンパイラを作ってみる。
338片山博文MZ ◆T6xkBnTXz7B0
2016/01/14(木) 14:20:29.77ID:H3jYOyT9 こんなことなら、大学でコンパイラの作り方を勉強しとけばよかった。
339片山博文MZ ◆T6xkBnTXz7B0
2016/01/14(木) 19:54:25.45ID:H3jYOyT9 きつねさんのLLVMをAmazonで買ったよ! (もちろん中古)
340片山博文MZ ◆T6xkBnTXz7B0
2016/01/18(月) 17:06:17.14ID:roZ5xF5Q LLVMと.NETを組み合わせて何か面白いことをやれって言われてる。
341片山博文MZ ◆T6xkBnTXz7B0
2016/02/03(水) 19:01:53.20ID:PDk33kNH いずれにしても、だれかが教師になって、読みやすいコードを出力するための
教育を行わないとまともな逆コンパイラは完成しない。
さらには教育にはコミュニケーションが必要。
教育を行わないとまともな逆コンパイラは完成しない。
さらには教育にはコミュニケーションが必要。
342片山博文MZ ◆T6xkBnTXz7B0
2016/02/03(水) 19:21:23.48ID:PDk33kNH 逆コンパイルを数学的に考えると、
ソースコードからコンパイル結果への変換器「コンパイラ」の逆変換器を
求める問題になる。教育を行うなら、ソースコードと、実際にコンパイルした結果の対応を
学習させることになる。その対応は情報量が少ないことが望ましい。
ソースコードからコンパイル結果への変換器「コンパイラ」の逆変換器を
求める問題になる。教育を行うなら、ソースコードと、実際にコンパイルした結果の対応を
学習させることになる。その対応は情報量が少ないことが望ましい。
343片山博文MZ ◆T6xkBnTXz7B0
2016/02/03(水) 19:43:38.07ID:PDk33kNH 大きな変換器はより小さな変換器に分解される。
LLVMの言葉で言えば、変換器はpassであり、コンパイルはpassの合成である。
であるから、これから必要な作業は、1つひとつのpassの逆変換器を
求めることである。
LLVMの言葉で言えば、変換器はpassであり、コンパイルはpassの合成である。
であるから、これから必要な作業は、1つひとつのpassの逆変換器を
求めることである。
344片山博文MZ ◆T6xkBnTXz7B0
2016/02/03(水) 21:14:45.78ID:PDk33kNH 病気は我が精神を思索の森に誘ってくれる。
健全であれば気付かない事象にも出会うことができる。
今年のうちに逆コンパイラを作らねばならない。
たとえそれが世界を滅ぼす魔法でも完成させなければならない。
ボスの命令は絶対だ。
健全であれば気付かない事象にも出会うことができる。
今年のうちに逆コンパイラを作らねばならない。
たとえそれが世界を滅ぼす魔法でも完成させなければならない。
ボスの命令は絶対だ。
345片山博文MZ ◆T6xkBnTXz7B0
2016/02/20(土) 20:57:27.23ID:md57KSoZ clangのソースを読み始めたよ。
CMakeの使い方を勉強しないといけない。
examplesのPrintFunctionNamesを改造してみようっと。
CMakeの使い方を勉強しないといけない。
examplesのPrintFunctionNamesを改造してみようっと。
346片山博文MZ ◆T6xkBnTXz7B0
2016/02/21(日) 22:29:13.22ID:mZ9I4pVL CMakeをインストール。CMakeの基本的な使い方を覚えた。
llvmを仮想Ubuntuにapt-getでインストールして、ターンエンドだ。
llvmを仮想Ubuntuにapt-getでインストールして、ターンエンドだ。
347片山博文MZ ◆T6xkBnTXz7B0
2016/03/02(水) 22:55:08.79ID:v5tMoIR7 CMakeの使い方を勉強しながらテンプレートプロジェクトをいくつか
作成して、きつねさんを参考にLLVMのコマンドを何度か試してターンエンドだ。
作成して、きつねさんを参考にLLVMのコマンドを何度か試してターンエンドだ。
348片山博文MZ ◆T6xkBnTXz7B0
2016/03/05(土) 14:29:14.42ID:8Tx4+NgQ <llvm/IR/Type.h> 型
<llvm/IR/TypeBuilder.h> 型構築器
<llvm/IR/Constant.h> <llvm/IR/Constants.h> 定数
<llvm/IR/IRBuilder.h> IR構築器
<llvm/IR/Module.h> モジュール
<llvm/IR/Function.h> 関数
<llvm/IR/BasicBlock.h> 基本ブロック
<llvm/ADT/StringRef.h> 文字列参照
<llvm/ADT/StringMap.h> 文字列マップ
<llvm/MC/MCExpr.h> MC表現
<llvm/MC/MCInst.h> MC命令
<llvm/MC/MCValue.h> MC値
<llvm/MC/MCAssembler.h> MCアセンブラ
<llvm/MC/MCDisassembler.h> MC逆アセンブラ
<llvm/Support/MemoryBuffer.h> メモリバッファ
<llvm/Support/ErrorOr.h> エラーまたは
<llvm/Support/raw_ostream.h> 生出力ストリーム
<llvm/IR/TypeBuilder.h> 型構築器
<llvm/IR/Constant.h> <llvm/IR/Constants.h> 定数
<llvm/IR/IRBuilder.h> IR構築器
<llvm/IR/Module.h> モジュール
<llvm/IR/Function.h> 関数
<llvm/IR/BasicBlock.h> 基本ブロック
<llvm/ADT/StringRef.h> 文字列参照
<llvm/ADT/StringMap.h> 文字列マップ
<llvm/MC/MCExpr.h> MC表現
<llvm/MC/MCInst.h> MC命令
<llvm/MC/MCValue.h> MC値
<llvm/MC/MCAssembler.h> MCアセンブラ
<llvm/MC/MCDisassembler.h> MC逆アセンブラ
<llvm/Support/MemoryBuffer.h> メモリバッファ
<llvm/Support/ErrorOr.h> エラーまたは
<llvm/Support/raw_ostream.h> 生出力ストリーム
349片山博文MZ ◆T6xkBnTXz7B0
2016/03/05(土) 19:46:45.29ID:niBmwPNn DraperさんのFractureを解析してみるみる。。。
350片山博文MZ ◆T6xkBnTXz7B0
2016/03/07(月) 15:59:21.59ID:vq5fVXSL きつねさんの本は少々古く、最新版ではコマンドラインとヘッダーが
多少変わっているようだ。最新版に合わせないといけない。
また、MinGWでは動かない機能もあるようだ。
多少変わっているようだ。最新版に合わせないといけない。
また、MinGWでは動かない機能もあるようだ。
351片山博文MZ ◆T6xkBnTXz7B0
2016/03/08(火) 01:37:31.85ID:dCW2/Xzy $ opt -help > help.txt
多種多様なPassがあるぞ。まずはこれを解析してみるか。
MinGWで動かなかった分はCygwinで試すぞ。
多種多様なPassがあるぞ。まずはこれを解析してみるか。
MinGWで動かなかった分はCygwinで試すぞ。
352片山博文MZ ◆T6xkBnTXz7B0
2016/03/10(木) 19:08:02.83ID:xtkhTFvc 最新の仮想Ubuntu32bitと64bitをVMwareにインストール。
さらにclang-3.7とllvm-3.7をそれぞれにインストールして
俺のターンは終わりだ。
さらにclang-3.7とllvm-3.7をそれぞれにインストールして
俺のターンは終わりだ。
353片山博文MZ ◆T6xkBnTXz7B0
2016/03/10(木) 19:18:26.45ID:xtkhTFvc LLVMは型情報を完全には保持していないようだ。
Win32ではLONGとINTは同じサイズだが、それらのポインタ型は厳格に区別される。
しかしLLVM IRではどちらもi32となる。
つまり、LLVMやClangで構造体を読み込みその型をダンプしたとしても、
コンパイルできる代物にはならない。これでは逆コンパイラには
役に立たないのではないか? ここまで何か間違いがあれば、ご指摘願う。
Win32ではLONGとINTは同じサイズだが、それらのポインタ型は厳格に区別される。
しかしLLVM IRではどちらもi32となる。
つまり、LLVMやClangで構造体を読み込みその型をダンプしたとしても、
コンパイルできる代物にはならない。これでは逆コンパイラには
役に立たないのではないか? ここまで何か間違いがあれば、ご指摘願う。
354片山博文MZ ◆T6xkBnTXz7B0
2016/03/10(木) 19:46:26.45ID:xtkhTFvc Clangでは区別できてるんだから、LLVM IRよりも上位で保持しているはず。ならば、Clangで
構造体などの型情報をLLVM IRの上位でどのように扱っているかを調査しないといけないぞ。
構造体などの型情報をLLVM IRの上位でどのように扱っているかを調査しないといけないぞ。
355片山博文MZ ◆T6xkBnTXz7B0
2016/03/12(土) 22:12:12.37ID:PAxzfn3Q だいぶ解析が進んで来た。
おそらくキーワードは
clang::CompilerInstance,clang::Sema,clang::ASTContext,clang::Type
だろう。clangも大変再利用しやすい模範的なデザインになっており、
これらを組み合わせればclangの改造版が比較的容易に作れると思われる。
おそらくキーワードは
clang::CompilerInstance,clang::Sema,clang::ASTContext,clang::Type
だろう。clangも大変再利用しやすい模範的なデザインになっており、
これらを組み合わせればclangの改造版が比較的容易に作れると思われる。
356片山博文MZ ◆lx245xLQxvF1
2016/03/14(月) 15:23:13.72ID:+duuA6fB Clang-tutorialのmakefileのllvm-configをllvm-config-3.6に変えてメイクしてみた。
tutorial1.o: 関数 `main' 内:
/mnt/hgfs/cc/LLVM/Clang-tutorial/tutorial1.cpp:53: `llvm::sys::getDefaultTargetTriple()' に対する定義されていない参照です
なぜだ。。。分からぬ。
tutorial1.o: 関数 `main' 内:
/mnt/hgfs/cc/LLVM/Clang-tutorial/tutorial1.cpp:53: `llvm::sys::getDefaultTargetTriple()' に対する定義されていない参照です
なぜだ。。。分からぬ。
357片山博文MZ ◆T6xkBnTXz7B0
2016/03/14(月) 16:17:28.03ID:+duuA6fB いくら優れたライブラリでも、動かないと意味ない。。。
最新版をビルドしないといけないのか。。。
LLVMとClangのビルド、めっちゃ時間かかりそう。。。
最新版をビルドしないといけないのか。。。
LLVMとClangのビルド、めっちゃ時間かかりそう。。。
358片山博文MZ ◆T6xkBnTXz7B0
2016/03/15(火) 22:21:10.64ID:zLB+iwEH 仮想Ubuntuのディスク容量不足でビルド失敗。35GBくらいは必要か。
最初からやり直し。VMwareよりもVirtualBoxの方が使い易そうだ。
最初からやり直し。VMwareよりもVirtualBoxの方が使い易そうだ。
359片山博文MZ ◆T6xkBnTXz7B0
2016/03/24(木) 23:29:54.57ID:YnxOCpos VirtualBox上の仮想UbuntuでLLVM+Clangのビルドに成功した。
これでまずはスタートラインに立てた。可能ならば後で公開する。
これでまずはスタートラインに立てた。可能ならば後で公開する。
360片山博文MZ ◆T6xkBnTXz7B0
2016/03/24(木) 23:57:51.64ID:YnxOCpos 仮想環境のためか、ビルドに五日間かかった。電気代は高い請求額が来るだろう。
現在のオッズは低いが地道に頑張る。
現在のオッズは低いが地道に頑張る。
361片山博文MZ ◆T6xkBnTXz7B0
2016/03/25(金) 17:05:52.28ID:C4e13KV/ Ubuntu 14.04.4 LTS (64-bit)をインストール。ディスク容量50GB以上・メモリ2GB以上。
端末およびGhest Additions(仮想の場合のみ) インストール。
メモリが少ないときは、次のようにスワップ確保。
$ sudo dd if=/dev/zero of=/swap bs=400M count=16
$ sudo mkswap /swap
$ sudo swapon /swap
$ sudo gedit /etc/fstab
「/swap swap swap defaults 0 0」の行を最後に追加。
$ cat /proc/swaps
$ sudo apt update
$ sudo apt install build-essential
$ sudo apt install linux-headers-$(uname -r)
$ sudo apt install make
$ sudo apt install automake
$ sudo apt install cmake
$ sudo apt install subversion
$ sudo apt install gdb
$ sudo apt install perl
$ sudo apt install libtool
$ sudo apt install libncurses5-dev
$ sudo apt install valgrind
$ sudo apt install zlib1g-dev
$ sudo apt install libedit-dev
$ sudo apt install texinfo
$ sudo apt install python
$ sudo apt upgrade
端末およびGhest Additions(仮想の場合のみ) インストール。
メモリが少ないときは、次のようにスワップ確保。
$ sudo dd if=/dev/zero of=/swap bs=400M count=16
$ sudo mkswap /swap
$ sudo swapon /swap
$ sudo gedit /etc/fstab
「/swap swap swap defaults 0 0」の行を最後に追加。
$ cat /proc/swaps
$ sudo apt update
$ sudo apt install build-essential
$ sudo apt install linux-headers-$(uname -r)
$ sudo apt install make
$ sudo apt install automake
$ sudo apt install cmake
$ sudo apt install subversion
$ sudo apt install gdb
$ sudo apt install perl
$ sudo apt install libtool
$ sudo apt install libncurses5-dev
$ sudo apt install valgrind
$ sudo apt install zlib1g-dev
$ sudo apt install libedit-dev
$ sudo apt install texinfo
$ sudo apt install python
$ sudo apt upgrade
362片山博文MZ ◆T6xkBnTXz7B0
2016/03/25(金) 17:06:39.06ID:C4e13KV/ $ cd ~
$ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
$ cd llvm/tools
$ svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
$ cd ../projects
$ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
$ svn co http://llvm.org/svn/llvm-project/openmp/trunk openmp
$ svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
$ svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
//$ svn co http://llvm.org/svn/llvm-project/test-suite/trunk test-suite
//$ sudo apt uninstall llvm clang llvm-3.6 clang-3.6 llvm-3.7 clang-3.7
$ cd ~
$ mkdir llvm-build
$ cd llvm-build
$ cmake -G "Unix Makefiles" ../llvm
$ make -j1
$ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
$ cd llvm/tools
$ svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
$ cd ../projects
$ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
$ svn co http://llvm.org/svn/llvm-project/openmp/trunk openmp
$ svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
$ svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
//$ svn co http://llvm.org/svn/llvm-project/test-suite/trunk test-suite
//$ sudo apt uninstall llvm clang llvm-3.6 clang-3.6 llvm-3.7 clang-3.7
$ cd ~
$ mkdir llvm-build
$ cd llvm-build
$ cmake -G "Unix Makefiles" ../llvm
$ make -j1
363片山博文MZ ◆T6xkBnTXz7B0
2016/03/25(金) 23:58:54.73ID:ir49Z4lH >>361
訂正。ビルド&インストール成功のためにはディスクは100GB以上、
メモリーは8GB以上必要と思われる。
メモリーが充分あればスワップはデフォルトでOK。
ビルド時間を短くしたければ実機でのビルド推奨。
訂正。ビルド&インストール成功のためにはディスクは100GB以上、
メモリーは8GB以上必要と思われる。
メモリーが充分あればスワップはデフォルトでOK。
ビルド時間を短くしたければ実機でのビルド推奨。
364デフォルトの名無しさん
2016/03/26(土) 00:18:12.85ID:tYRw55R3 EXEファイル全般でやろうとしているの?
まずバイナリがどの開発環境で作ったのかを固定しないと。
どちらにしろ、理論上絶望的だから逆アセンブルはできても逆コンパイルは無理だよ。
JavaのクラスファイルもJavaでコンパイルされていたら逆コンパイラでほぼ完璧なソースをだせるけども、
LLJVMを使ったC言語がソースのLLVMからJavaクラスファイルに変換した物は逆コンパイルしても、何やっているのかよく分からない回りくどいJavaソースしか出て来ない。
同じJavaクラスファイルという中間言語形式であっても、開発言語が違えば逆コンパイルは期待通りのものにはならない。
それでもJavaやC#の中間言語ファイルは情報をいっぱい持っているから逆コンパイルしやすい。
EXEで実用的な逆コンパイラとか無理無理。
時間の無駄。他のことしたほうがいいよ。
絶対にできないから。
まずバイナリがどの開発環境で作ったのかを固定しないと。
どちらにしろ、理論上絶望的だから逆アセンブルはできても逆コンパイルは無理だよ。
JavaのクラスファイルもJavaでコンパイルされていたら逆コンパイラでほぼ完璧なソースをだせるけども、
LLJVMを使ったC言語がソースのLLVMからJavaクラスファイルに変換した物は逆コンパイルしても、何やっているのかよく分からない回りくどいJavaソースしか出て来ない。
同じJavaクラスファイルという中間言語形式であっても、開発言語が違えば逆コンパイルは期待通りのものにはならない。
それでもJavaやC#の中間言語ファイルは情報をいっぱい持っているから逆コンパイルしやすい。
EXEで実用的な逆コンパイラとか無理無理。
時間の無駄。他のことしたほうがいいよ。
絶対にできないから。
365片山博文MZ ◆T6xkBnTXz7B0
2016/03/27(日) 23:17:17.79ID:LtbWwOOV >>364
勝算は5%ほどある。型情報抽出と型推論を実現する策略を練っているところだ。
LVMでディスクを100GBに拡張。LLVM+Clangインストール成功。
VirtualBox仮想アプライアンスのエクスポートを完了して、俺のターンエンドだ。
勝算は5%ほどある。型情報抽出と型推論を実現する策略を練っているところだ。
LVMでディスクを100GBに拡張。LLVM+Clangインストール成功。
VirtualBox仮想アプライアンスのエクスポートを完了して、俺のターンエンドだ。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「おこめ券は米以外の食品も買える。効果的な活用を」 地元で農水相 [山形県] [少考さん★]
- 【速報】「女芸人No.1決定戦 THE W」9代目女王にニッチェ! 7年ぶり3度目で悲願の優勝 [牛丼★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★11 [蚤の市★]
- 【芸能】『女芸人No.1決定戦THE W』 粗品が最後にバッサリ「優勝賞金1000万円にしてはレベル低い大会」 [冬月記者★]
- 旧姓使用拡大に連合会長が反発 「何の説明もない。選択的夫婦別氏制度導入を」 男女共同参画会議 [ぐれ★]
- 向こう3カ月のコメ価格、下落予想強まる…新の収穫量増え需給緩むか 米穀安定供給…調査 [蚤の市★]
