逆コンパイラ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/01/04(土) 23:27:07.00
ドラゴンプック買えばいいんですかね?
2014/01/05(日) 02:54:40.24
無駄にはならんと思うが、つまみ食い気分で買うにはちとお高いよ
114デフォルトの名無しさん
垢版 |
2014/01/08(水) 19:09:04.82
アマゾンギフト券2000円を買ったぞ
中古のドラゴンブック買うぞーー!
115片山博文MZコスモ ◆T6xkBnTXz7B0
垢版 |
2014/01/13(月) 16:06:36.73
ドラゴンブック、1000円くらいの中古を買っちゃった!!!!!
さあ、ドラゴンと戦うぞ!!!
116片山博文MZコスモ ◆T6xkBnTXz7B0
垢版 |
2014/01/16(木) 11:57:51.63
「コンパイラI原理・技法・ツール」が家に届いたぞー

戦闘開始!
117デフォルトの名無しさん
垢版 |
2014/01/16(木) 21:01:39.45
コンパイラ「ロバwwwwwwwwwwwwwwwwwwww」
2014/01/17(金) 16:33:31.45
RE: Bison Windows m4 problems
bison: cannot open file `data/m4sugar/m4sugar.m4': No such file or directory
https://lists.gnu.org/archive/html/help-bison/2010-03/msg00015.html

空白を含むC:\Program Filesにインストールしちゃ駄目らしい。やり直し。
2014/01/17(金) 16:44:20.33
これも必要
set BISON_PKGDATADIR=C:\GnuWin32\share\bison
2014/01/17(金) 17:21:08.45
報告。ドラゴン本第三章まで読了。左再帰を右再帰に直す方法を学習した。
フロントエンド、フェーズなどの用語を習得した。
GNU Win32 Bison(Yacc)+Flex(Lex)のインストールに成功した。
引き続きBison+Flexの使い方を勉強する。
121片山博文MZコスモ ◆T6xkBnTXz7B0
垢版 |
2014/01/20(月) 12:27:07.18
ここまでの学習成果をまとめました。
http://katahiromz.web.fc2.com/mathai/compiler-tech-ja.zip

次の目標は、Cパーサーの作成です。
2014/01/20(月) 12:34:03.66
あれ、逆コンパイラじゃなかったの?
フロントエンドよりバックエンドの方が重要だろう

俺が知らないうちに方針が変わったのかな
123デフォルトの名無しさん
垢版 |
2014/01/20(月) 13:35:44.73
ロバ「方針が変わったのかな」
2014/01/20(月) 14:32:20.01
どうでもいい。アホは自由だけが取り柄、好きにすればいいじゃない。
125片山博文MZ無能 ◆T6xkBnTXz7B0
垢版 |
2014/01/25(土) 13:20:17.50
C言語で連結リスト書いたよ。

連結リストライブラリ LinkedListInC
https://github.com/katahiromz/LinkedListInC
2014/01/25(土) 17:51:54.00
Cで書くべきかC++で書くべきか?
2014/01/25(土) 18:01:36.51
bison+flexで作ったパーサーを2つ以上取り込むことができないから、Cはダメだな、C++にしよう
2014/01/27(月) 17:02:56.74
ftp://sunsite.unc.edu/pub/Linux/devel/lang/c/cdecl-2.5.tar.gz

ここにcdeclというプログラムのソースがある。これを分析する。
2014/01/30(木) 22:11:39.12
最近はPEGを使うのが流行りなのか? ちょっくら調べてみるか
2014/02/10(月) 23:06:04.01
パーサジェネレータの勉強を兼ねて電卓を作ってます。
2014/02/11(火) 19:47:51.54
bison/flexのパーサーが複数使えないって
片山はマニュアルが理解できないのか
2014/02/11(火) 23:26:24.57
Windowsではまだmodern Bison++(3+)は入手できない。
それにC++に関してはまだ実験的らしい。
すぐに使えなくなりそうなコードは書きたくない。
だからANTLR3を使うことにした。
2014/02/12(水) 22:39:20.23
ドラゴンブックに挫折したか
134片山博文MZ無能 ◆T6xkBnTXz7B0
垢版 |
2014/02/16(日) 10:43:23.84
まだ挫折していません。
ANTLR3でここまですごい電卓ができました。

http://katahiromz.web.fc2.com/mathai/mzcalc3.zip
2014/02/16(日) 12:48:36.08
SS貼れよ
2014/02/16(日) 12:57:23.05
Type [q or Q] to quit
> 871263948761872364871623946182973164+8761928734912634183412379461874234
Result is: 880025877496784999055036325644847398
> s=92183019827349179203471
s := 92183019827349179203471
Result is: 92183019827349179203471
> sin(s)%100.3
Result is: 0.7484296692622107891527456053804399259219719456829430374497200718368
9079690554390091960884209113407122218168687650754654152155867
>
2014/02/18(火) 20:15:08.01
C11を勉強しなければ‥‥
2014/02/20(木) 00:45:01.32
電卓で終わる予感
2014/02/20(木) 12:37:10.33
Grammar Zoo
http://slps.github.io/zoo/
2014/02/20(木) 13:23:01.18
__extension__とか__builtin*とか処理が多いなあ。
2014/02/21(金) 16:51:09.37
ANTLRでFOLLOW_set_in_問題が発生した。これも使えないのか。。。
2014/02/22(土) 13:41:25.80
bison-3.0.2をビルドしようとしたが失敗。
CaperとPEGを試してみる。。。
2014/02/22(土) 19:42:42.68
スマポ? なにそれおいしいの?
2014/02/25(火) 16:56:09.41
Caperは生成に時間がかかる(Core i5で10分)。しかもできるものが非常にでかい。
145片山博文MZ無能 ◆T6xkBnTXz7B0
垢版 |
2014/02/28(金) 15:42:30.17
Cパーサのプロトタイプができたよ!!!!
http://katahiromz.web.fc2.com/mathai/cparser2.zip

storage class関連の文法の見直し、並びにT_TYPEDEF_NAME,
T_TYPEDEF_NAME_FIRST, T_TAGNAMEなどの特殊なトークンが必要だった。

それにしてもCaperは時間がかかりすぎ。。。やっぱりBisonが最強かなと思い始める。。。
146デフォルトの名無しさん
垢版 |
2014/02/28(金) 18:36:32.65
>>145
あんた偽物だろ。
片山先生ならなぜ時間がかかるかまで調べて教えてくれるはず。
147片山博文MZ無能 ◆T6xkBnTXz7B0
垢版 |
2014/03/02(日) 14:00:30.68
さあ、caparの高速化に挑戦するぞ。開発環境はMinGW+MSYS。
まずは、計測。
$ time ./caper.exe -c++ cparser.cpg cparser.hpp
    real 7m50.856s
    user 0m0.015s
    sys 0m0.000s
7分50秒もかかっていることがわかる。

g++のコマンドラインに-pgをつけてビルドすると、
関数の処理時間などをプロファイルするCaperの出来上がり。
    $ ./caper -c++ cparser.cpg cparser.hpp
を実行すると、ファイルgmon.outが作成される。さらに
    $ gprof caper.exe gmon.out > gmon.log
と入力すると、人間にも読めるgmon.logができる。
...(中略)...
その結果、
    real 0m31.862s
    user 0m0.000s
    sys 0m0.031s
となり、30秒程度で処理できるようになった。めでたしめでたし。
http://katahiromz.web.fc2.com/mathai/qcaper.zip
2014/03/02(日) 14:19:11.94
騙されてる
149片山博文MZジェバンニ ◆T6xkBnTXz7B0
垢版 |
2014/03/07(金) 17:53:42.51
ここまでできたぞ!!!
http://katahiromz.web.fc2.com/mathai/cparser4.txz

これより、型システムを実装する。
2014/03/10(月) 22:07:35.64
型のデータ構造とASTを構築中。。。
2014/03/11(火) 11:51:20.24
@jonigataさんのCaperが劇的に高速化されたらしいぞ!!!
github.com/jonigata/caper
152片山博文MZジェバンニ ◆T6xkBnTXz7B0
垢版 |
2014/03/13(木) 20:23:31.76ID:AgM9wxep
汗から関数を切り出すのはできた。汗コードから関数の引数の個数を判定する方法がわからない。
最近汗やってないな。。。
2014/03/14(金) 22:06:20.31ID:j99O0IvR
雑用とか色々有って忙しいんだよな。
C2EXEの作者でも降臨して手伝ってくれないかなあ〜。多分連絡取れないんだろうな。
2014/03/14(金) 22:07:44.17ID:j99O0IvR
exe2cの間違いだった。。。
2014/03/21(金) 16:00:15.28ID:15wzZBuZ
AST構築中。。。
2014/03/23(日) 18:39:59.36ID:FjLlR1KU
最適化なんてどうでもいいから、早くASTを構築しろって上司に怒鳴られた。
すなおに実装してみるか
157片山博文MZジェバンニ ◆T6xkBnTXz7B0
垢版 |
2014/04/01(火) 12:58:53.08ID:zF3pKyMj
AST構築完了。次はコンパイルだ。
http://katahiromz.web.fc2.com/mathai/cparser8.txz
2014/04/02(水) 01:48:11.12ID:DfhRYDJb
まだやってたのか
2014/04/02(水) 23:15:39.26ID:dFeJg3uF
こうして見返してみると馬鹿なコード書いてるのがわかるな。。。
書き直そう。
160片山博文MZジェバンニ ◆T6xkBnTXz7B0
垢版 |
2014/04/07(月) 14:05:00.51ID:nfj7Xkns
github.com/katahiromz/CodeReverse
更新しました。パースルーチンを追加。コードの近代化。
ライセンスをThe BSD 2-Clause Licenseに変更。
さあ、どんどん作るぞ!!!
2014/04/20(日) 10:23:49.34ID:3IIwiFaC
技術レベルの高いことやってるね。
2014/04/20(日) 17:23:11.71ID:Z/njjQP5
x86アセンブリから関数の引数のサイズを求める方法がわからない。知ってる人、教えてよ
2014/04/20(日) 20:30:04.45ID:mILxVbg/
calling convension調べろよ
2014/04/21(月) 00:20:07.86ID:fKV6ATCG
そういうのはプロジェクト立ち上げる前に解決しとくと子だろ
2014/04/30(水) 18:48:27.62ID:4dW9hwGr
catcher
2014/04/30(水) 23:08:35.10ID:yRPuq9ZX
途中何も読んでないから的外れ言ってたらすまんこまんこ
引数はPUSH最後からPUSHで行って、最後にリターンアドレスをPUSHして関数をcallする
arg3
arg2
arg1
retaddr
引数が4バイトで3つの場合、呼び出し直後のスタックはこうなる
2014/04/30(水) 23:20:48.12ID:yRPuq9ZX
関数呼び出し規約の違いは引数の分のスタック処理を誰が責任持つかの違い
__stdcallは呼び出された関数が最後にスタックを整理して返る
__cdeclは呼び出し側がpushした分だけスタックを整理する
__fastcallはcallする前にpushじゃなくて最大2つまでレジスタに値をぶっ込んでからcallする
__thiscallはcallの直前にecxにthisポインタを入れてから呼び出すが、スタック処理は_規定では_stdcallと同じ
関数内でecxにあれこれしてローカル変数っぽいのを弄ってたらなんかしらのクラス決定
__cdeclを指定されたり可変個引数だったりするメンバ関数は、thisポインタを最後にスタックに積んだ気がする
2014/05/01(木) 00:42:00.30ID:VSccnwjx
__fastcall調べたなら「スタック処理を誰が責任持つかの違い」じゃ無いことは自明だろがアホ
あとx64だとかなり様変わりする
169デフォルトの名無しさん
垢版 |
2014/05/01(木) 02:11:28.08ID:PhcFzFlz
ごめんニワカなんだすまんこまんこ
__fastcallは3つ以上引数取るときには3つめ以降の責任は__stdcallと同じだったはず
x64はほとんどレジスタで引数やりとりするんだっけ?全く詳しくないが
2014/05/01(木) 02:48:55.05ID:VSccnwjx
「引数の渡し方からしてそもそも違う」のに「誰が責任持つかの違い」に限定しなきゃいかん理由は何なんだ。
171片山博文MZバグロボ ◆T6xkBnTXz7B0
垢版 |
2014/05/01(木) 12:27:44.81ID:WY/8p/R+
v0.1.0!
https://github.com/katahiromz/CodeReverse

パースした関数のプロトタイプを出力するようになりました。
172片山博文MZバグロボ ◆T6xkBnTXz7B0
垢版 |
2014/05/01(木) 14:24:04.77ID:O61PxCRM
型システムは70%くらいできた。
アセンブリから呼び出し規約と引数のサイズを推定するオートマトンを作らないといけない。
頑張るぜ。
2014/05/01(木) 18:16:21.29ID:O61PxCRM
Amazonでドラゴンブック二冊目買おうかな
データフローを勉強したいんで
174デフォルトの名無しさん
垢版 |
2014/05/01(木) 18:37:14.14ID:O61PxCRM
買う買う光線ビーム!!!
2014/05/01(木) 19:17:47.73ID:ZMd3mcxT
こわい
2014/05/02(金) 12:19:45.40ID:fCG9D4SE
買ったぞーーーー
2014/05/02(金) 22:33:36.49ID:uljkUnkD
>>176
http://awabi.2ch.net/test/read.cgi/classical/1389828072/
178片山博文MZバグロボ ◆T6xkBnTXz7B0
垢版 |
2014/05/04(日) 13:00:24.41ID:MUZRXExp
0.1.1!
https://github.com/katahiromz/CodeReverse

型システムが85%できました。ビットフィールドが難しい。。。
2014/05/04(日) 18:25:07.84ID:6pFdiYZZ
ビットフィールド、サポート出来そう。
次はオートマトンに取り組むぞ!!!
180片山博文MZバグロボ ◆T6xkBnTXz7B0
垢版 |
2014/05/05(月) 00:10:21.23ID:vEoyNxMN
【関数呼び出しコード分析における注意点】
☆呼び出しの際、スタックを解放せずに再利用されることがある。
☆呼び出し先のアドレスがレジスタに格納されて呼び出しに使われることがある。
☆また、条件によって場合分けされて呼び出し先の異なるアドレスがレジスタに格納されて呼び出しに使われることがある。
2014/05/05(月) 00:44:45.91ID:vEoyNxMN
レベル0.機械語コード。
レベル1.アセンブリのみのコード。
レベル2.関数に切り分けられたアセンブリコード。
レベル3.レジスタとスタックの直接的操作を含む中間表現コード。
レベル4.レジスタとスタックの直接的操作を含まない中間表現コード。
レベル5.C言語のコード。

#こんな感じかな?
2014/05/05(月) 00:47:27.64ID:vEoyNxMN
レベル3.レジスタとスタックの直接的操作を含む型なしの中間表現コード。
レベル4.レジスタとスタックの直接的操作を含まない型付きの中間表現コード。
2014/05/05(月) 01:30:48.74ID:vEoyNxMN
命令セットの中間表現はテキストとして与えられる(insn*.dat)。
よって、中間表現の設計とパーサとASTが必要。
中間表現はC言語のサブセットの拡張とする。
2014/05/05(月) 15:16:53.17ID:vEoyNxMN
gccは余分にスタックフレーム確保してる。。。何でだろ?
2014/05/06(火) 13:59:33.71ID:e6OeMlN3
実現出来てもwatcom cの吐いたバイナリで面白いことになる予感
186片山博文MZバグロボ ◆T6xkBnTXz7B0
垢版 |
2014/05/07(水) 18:04:37.38ID:ofrV91be
本が来た━━━━━━━━━!!!
2014/05/08(木) 15:32:25.08ID:o5H0kOM9
コンパイラが関数だとすると、逆コンパイラは逆関数である。
逆なんだよ、逆。コンパイラのコード生成に対しては、逆コンパイラのコード分析が対応する。
2014/05/08(木) 17:50:21.71ID:o5H0kOM9
__stdcallが一番簡単。__stdcallのときに限ってretの引数があって、それが関数の引数リストのサイズ。
__stdcallでないときはretに引数がなく、呼び出し側が引数スタックを解放する。
__cdeclか__fastcallか__thiscallの判断はレジスタの使用や関数呼び出しの状況を統計するしか方法はない。
スタックやレジスタやヒープの型情報とデータと式などを統合して扱う仕組みが必要。
2014/05/09(金) 09:45:23.59ID:b6QXm0aH
統計しなくても理詰めで解けるケースを想定できんのか
//どっちみち可変長引数は詰むけどな
2014/05/10(土) 00:46:59.62ID:4sLYkLKE
ある関数内で呼び出すターゲット関数のスタック引数サイズは、スタックフレームマイナススタックポインタ以下の値を取りうる。
関数内でターゲット関数の呼び出しが1回のみで他にスタック操作をしていないなら、そのときのスタック引数サイズは確定する。
ターゲット関数内のレジスタとスタックの使用状況から、スタック引数サイズの下限がわかる。
可変長引数の場合は、スタック引数サイズは下限以上の値になる。
2014/05/10(土) 00:54:06.86ID:4sLYkLKE
ということは、スタックフレームイコールスタックポインタの場合はターゲット関数の
スタック引数サイズはゼロで確定で、ターゲット関数に対する統計は不要という訳か?
2014/05/10(土) 01:26:55.17ID:4sLYkLKE
1.関数のスタック引数サイズとローカル領域を確定し、スタック操作を仮想化する。
2.コードを基本ブロックに分け、分岐を仮想化する。
3.オペランドに型を付けて型推論を行う。
4.データフロー解析を行い、中間表現へ変換。オペランドを式に抽象化する。
5.読みやすいように最適化しながら、コード生成を行う。
6.AStyleを使ってコードを整形する。
193片山博文MZバグロボ ◆T6xkBnTXz7B0
垢版 |
2014/05/11(日) 18:12:03.14ID:FqMZuwkf
0.1.4! コードを整理。
https://github.com/katahiromz/CodeReverse
194片山博文MZバグロボ ◆T6xkBnTXz7B0
垢版 |
2014/05/14(水) 13:48:10.03ID:dMA9XG5e
x86のintrinsicのまとまった情報が欲しいけど見付からない
2014/05/15(木) 19:14:50.89ID:KjqXcag5
符号付きか符号なしか分からない型をxsignedで表す。
未知の型はunknown%d_tという型を付ける。未知の型について型の属性を解析していく。
例えば、即値xが非ゼロで上位ワードがゼロならポインタでなく整数である。
callの引数は間違いなく関数ポインタである。
2014/05/16(金) 00:32:42.44ID:YZ6eU1pI
ということは、intrinsicのアセンブリパターンをほとんど全部調べて、
パターンマッチングでパターンごとに中間表現に置き換えていく必要があるんやで。
パターンデータを用意するのが大変やで、しかし。
2014/05/17(土) 23:48:39.82ID:MhKuGNEw
pattern {
(アセンブリのテンプレート)
} code {
(中間表現)
}

こんな感じのテキストデータを事前に読み込んで、それ(置き換え規則)を使って
パターンマッチを行い、中間表現への置き換えをする。
テンプレートには$1,$2,$3,...などの引数が書ける。
2014/05/18(日) 05:43:49.87ID:d9R6JRvl
パターンが足りず変換し損なうか、パターンが意図しない場所にマッチして変換し損なうか、
マッチ候補の組み合わせ探索量が爆発して尋常じゃなく遅くなる、て未来が見えそうだね。
2014/05/18(日) 11:59:58.99ID:BMv+P6U/
最適化されたバイナリとか全く考えて無さそうだな
変換できなかったらインラインアセンブリのソースに変換します! ならかっこいいw
2014/05/18(日) 12:30:27.39ID:untGUeAU
>>199
それ言い出すとインラインアセンブリだらけになっちゃうだろ!
2014/05/18(日) 21:31:34.01ID:DTiowi1J
ループ展開とか、再起がgoto文になってたりすると見にくそう
2014/05/18(日) 22:02:56.66ID:C1UdNOr5
forもwhileもgotoになるだろう
2014/05/19(月) 11:39:49.12ID:3tNqokKG
>>197
コンパイラの癖が変わったら破たんするな。
2014/05/19(月) 12:56:58.39ID:zujUZLqg
>>203
コンパイラのバージョンとコンパイルオプションの組み合わせごとにパターンセット作るんじゃね?
手作業だと余裕で死ねる。
2014/05/20(火) 00:30:57.63ID:fbMM1sIr
頻出形だけカバーできればいいだろ
どうせ大事なのはその先なんだし
2014/05/20(火) 00:40:11.42ID:5sJsx7Oe
最初から最後までインラインアセンブリ
2014/05/20(火) 00:42:08.99ID:zlaxDiQa
>>206
なにその手の込んだ手抜き
2014/05/20(火) 01:01:34.43ID:DYOJrjk8
はーひふーへほー!!!
片山被告のせいで俺まで職場で悪役扱いだずぇ!
まゆげが無くても父親が殺人者でも関係ねぇ!
俺はコンピュータテクノロジーの心臓部に弾丸を撃ち込んで歴史を塗り替えてみせる!
俺様は諦めない!がはははっひゃっ! ばいばいきーん!
2014/05/20(火) 01:33:26.09ID:DYOJrjk8
最終チェックが終わったら次は64bitのパターンだな。
7月15日までに結果を出さねば。
2014/05/24(土) 09:18:22.74ID:NypXzdqU
jmp を for にできるようになったら呼んでくれ
211片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0
垢版 |
2014/05/24(土) 15:37:43.79ID:rwv5YdXW
v0.1.5!
https://github.com/katahiromz/CodeReverse

パターンファイルasmpat32.dat, asmpat64.datを追加しました。
ソースが読みやすくなりましたので、興味がある方はじっくりご覧下さい。

>>210 それはまだ先のこと。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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