C言語についてです。

初心者のため回答に手間がかかると思うのでポイントを高めに設定したいと思います。

sha512などのハッシュ関数でファイルが改ざんされていないかどうかチェックが可能だと聞きました。
検索してみるとファイルをドラッグするとハッシュ値を算出してくれるフリーソフトも多数ありました。
このような仕組みを自作DLLに組み込み、このDLLを使用する本体が改ざんされていないかチェックする仕組みを作りたいと考えています。

本体はあらかじめハッシュ値を算出しておきDLL内に書き込み、
DLLでこの本体のハッシュ値を計算して比較するという関数を作ればいいかなと思っています。
どのようにして作ればいいでしょうか。ソース付きでお願いします。

回答の条件
  • 1人10回まで
  • 登録:2008/12/08 14:03:34
  • 終了:2008/12/08 23:23:07

回答(2件)

id:zzz_1980 No.1

zzz_1980回答回数492ベストアンサー獲得回数642008/12/08 15:08:37

ポイント100pt

本体はあらかじめハッシュ値を算出しておきDLL内に書き込み、

DLL本体に自分自身のハッシュ値を埋め込む。ととりましたがあっていますでしょうか。

この方法ではハッシュ値を埋め込むことができません。埋め込んだハッシュ値によって、全体のハッシュ値が変わってしまうからです。

ハッシュをとる本体部分とハッシュ値を埋め込む部分をわけておき、

ハッシュ値を埋め込んでおく部分には、

公開鍵

ハッシュ値そのもの、あるいはハッシュ値のダイジェスト どちらかに暗号鍵で署名したもの

を添付します。ハッシュ値が改ざんされていないか公開鍵暗号で検証した上でDLL本体部分が改ざんされていないかそのハッシュ値を使って検証する、という手法になります。

.NET framework には、このような仕掛けを実装するための手段が用意されているそうです。

第3章 共有アセンブリ

id:plugbot

現在Aという本体ファイルがあってBというDLLを利用して機能しています。

Aが書き換えられて不正にBを使おうとした時にBを使えなくしようと考えています。

説明不足でしたがこれが目的です。

この方法でもハッシュ値は変わってしまうものでしょうか。

2008/12/08 15:22:41
id:xcaqhbaj No.2

xcaqhbaj回答回数13ベストアンサー獲得回数12008/12/08 15:42:22

ポイント100pt
#include "stdio.h"
#include "windows.h"
#include "WinCrypt.h"

int SumHash(char *Buffer,int BufferLength,char *HashData)
{
	HCRYPTPROV hProv;
	HCRYPTHASH hHash;
	DWORD HashDataLength = 20;
	
	if(!CryptAcquireContext(&hProv,NULL,MS_ENHANCED_PROV,PROV_RSA_FULL,0))
		return 0;
	if(!CryptCreateHash(hProv,CALG_SHA,0,0,&hHash))
		return 0;
	if(!CryptHashData(hHash,Buffer,BufferLength,0))
		return 0;
	if(!CryptGetHashParam(hHash,HP_HASHVAL,HashData,&HashDataLength,0))
		return 0;

	return 1;
};

void main()
{
	char a;
	unsigned char b[20];

	memset(b,0,20);
	SumHash("abcdefg",7,b);

	gets(&a);
	return;
}

無残なほど手抜きコードですが、SHA-1であればこんなんで生成できます。

手軽さではCryptAPIが一番ではないかと。

あとはfreadか何かでプログラム本体を読み込んで流し込んでやれば良いです。


ちなみにプログラム自体の改竄検出に使って効果があるかは微妙な所です。

トレースしてチェックルーチン書き換えればおしまいですから、

改竄対策がハッシュチェックだけなら解除に5分かからないと思われます。

id:plugbot

>トレースしてチェックルーチン書き換えればおしまいですから

そういうものなのですか^^;

これだとハッシュチェックという手段を変えないといけないですね。。。

他に良い方法があれば引き続きご教授お願いします。

2008/12/08 15:56:38
  • id:zzz_1980
    A> が書き換えられて不正にBを使おうとした時にBを使えなくしようと考えています。
    Aを書き換えできるぐらいの悪意のあるひとであれば、B(DLL)に埋め込んであるAのハッシュ値の書き換えなど
    簡単にできてしまいますが。
    どういうハッシュをとっているかは、AなりBを解析すればわかってしまいますし、何よりもそこまでできるのであれば、ハッシュ値確認ルーチンをスキップするよう改造されてしまいます。
  • id:xcaqhbaj
    書き込む前にリロードすべきでした。
    すみませんorz
  • id:plugbot
    チェックが必要なくなったので質問も終了します。
    ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません