人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: plugbot
●カテゴリ:コンピュータ
✍キーワード:C言語 DLL ソース ドラッグ ハッシュ値
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● zzz_1980
●100ポイント

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

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

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

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

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

公開鍵

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

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

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

第3章 共有アセンブリ

◎質問者からの返答

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

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

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

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


2 ● xcaqhbaj
●100ポイント
#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分かからないと思われます。

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