HEXA BLOG
ヘキサブログ
プログラム
ドングル3
お久しぶりです。
先日激辛料理で撃沈しました。
沈みゆく太陽good sunこと山口です。
今日も元気です。
今回でドングルシリーズ最後となります。
もはやドングルそのものとは関係の薄い内容となっておりますが、
そもそもドングルとはプログラムの実行制限により、
プログラムライセンス保持者を守るものです。
どんなに頑張ってハードウェアキーを使って、
安全にライセンスキーをやり取りしても、
実際に実行するプログラム側を攻撃されてしまうこともあるのです。
今回はこの実行するプログラムを守る方法の一つをご紹介します。
実行コードを隠すです。
簡単なサンプルコードを以下に掲載します。
Windows7(Intel Core i7CPU) VisualStudio2010にて動作確認しています。
#include<stdio.h> #include<windows.h> // ただの加算関数 int funcAdd(int a, int b) { return a + b; } // 上の関数のx86バイナリコード unsigned char codeAdd[] = { // _a$ = 8 // _b$ = 12 0x55, // push ebp 0x8b, 0xec, // mov ebp, esp 0x81, 0xec, 0xc0,0x00, 0x00, 0x00, // sub esp, 192 0x53, // push ebx 0x56, // push esi 0x57, // push edi 0x8d, 0xbd, 0x40, 0xff, 0xff, 0xff, // lea edi, [ebp - 192] 0xb9, 0x30, 0x00, 0x00, 0x00, // mov ecx, 48 0xb8, 0xcc, 0xcc, 0xcc, 0xcc, // mov eax, -858993460 0xf3, 0xab, // rep stosd 0x8b, 0x45, 0x08, // mov eax, _a$[ebp] 0x03, 0x45, 0x0c, // add eax, _b$[ebp] 0x5f, // pop edi 0x5e, // pop esi 0x5b, // pop ebx 0x8b, 0xe5, // mov esp, edp 0x5d, // pop edp 0xc3 // ret 0 }; typedef int(*funcType)(int a, int b); int main() { // 通常関数のコール結果 printf("func %d\n", funcAdd(5, 10)); // 少し前のwindowsから実行属性の無い領域を実行させられないプロテクトが入っている為 // 実行属性付の領域を確保する void* code = VirtualAlloc( NULL, sizeof(codeAdd), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if(code != NULL){ memcpy(code, codeAdd, sizeof(codeAdd)); DWORD oldProteted; VirtualProtect( code, sizeof(codeAdd), PAGE_EXECUTE, &oldProteted ); // このような感じでデータ領域のコードを実行属性の領域に移してきて実行させる事が出来る funcType func = (funcType)code; printf("code %d\n", func(5, 10)); } return 0; }
funcAddという関数はプログラムコードを逆アセンブラした際に、
プログラム領域に配置されますが、
codeAddというデータはデータ領域に配置されます。
ある程度の規模のプログラムになるとちょっと見ただけでは、
このcodeAdd部分を探すのは難しくなります。
さらにこれを応用すると実行コードを暗号化したり
別ファイルからリソースの如く読み込んだり出来ます。
より目につきにくく読みにくくすることが出来るようになります。
ちなみにx86バイナリコードは
構成プロパティのC/C++の出力ファイルから
アセンブリの出力で
“アセンブリコードとコンピュータ語コード(/FAc)”を選択するとビルド後に出力されるものを利用しています。
とは言えこのあたりの防衛はいつかは破られると言われているものです。
頻繁にバージョンアップを行って、最新版を生み出し続ける事が最大の対策かもしれないですね。
今回でドングルシリーズを終了して、
次回は最近興味を持っているHTML5的なお話か最近購入した3Dマウスのお話が出来たらいいなと思います。
ではまた。
CATEGORY
- about ヘキサ (166)
- 部活動 (6)
- CG (18)
- プロジェクトマネジメント (1)
- 研修 (5)
- 美学 (1)
- いいモノづくり道 (230)
- 採用 -お役立ち情報も- (149)
- プログラム (188)
- デザイン (99)
- ゲーム (274)
- 日記 (1,104)
- 書籍紹介 (113)
- その他 (875)
- 就活アドバイス (20)
- ラーメン (3)
- ライフハック (25)
- イベント紹介 (10)
- 料理 (23)
- TIPS (7)
- 怖い話 (3)
- サウンド (5)
- 子育て (1)
- 筋トレ (1)
- 商品紹介 (21)
- アプリ紹介 (31)
- ソフトウェア紹介 (33)
- ガジェット紹介 (12)
- サイト紹介 (10)
- 研究・開発 (34)
- 回路図 (4)
- アナログゲーム (40)
- 交流会 (21)
- 報告会 (3)
- インフラ (25)
- グリとブラン (6)
- カメラ (9)
- クラフト (27)
- 部活 (14)
- 画伯 (15)
- カレー (6)
- 音楽(洋楽) (6)
- 映画・舞台鑑賞 (43)
- 飼育 (5)
- いぬ (8)
- ねこ (19)
ARCHIVE
- 2024年
- 2023年
- 2022年
- 2021年
- 2020年
- 2019年
- 2018年
- 2017年
- 2016年
- 2015年
- 2014年
- 2013年
- 2012年
- 2011年
- 2010年
- 2009年
- 2008年
- 2007年