逆コンパイラCodeReverseを作る

■ このスレッドは過去ログ倉庫に格納されています
1片山博文MZコスモ ◆T6xkBnTXz7B0
垢版 |
2013/09/24(火) 14:58:48.34
CodeReverseは、片山博文MZが開発している、Windows用の逆アセンブラ兼ダンプツールです。
最終的には「リバーシブルな」逆コンパイラを目指しています。

CodeReverse公式サイト
http://katahiromz.web.fc2.com/codereverse/

GitHubレポジトリはこちら
https://github.com/katahiromz/CodeReverse
2014/07/10(木) 00:11:01.04ID:M4bomIPQ
catcher
2014/07/13(日) 08:57:04.53ID:OfL9oG5/
>>214
ニートですが研究費とかいうものはどうやったら貰えるのですか?
2014/07/20(日) 18:12:16.52ID:5tCNN5Wf
>>216
「クラウドファンディング」で検索
2014/07/27(日) 15:17:33.75ID:IA9V+eIN
catcher
2014/08/02(土) 14:48:35.52ID:9pUD/EET
catcher
2014/08/13(水) 18:13:36.72ID:JOE/IwkU
catcher
2014/08/17(日) 23:10:05.64ID:QEFSNrh+
お花畑
2014/08/25(月) 18:24:31.95ID:Mg2fQQvs
catcher
2014/09/06(土) 22:58:01.07ID:yTL+zk7h
catcher
2014/09/15(月) 21:33:44.73ID:lVCjgFoQ
バイナリをLLVMにするって可能なのか? うーん
2014/09/16(火) 17:47:27.97ID:uCY6omK1
Fracture
https://github.com/draperlaboratory/fracture

これもあまり進んでいないなあ。参考になるかなあ。
2014/09/28(日) 23:27:24.48ID:uLb79luw
しばらくCalc-Hの営業
時間ないな
2014/10/08(水) 13:20:30.61ID:9EnqerIp
catcher
2014/10/21(火) 20:17:15.61ID:tyo0JEbH
GitHubで星が1つ付いた。頑張らないといけないのだが、時間がない。
2014/10/31(金) 17:22:03.59ID:a2LU3Ea+
catcher
2014/11/09(日) 20:47:16.65ID:XU91kGr5
時間ねーから
2014/11/21(金) 00:49:03.57ID:6AGAgrET
catcher
2014/11/26(水) 23:20:20.01ID:4JVdbB+E
こんな嘘ばかりのスレ取り消せ。
クソボケが 、アホクソボケカスが。
根性無しのカスの集まりが。
どうせ何もできんのやろが?
カスはカスらしく黙っとらんかい!クソボケ!
何なんじゃアホが。この根性無しのクズが。
クソボケクズ。クズの集まりじゃねえか。
ポンコツのクソドアホが。ボンクラだろがてめえら。
はっきり言っといてやるよ。 てめえらなんか、何一つ怖くないわ、
このクズ以下のポンコツボンクラが。
2014/12/06(土) 14:51:26.56ID:+BigHZY2
catcher
2014/12/21(日) 19:05:02.38ID:K4obGNjE
catcher
2014/12/29(月) 14:04:28.20ID:k/a0XR+r
catcher
2014/12/30(火) 12:29:11.58ID:II8lCuST
データフローの表現の問題が未解決。アイデアが見つかるまで時間が掛かりそうです。
2014/12/30(火) 16:43:47.63ID:II8lCuST
dag (directed acyclic graph): 閉路のない有向グラフ。「グラフ理論」を参照。
基本ブロック (basic block): 途中で停止したり、分岐したりしない、連続した文の並び。
流れグラフ: 基本ブロックを制御の流れに従って矢印で結んだもの。
「基本ブロックのdag表現」とは、次のようなdag:
1.葉のラベルは一意な識別子。
2.内部節点のラベルは演算子。
3.さらに節点に識別子の並びのラベルを付けることができる。
2014/12/30(火) 18:02:49.41ID:II8lCuST
この「内部節点」は、「節点内部」の誤訳だろうな
2014/12/31(水) 00:57:28.36ID:BPGgSSnK
内部節点で正しいと思う
http://imd.naist.jp/~miyazaki/doshisha/data-algo/ad-3.pdf
・内部節点(internal node) 子を持つ節
・外部節点(external node) 葉(leaf) 子を持たない節
2014/12/31(水) 02:43:50.55ID:FQwLik9b
>>239
なーるほど
そう言うことか。有難う。
241デフォルトの名無しさん
垢版 |
2014/12/31(水) 12:23:17.69ID:UInHV6yl
『節点』に『内部』があると思っているのか?日本語からやり直せよチョソ
2014/12/31(水) 23:51:17.31ID:FQwLik9b
>>241
残念。節点なんだけど丸で描かれてその中にラベルがあるんだな、これが。
現在、インシデント解決待ち。
2015/01/20(火) 14:29:08.20ID:xhQ1sKyb
Cパーサーができた。
https://github.com/katahiromz/DoWonders
これをCodeReverseへ取り込もう!
2015/01/31(土) 20:50:33.99ID:NOJeJgIt
さあ、やるんだ
2015/02/01(日) 22:11:38.87ID:e1RPi5xm
おう、がむばってくれ
2015/02/01(日) 23:14:25.39ID:b1Drc9W3
DLLのリンク情報はどうやって抽出すればいい?
2015/02/06(金) 13:17:21.55ID:WUwVT1fs
完璧なCパーサーを作るのは大変だな。。。
https://github.com/katahiromz/DoWonders
2015/02/09(月) 20:31:33.92ID:002yDz5I
早くバグ取らないと怒鳴られるぞ。。。
2015/02/14(土) 12:15:44.30ID:gwH6zzLC
だいぶ進んだよ。
https://github.com/katahiromz/DoWonders
250片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2015/02/15(日) 13:18:57.14ID:YOxjOULg
Win32 APIのほとんどの型情報が抽出できた! K点越え!

