逆コンパイラ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/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 それはまだ先のこと。
2014/05/26(月) 03:07:17.92ID:Y2iJcwcZ
たいした成果がないとスポンサーからの今年の研究費がお預けになる予感。。。開発を急がないと。。。
GitHubにてPull Repuest歓迎。アドバイス・批評歓迎。功績・貢献にはアマゾンギフト券かWebMoneyでお応えします。
2014/06/02(月) 23:38:37.43ID:0yNOtv/b
もう少し納得がいくまでひらがな電卓がんばります。
2014/06/25(水) 18:38:03.09ID:n7E3MpSB
うひょー、ひらがな電卓のお陰で研究費ゲットだぜぇ! もう少しひらがな電卓を頑張るずぇっ!
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
俺の興味がどこにあるかお前はよく知っているはずだが?
あの証明は飛躍があるから埋めておけ参考書もそうならその参考書は捨てたほうがいい
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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