ページ 11

EXEとEXEの合体

Posted: 2012年9月04日(火) 18:38
by helloworld1853
うまく説明できないのですが、
EXEファイルのヘッダなどの余分な箇所を抜いたプログラムコード本体の
機械語だけを抜き出し、
ほかのEXE プログラムの最後のほうに続いている00 00 00 00 ・・・
に上書きし、
実行することは可能ですか。
用はEXEとEXEの合体です。

Re: EXEとEXEの合体

Posted: 2012年9月04日(火) 19:12
by softya(ソフト屋)
EXE(PEファイル)の構造は、そんなに単純でもありません。
限定条件として自己完結している機械語(外部リンクしていない)でリローケータブルなコードであれば可能です。

Re: EXEとEXEの合体

Posted: 2012年9月04日(火) 22:48
by helloworld1853
ということはアセンブリコードをEXEファイルに挿入することはできるということですか。

Re: EXEとEXEの合体

Posted: 2012年9月04日(火) 22:48
by helloworld1853
すみません。アセンブリコードではなく
アセンブリに対応した機械語です。

Re: EXEとEXEの合体

Posted: 2012年9月04日(火) 22:50
by softya(ソフト屋)
helloworld1853 さんが書きました:ということはアセンブリコードをEXEファイルに挿入することはできるということですか。
そういう仕組でexeを作るツールもあります。

Re: EXEとEXEの合体

Posted: 2012年9月04日(火) 23:00
by helloworld1853
実は今、突然思い立って
EXEファイルのエントリーポイントの直後にアセンブリコード(機械語に変換して)
を挿入するプログラムを作っています。
そこで参考になるサンプルコードを見つけました。
http://mtwestsun.blogspot.jp/2012/06/mypacker.html
しかし、サイトには、
「どうやら展開時にエントリーアドレスを取得する方法が無いと展開して実行できないみたいだ。」
と書いてあります。
どういう意味ですか。
ちなみにこのサイトにあるソースコードはXORでプログラムを実行可能なまま暗号化するプログラムです。

Re: EXEとEXEの合体

Posted: 2012年9月04日(火) 23:16
by softya(ソフト屋)
exeそのもののエントリー(開始)ポイントを探し出すならexeファイルの解析や加工は必須です。
機械語を埋め込むだけならはじめから用意しておけば良いだけなので埋め込み開始アドレス=エントリーポイントにするだけす。

【補足】
パッカーレベルまで作るのなら、バイナリの取り扱いは当然として、OSのメモリ管理、リンカー、DLLの仕組み、アセンブラ、exeファイルの構造ぐらいは熟知している必要があります。
「EXEファイルの内部構造(PEヘッダ) (1/3):CodeZine」
http://codezine.jp/article/detail/412

Re: EXEとEXEの合体

Posted: 2012年9月04日(火) 23:46
by helloworld1853
手順として、
・アセンブリを入れる分のコード領域を確保(PEヘッダ 加工)
・エントリーポイントの場所変更(アセンブリの前へ)
・何らかの方法で元のexeが実行できるように配置
・ファイル書き出し


・アセンブリを入れる分のコード領域を確保(PEヘッダ 加工)
・エントリーポイント直後にアセンブリ配置
・アセンブリの直後にもとのexeファイルの機械語配置(こんな単純な方法でだいじょうぶですか。アセンブリに少し細工をしたほうがよいのでしょうか。)
・ファイル書き出し

どちらが簡単ですか。

Re: EXEとEXEの合体

Posted: 2012年9月05日(水) 00:21
by softya(ソフト屋)
エントリーポイントをずらした方が簡単でしょう。
新しいエントリーポイントに機械語を配置して、それを実行後に元のエントリーポイントに戻るのです。
すでにある機械語の配置をいじると色々と害がありますので、エントリーポイント変更と追加に留めるんです。

ただ、差し込んだ機械語でやりたいことは何なのかって事は問題になります。
C言語のスタートアップ処理の邪魔をしないかも問題になるでしょう。

【補足】
私はそういう事に情熱を燃やしている人ではないので知らないことも沢山あると思います。
なのでご自分で挑戦してみてくださいとしか言えません。
ただし、あんまり変なことをするとウィルスやマルウェアと誤認される可能性もあります。

こういうことをする目的を教えてもらえたらアドバイスは出来ると思います。
※ ちなみに単にパッカーしてもWin32APIなどから辿られてクラッカーには簡単にセキュリティを突破される可能性があります。
クラッカー以上の技量がないとクラッキングは防げないと思ってもらって良いです。

