逆コンパイラCodeReverseを作る
■ このスレッドは過去ログ倉庫に格納されています
CodeReverseは、片山博文MZが開発している、Windows用の逆アセンブラ兼ダンプツールです。
最終的には「リバーシブルな」逆コンパイラを目指しています。
CodeReverse公式サイト
http://katahiromz.web.fc2.com/codereverse/
GitHubレポジトリはこちら
https://github.com/katahiromz/CodeReverse パッと思いつくのは
・アドレスにラベルを割り付ける
・関数を切り分ける
・スタックフレームから関数引数・ローカル変数・戻り値を切り出す
・if/for/switchを抽出して構文化する
・DLLからロードされるシンボルを置き換える
解説しているサイトとかあるかは調べてないので知らん
どうせ defineされた定数をマクロ名に戻せないとか
構造体復元が難しいとかあるから大したことはできん このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所 ネタスレはマ板でやれよ。
> Cの逆コンパイラはどこまで実現可能か
アフィサイト晒してんじゃねーよ。 内容もちょい微妙だし。
まず、アセンブリから C/C++ へのトランスレータは簡単だろ?
そっからどの程度 C/C++ らしい表現にするかが問題なんだろ?
何から手を付けてどういう順番でやるつもりなの。 まずは関数の切り分け(手元では入り口を解析する形でほぼ完了)。次は関数情報とスタックフレームの解析。
そして中間表現の定義と中間表現への変換。さらに構文解析と型情報の処理。
トランスレータって言ってもそんなに簡単じゃない。
リソースのダンプでいいのないか(オープンなの)? 関数には__cdecl、__stdcall、__pascal、__fastcall、単純ジャンプ関数の五種類あるんだけど、これをどうやって判別するかという問題がある。
遅延ロード情報の取り込みもしたい。ソース希望。 OllyDbgじゃダメなんか
分かってる人には充分だろ ネタスレではありません。私は本気です。明日、OllyDbgのソースをDLしてみます。
CodeReverseは、NASMのコードを一部拝借しています。
多分、構文解析用のインクルードファイルが必要になると思います。
MinGWから頂くかも知れません。ライセンスはどうするか? アイコンのデザイン、洒落てるでしょ? >>11
> MinGWから頂くかも知れません。ライセンスはどうするか? アイコンのデザイン、洒落てるでしょ?
MinGWのソース使ったら、配布するときのライセンスはGPLになると思う。
一部パブリックドメインらしいけれど。 アムロの親父みたいに俺の親父もボケてしまった。
たしかに昔はある分野で日本一の技能をもってた。俺の目標は親父だった。
今は硬い世界の殻に閉じこもってしまって、もはや日常会話しか通じない。 うーむ、今のところこの世にまともなC/C++の逆コンパイラが
存在しない事を考えても片山程度の技術力で作れるとは思えんが・・・ ヘッダファイルもプリプロセッサも要るから、単純にMinGWに寄生する形にします。
バージョンアップの度にいちいちでっかいファイルをダウンロードさせるのも不憫だから。
ライセンスはGPLになる予定です。 つーか、片山GUIはどうした?予想通り挫折したのか?
そんなんじゃ逆コンパイラなんてもっと無理だろ 自動車の命はエンジンでしょ。GUIは後で自由に作れるから。 >>19
そういう問題じゃねーだろw
お前にはモノを最後まで作り上げる能力が無いって事だ
あれだけWin32APIやMFCに代わるGUIを作るって豪語してたろ
多分お前はこの逆コンパイラも作れないし、後になってもGUIも作れんよ まあ一人で色々作ってたら未完成になることは多い。
そういう未完星人の同類なら、GUI作りくらい協力してやってもいい。
だが残念だがそれは無理だ。なぜなら彼が作っている物は俺よりしょぼい。
もはや彼が俺に「あなたのプロジェクトに協力させて下さい」と頼まなければいけないレベルなのだ。
残念である。世の中は不条理に満ちている。 まあ誰もが出来ないと思ってるよ
グラフィックライブラリもこれを最後に音沙汰なしだしな
975 名前:片山博文MZパンク ◆0lBZNi.Q7evd [sage] 投稿日:2013/03/21(木) 03:21:59.90
MZC2順調に開発中。。。 順調に開発中クソワロタwww
どこが順調なんだよwww CUIの有り難みがわからない人とは話しが合わないっす。
CUIにパイプラインをつなげてGUIを作るなんてお茶の子さいさいっす。
俺はサイドビジネスで忙しいから、空いた時間で作ってるっす。
CUIの使い方も知らない人はうざいから消えてね。 ふーむ、CUIのありがたみがわかってる人間がなんでわざわざ
二番煎じのGUIを作ろうと思ったのか。しかもオリジナルより劣化してる。
更には、お茶の子さいさいと言いながら、いまだに何の成果物も出せないのはこれいかに。
>>23のレスからもう半年も経過しているが。 俺は貴様らよりも自由じゃないから。夜遊びはできないし、インターネットに
つなげてもらえないし。パソコンの使用時間は制限されてるし。
この書き込みも見張りに見つからないように携帯から書き込んでいるところ。 こりゃアカンで。ちょっと期待してたらどうやら>>1の人格・人間性に
相当の問題アリやな。 クロスワードギバーというパズル作成ソフトで結構反響あった。MZ KeyLoggerもわりと人気あるし。 そうそう幅広くニッチなところ狙ってけ。おまえはわけのわからんものを大量に発明して東京都知事選に変態枠で出馬するようなタイプなんだ。 × 大量に発明して
○ 大量に「発明するぞ」というだけ言って >>32
当選は枠があるけど出馬は出たきゃ出れるんじゃなかったっけ? エクスポート名の@の右の数字は引数全体のサイズだよね? で、__stdcallの引数全部のサイズが命令retの第一オペランドの値だよね?
そして、スタックフレームはebpとespの値の増減を調べないとわからないんだよね? >>9は間違いね。__pascalなんてないし、64ビットに言及がないし、単純ジャンプ関数って何じゃそれ >>35-36
Win32 べったりの話? 何にも知らないんだね。
DEF ファイルを使った DLL からのエクスポート
で検索してご覧、MSDN 内のページが引っかかるから。
悪いけど、主要な(少なくともターゲットとする)コンパイラやアセンブラやリンカのマニュアルを読んでから質問してくれる?
ていうかブログでやってくんない? ブッブー、defファイルではなく__stdcall,__fastcall関数のmanglingの話でした。
manglingされたシンボル名から元の名前を求めるのは大変みたいですね。 >>43
まぁだがコンパイラ毎ではあるもののマングリングは明確な規則で行われてるわけで…
それを難しいとか言ってるようではC/C++コードへの復元とか夢のまた夢だわな。
呼び出し規約と関数内のレジスタ利用方法の規約ゴッチャにしてる辺りも残念すぎる。 v0.0.1にバージョンアップしました。
関数の切り分けができるようになりました。
課題1:DisAsmメソッドの中で各関数の種類(FUNCTIONTYPE)を確定させる。
また、各関数の引数全部のサイズを求める。関数内関数の対処。 全パターンぶんデマングルしてみてうまくデマングルできたやつを採用すればいいんじゃない g++の場合は、プログラムc++filtで解読できるようです。
gccの場合はわからない。
VCの場合はdbghelp.dllのUnDecorateSymbolName関数で。
UnDecorateSymbolName function
http://msdn.microsoft.com/en-us/library/ms681400(v=VS.85).aspx 正直ね、片山さんのその技術力で
逆コンパイラじゃなくて
C#とD言語を上手く改良したような実用できる言語作ってほしい
逆コンパイラの都合のいい言語みたいな感じでもいいから。
そしたら実装も楽になるかもよ。
これ作るついでにやってみてくれないかな? ネイティブC#みたいな位置づけのさ。
D言語だと正直不安定すぎて使えなさすぎなのよ Microsoft C は、シリアル番号をオブジェクトファイルに
埋め込んでるってうわさ話があったな... >>53
そんな速攻で検証できそうなことをわざわざするかなぁ……? 課題2:アドレスからスタック状態集合への写像
課題3:コンパイラの種類を判定するコード
課題4:アセンブリ命令が何を参照し、何を変更するかの情報
課題5:データ型の管理方法
これらに関して知ってることがあれば俺に教えて下さい。 次のリリースは、pimplで読みやすいコードになる予定。
今までの人工知能研究の全てを注ぎ込んで、頑張りますのでご声援を。 コントロールパスというのがよくわからん。単純にプロファイルするとループで無限長になってしまうよな。
掛け算と割り算のキャリーとオーバーフロー条件の違いもよくわからん。 v0.0.2にバージョンアップ。
コードの整理。insn*.datファイル、mzc2mini.{h,cpp}ファイルの追加。
関数内関数の対処。 insnはinstructionの略でアセンブリの命令のこと。
次は、コントロールパスとスタック状態の取得に挑戦します。 サイドビジネスで疲れてMPがない
妙なバグがまだ取れてない
頑張るしかないか コントロールパスの組み合わせが無限になるバグが修正できない。
ループは排除したのに。 無限大じゃなかったけど、コントロールパスが768通りって多すぎないか? コントロールパスよりもCFGの方が重要だとわかった。目標が間違ってた。 型情報がない状態で、レジスタとスタックの使用状況がわからないと、
関数の呼び出し規約や引数は分析できませんね。
insn16.dat/insn32.dat/insn64.datファイルに書かれているような
中間表現によって、アセンブリとC言語ソースをつなげようと
考えています。 そりゃそうだ。リバースエンジニアリングってのはどちらかといえば破壊行為だし。
この板の連中はおまえの想像以上に生産的(破壊的の反対)なんだよ。 それ以前に「どうせ無理だろ……」と多勢が思っていることもあるだろうね コンパイラが多すぎて全部はソースに変換できないって分ってからなぁ・・・
そしてコテ的に>>76 彼でも1〜2年で限定用途なら可能だろうし
5〜10年も頑張れば実用レベルのが出来るんじゃないかな?ただそれだけ頑張った見返りがあるか疑問だが。 >>74
興味ありますよ頑張ってください応援してます しばらくスクリーンセーバーの開発に時間を割くことにします。GUIはwxを採用します。 MZC使えよバカ、作った人にも使われないなんてよっぽどだな(笑) 馬鹿がまた飽きたのかwww
こいつ本当に何一つ最後まで作れないなw 仕事の合間にLinuxのスクリーンセーバーをWindowsに移植したら、海外から何件か要望が来た。
要望の多い方を優先する方針。すまない。何ならGitHubで開発に参加してくれると助かるのだが…。 まあ簡単な方から片付けていくのが効率的人生の鉄則ではある。 クッソワロス、やっぱり最初に言った通り途中で挫折したw
ちなみに、こいつが途中で他のを優先すると言って
また開発に戻った例は無いぞw スクリーンセーバーの移植が終わったので、CodeReverseの開発を再開します。 Windows 系の .exe .dll を逆コンパイルするので分りやすいコードを吐いてくれるのは
今って何が高性能?
C#ぐらいの言語っぽいのだと分りやすいんだけど ■ このスレッドは過去ログ倉庫に格納されています