https://github.com/katahiromz/DoWonders
2015/02/15(日) 13:30:33.98ID:VI4OFusP
おうがんばれや
2015/02/15(日) 17:20:09.52ID:BzeQi2NL
へえ。結構やるじゃん。
2015/02/20(金) 04:31:21.76ID:hFZMHbko
今、リファクタリングとDBのサニタイズしてるとこ。いくつかサイズの間違いを見つけた。
構造体のサイズを正確に得るには、アライメントを考慮せねば。
2015/03/01(日) 19:08:40.80ID:b/Z6wEyz
A「では、進捗報告を」
B「アライメントの扱いに案外手こずり、まだDBのサニタイズが終わっていません」
A「時間が掛かりすぎだ!いつになったらできるんだ!(机を叩く)」
B「申し訳ございません。」
A「アライメントの規則性を分析して早くサニタイズしなさい」
B「御意」
255片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2015/03/04(水) 12:32:04.66ID:wAAd8cV7
サニタイズ完了。
https://github.com/katahiromz/DoWonders
2015/03/05(木) 21:51:27.28ID:rUbEobY5
型情報のload/saveを可能にしなきゃ。
定数の"typed value"計算を可能にしなきゃ。
2015/03/06(金) 16:43:14.93ID:Utx2vhNJ
今、typed valueの実装をやってるけど、型によって場合分けが
必要だから、「場合分けの化け物」になっちゃうんだよな。
関数型ならもっとスマートに書けそうだが。。。
258デフォルトの名無しさん
垢版 |
2015/03/14(土) 20:28:31.86ID:V/kJuq3g
2ちゃんねるおわた
NEXT行きましょ
NEXT
2015/03/15(日) 13:48:43.55ID:wj0oyall
マクロから一部の定数を抜き出すのを実装してみた。
定数全部を抽出するには、
マクロの展開とパースとtyped valueの実装が必要みたいだ。

https://github.com/katahiromz/DoWonders
2015/03/19(木) 13:04:51.09ID:JLKczW+H
typed valueを実装してみた。サニタイズ失敗。
typed value実装のどこかに間違いがあるようだ。
https://github.com/katahiromz/DoWonders
2015/03/19(木) 15:29:38.48ID:rGfQi3lS
バグ発見。ケアレスミスだった。
262片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2015/03/22(日) 14:04:56.12ID:0xruUqhc
typed value実装を修正。
https://github.com/katahiromz/DoWonders