Re: EXEとEXEの合体

Posted: 2012年9月05日(水) 22:25
by helloworld1853
目的はパッキングを作ることです。
ただ、かなり基本的なパッキングなので、
クラッキング対策はつけていません。

ところで、これも関係がある話なので、
お答えいただきたいのですが、

コード:

#include<stdio.h>
int main(void){
	unsigned char mes[] = {"HELLOWORLD"};
	int counter = 0;
	for( counter = 0; counter < 100; counter += 1){
		printf("0x%02X ", mes[counter]);
	}
}
以下のプログラムを実行すると、
0x48 0x45 0x4C 0x4C 0x4F 0x57 0x4F 0x52 0x4C 0x44 0x00 0x01 0xDD 0xBE・・・と表示されます。
しかし、実際のファイルは、
0x48 0x45 0x4C 0x4C 0x4F 0x57 0x4F 0x52 0x4C 0x44 0x00 0x00 0x30 0x78・・・と表示されます。
HELLOWORLDという文字列以外のバイナリが違います。
なぜなのですか。

Re: EXEとEXEの合体

Posted: 2012年9月05日(水) 22:40
by softya(ソフト屋)
それはPEファイルの構造とC言語のアセンブラ的な動きの仕組みを学ぶとわかります。

初期値としてはWindowsのEXEファイルでは確かdataセクションに"HELLOWORLD"などの情報があるはずです。
C言語が動き出してmainの頭ではunsigned char mes[] = {"HELLOWORLD"};でchar mes[] をスタック上に確保すると共に、dataセクションを展開したメモリから"HELLOWORLD"の初期値を持ってきているはずです。
なので、動いた状態とexeファイルではまったくデータの並びが違うと思います。
動作についてはアセンブラレベルでmainの先頭から追いかけてみてください。

Re: EXEとEXEの合体

Posted: 2012年9月06日(木) 18:30
by helloworld1853
実は僕が作ろうとしているパッキングは少し変わった動きをします。
うまくいえないのですが、
プログラム本体のアセンブリコードを
XORで暗号化し、復元用アセンブリコードを挿入します。
この復元用アセンブリコードが少し特殊です。
さっき提示したソースコードのようにメモリ違反をして
暗号化した箇所をXORで復元します。
現実にできそうですか?

Re: EXEとEXEの合体

Posted: 2012年9月06日(木) 18:37
by softya(ソフト屋)
詳しい所が分かりませんのでやってみてくださいとしか言えません。
わざわざメモリをオーバーフローさせる理由もわかりません。スタックにコードを格納したい理由もです。
※ ウィルス対策ソフトがウィルス誤認をする可能性があるコードだと思います。

Re: EXEとEXEの合体

Posted: 2012年9月06日(木) 18:57
by helloworld1853
こんなプログラムにしようと思ったのは簡単だと思ったのですが、
話を聞けば聞くほど難易度が高くなっていて残念です。
あきらめます。
しばらくもとのプロジェクトをつくります。
softyaさんお付き合いいただいてありがとうございます。

Re: EXEとEXEの合体

Posted: 2012年9月06日(木) 18:58
by helloworld1853
とりあえず疑問がすべて解決したので、
解決とさせていただきます。
ありがとうございました。

Re: EXEとEXEの合体

Posted: 2012年9月06日(木) 19:01
by softya(ソフト屋)
helloworld1853 さんが書きました:こんなプログラムにしようと思ったのは簡単だと思ったのですが、
話を聞けば聞くほど難易度が高くなっていて残念です。
あきらめます。
しばらくもとのプロジェクトをつくります。
softyaさんお付き合いいただいてありがとうございます。
別に諦める必要はないと思います。
難しくて時間がかかるでしょうが面白そうなので色々やってみたらどうでしょう?
ウィルス対策ソフトにウィルス指定されて良いじゃないですか。
やって見ないとわからないこともあります。
自由に色んな事ができるにはアマチュア時代だけすよ。

Re: EXEとEXEの合体

Posted: 2012年9月06日(木) 21:41
by ISLe
実行ファイルを圧縮してそのまま実行できる実行ファイルを作るUPXというツールがありますが、ウィルス対策ソフトに引っ掛かることが多くて最近は使われなくなりましたね。
容量を小さくするという用途が必要とされなくなったのも原因ですが。