次は、マクロ展開を実装します。
2015/03/23(月) 17:04:35.45ID:iTA2cPA1
A「では、進捗報告を」
B「後はマクロ展開を実装すれば、次のステージに進めます。」
A「それはできるのか?」
B「今、QZというハッカーにマクロ展開実装を依頼していますが、
返答がありません。何とか自力でできないか模索している処です」
A「来週の日曜日までに急いでやれ。頼んだぞ」
2015/03/24(火) 01:57:06.17ID:CghrDXfy
まあ頑張れ、せいぜい利用させてもらうぜオッサン
2015/03/25(水) 08:14:43.78ID:UQSzKjlW
俺の興味がどこにあるかお前はよく知っているはずだが?
あの証明は飛躍があるから埋めておけ参考書もそうならその参考書は捨てたほうがいい
2015/03/25(水) 13:24:04.60ID:9WKHQtB7
>>265
名を名乗れよ
2015/03/25(水) 18:23:14.55ID:0ab+jORs
敗北宣言乙www
2015/03/25(水) 18:38:18.91ID:0It7vtDM
>>267
御前誰だよ
2015/03/25(水) 20:18:57.15ID:0It7vtDM
宿題スレを荒らしてたのは俺じゃねーぜ。勘違いするな、Qzさん
2015/03/25(水) 21:57:58.65ID:0ab+jORs
反応を待たずにレスをして何を焦っているのかな?www
2015/03/25(水) 22:43:10.00ID:0It7vtDM
あの宿題はQzが居なくてもできるよ
2015/03/25(水) 23:56:31.13ID:0ab+jORs
ちゃんと"さん"をつけろよ若僧
2015/03/26(木) 00:14:21.84ID:by79hXzC
before: 宿題スレを荒らしてたのは俺じゃねーぜ。勘違いするな、Qzさん
     v
after:あの宿題はQzが居なくてもできるよ

ウリのすぐバレる嘘ニダwww
2015/03/26(木) 01:50:45.61ID:H3hSXcrb
少なくともお下品な発言はしていない。
2015/03/26(木) 02:31:26.49ID:KfdRsObn
Qzさんだって下品な発言はしないし、大体お前のようにすぐバレる嘘をつくほどマヌケじゃない。
2015/03/29(日) 17:36:15.54ID:v4NwZmHf
マクロ展開ができた。サニタイズは時間切れ。
バグがまだたくさんあるものと思われる。

https://github.com/katahiromz/DoWonders
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
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氏は崇拝されていたが、片山は軽蔑される
人格上の問題なのではないか?
2015/04/04(土) 18:35:11.56ID:AbppvLIl
片山ウザい氏ね
2015/04/08(水) 00:10:56.21ID:yyUMrqSU
こいつがあちことで出没するとスレが過疎るからやめてほしい
2015/04/08(水) 22:14:13.74ID:GMSIP3gO
約束のdeadlineは五月一日。それまでにWonders API Webを完成しないといけない。
2015/04/11(土) 21:01:51.44ID:ArDgKFW5
今、複合値とデータのバイナリーダンプのサポートに取り組
んでいるところ。明日、リリースの予定。
286片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2015/04/12(日) 16:04:08.09ID:W8Ttx0kU
Wonders API
http://katahiromz.esy.es/wonders/

予告どおり「複合値」をサポート。変数のバイナリーダンプも可能。
2015/04/12(日) 17:44:44.25ID:Q9tFpytA
Wonders API
http://katahiromz.esy.es/wonders/

まずは、Windows APIをPHPとPythonとRubyへ移植する。
2015/04/19(日) 19:24:52.19ID:Kws6M3Sz
株価が下がってる。動かない方がいいかな。
2015/05/02(土) 19:19:00.58ID:gAnCVUja
Wonders APIをCodeReverseに取り込んで、CodeReverseのCパース箇所を破棄だ。
これでCodeReverseで型情報が使える。
GWにネットカフェが空いてないから、更新が遅くなるかも。
2015/05/03(日) 10:32:26.72ID:EPJ3sWKW
よし、x86アセンブリを読みまくって勉強するぜ!
2015/05/05(火) 13:34:39.52ID:p1RbtT4Y
CPU貸そうか?
2015/05/05(火) 17:34:29.60ID:p1RbtT4Y
CPUレジスターや仮想的なアドレス空間の任意の抽象的な場所にアクセスするための全射なアドレスを文字列で表現する。
expressed address、略してexpr_addr。
expr_addrを解決すると未知の値、シンボル、もしくは具体的な値が得られる。
また、expr_addrから型の集合への写像を作ることができる。
2015/05/05(火) 17:47:11.75ID:p1RbtT4Y
値の集合とシンボルの集合と型の集合が存在する。
値やシンボルはその格納場所(storage)によって類別できる。
格納場所は、スタック、ヒープ、レジスター、実行可能コード領域、その他のデータ領域などが挙げられる。
expr_addrから値やシンボルへの写像が存在する。
expr_addrから格納場所への写像が存在する。
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上で足し算、引き算、掛け算を行う。
2015/05/05(火) 18:49:16.52ID:p1RbtT4Y
x86/x64のスタックは逆向きに成長するから、__cr.stackは特別扱いしなければならない。
2015/05/05(火) 19:59:48.40ID:p1RbtT4Y
>>295は間違い。昔はメモリーをけちるのが常だったが、
今となっては、スタックサイズ100KBくらいけちる必要はない。
たとえ失敗してもスタックサイズが可変ならば、やり直せばいい。
2015/05/06(水) 22:49:06.45ID:ROM3ZfOK
コンパイラーなら型情報と構文に基づいてレジスター割り付けを行って、アセンブリを出力する。
逆コンパイラーはアセンブリから、オペランドと仮想アドレスに仮想的な値と
型を割り付け、それらを定数・変数・実引数・仮引数に抽象化し、式と構文を構築し、ソースを出力する。
2015/05/06(水) 23:19:53.32ID:ROM3ZfOK
callの引数は関数アドレスであるから、それがAPI関数であれば、実引数や戻り値に型情報を付加できる。
代入においては同一の値になるオペランドが現れる。このとき、型も同一になる可能性が高い。
このようにオペランドや仮想アドレスやレジスターに型情報を再帰的に付加していく。
2015/05/06(水) 23:32:41.79ID:ROM3ZfOK
仮想アドレス空間の状態は、プログラムの進行に従って遷移していく。
状態が変わる様子を再現するには、仮想マシンを作って動かしてみるのが、一番合理的だ。
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/
2015/05/08(金) 19:46:46.08ID://zzhYF7
両方のレイヤーでやれってか? なら、2種類の仮想マシンを作らにゃあかんべえ。んだんだ。
2015/05/09(土) 02:41:25.84ID:IBcmzD7P
要件定義はもっと数学的に。。。
2015/05/09(土) 19:04:28.04ID:IBcmzD7P
要件定義をよく考えると、中間言語パーサーは不必要と判断した。
2015/05/10(日) 15:22:46.73ID:DYHSUNsH
いや、中間言語パーサーは必要。パーサーがなければ、アセンブリのでっかいアーキテクチャを
ハードコーディングしなきゃいけなくなる。恐らく中間言語はアトリビュートベースになる。
2015/05/10(日) 15:52:17.96ID:DYHSUNsH
中間言語では、新しい値ができるたびに明示的にそのインスタンスを宣言する。
インスタンスは型情報、入出力に関する情報、値やアドレスを表す式などの属性を持つ。
2015/05/10(日) 23:19:17.50ID:DYHSUNsH
アーキテクチャを中間言語のデータで表現しないといけない。
中間言語の設計も完成していないのに。。。!
2015/05/15(金) 19:04:30.75ID:hBLf1mma
たぶん、値を宣言してそれらに変数を割り当ててくという考え方は間違ってない。
これでうまく行きそうだ。
2015/05/17(日) 16:50:06.36ID:9xJgx9ER
https://github.com/katahiromz/CodeReverse

ファイルarch_x32.datを追加した。
このファイルにx86アセンブリから中間コードへの変換方法を記述する。
不完全。
2015/05/18(月) 23:19:00.85ID:GE/vKBW3
我に力と自由時間を与えたまえ!(画面がパパっと2回点滅)
2015/05/21(木) 17:40:24.92ID:Dn/bDwTc
きれいなデータ作るの大変だ。。。
312片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2015/05/24(日) 10:54:19.49ID:DJktPktd
https://github.com/katahiromz/CodeReverse

アセンブリを基本ブロックに分解できた。
次は、アセンブリを中間言語に翻訳する。
2015/05/24(日) 11:08:32.59ID:DJktPktd
トップにarch_x86.dat/arch_x64.datという二つのファイルを用意したから、
これを元にして、アセンブリを中間言語に逐次翻訳する。
翻訳方法は、基本的にパターンマッチを基本とする。
2015/05/24(日) 17:02:17.64ID:tHPLTcxB
翻訳の戦略について。
まず、前述の翻訳辞書データを読み込み、パースする。
次に全体を走査して、邪魔者を消す。nopやmov ax,axやlea eax,[eax]の
ような、人間にとって無意味な命令を全部取り除く。
さらに全体を走査して、技巧的な命令を「標準語」に直す。
さらにさらに逐次的にパターンマッチしたものを次々と翻訳していく。
この戦略がうまく行けば、アセンブリはすべて中間言語に翻訳される。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況