JP2010231477A - プログラム及びプログラム実行装置 - Google Patents
プログラム及びプログラム実行装置 Download PDFInfo
- Publication number
- JP2010231477A JP2010231477A JP2009078062A JP2009078062A JP2010231477A JP 2010231477 A JP2010231477 A JP 2010231477A JP 2009078062 A JP2009078062 A JP 2009078062A JP 2009078062 A JP2009078062 A JP 2009078062A JP 2010231477 A JP2010231477 A JP 2010231477A
- Authority
- JP
- Japan
- Prior art keywords
- program code
- code
- address
- external
- external reference
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Abstract
【解決手段】オブジェクトファイル100は、原プログラムコードの符号化結果である符号化プログラムコード132と、符号化プログラムコードを復号して原プログラムコードを復元するための復号コード124と、原プログラムコード中で参照される外部オブジェクトのアドレスを表す外部参照テーブル142と、外部プログラムからの呼び出しに応じて、復号プログラムコードにより復元された原プログラムコードを、外部参照テーブルのアドレスを引数として呼び出すための呼び出しコード128と、を備え、原プログラムコードは、外部参照テーブルのアドレスにアクセスして外部オブジェクトのアドレスを取得し、そのアドレスを用いて外部オブジェクトを参照する。
【選択図】図1
Description
#include <windows.h>
// 独自セクションの作成
#pragma section(".mysect", write, execute )
bool g_isInitialized = false;
char BaseData[1024];
// 外部参照テーブル
struct ExternalObjectReferenceTable {
HANDLE hHeap;
char* pData;
DWORD (WINAPI * pGetLastError)(VOID);
LPVOID (WINAPI * pHeapAlloc)(HANDLE, DWORD, SIZE_T);
BOOL (WINAPI * pHeapFree)(HANDLE, DWORD, LPVOID);
} g_table = { NULL, BaseData, NULL, NULL, NULL };
// 静的に外部参照テーブルを作成する場合には、ここで行う
extern bool DoDecrypt(unsigned char*, BYTE*, BYTE*);
// 初期化関数
int initialize(void)
{
if (g_isInitialized) return 0;
// 復号コード
static unsigned char key[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
BYTE* pFuncTop = reinterpret_cast<BYTE*>(topFunc);
BYTE* pFuncTail= reinterpret_cast<BYTE*>(tailFunc);
if (DoDecrypt(key, pFuncTop, pFuncTail)) return -6;
// 外部参照テーブル作成コード
g_table.hHeap = GetProcessHeap();
if (g_table.hHeap == NULL) return -1;
HINSTANCE hKERNEL32 = LoadLibrary("kernel32.dll");
if (hKERNEL32 == NULL) return -2;
// kernel32.dll
g_table.pGetLastError = (DWORD (WINAPI * )(VOID))
GetProcAddress(hKERNEL32, "GetLastError");
if (g_table.pGetLastError == NULL) return -3;
g_table.pHeapAlloc = (LPVOID (WINAPI *)(HANDLE, DWORD, SIZE_T))
GetProcAddress(hKERNEL32, "HeapAlloc");
if (g_table.pHeapAlloc == NULL) return -4;
g_table.pHeapFree = (BOOL (WINAPI *)(HANDLE, DWORD, LPVOID))
GetProcAddress(hKERNEL32, "HeapFree");
if (g_table.pHeapFree == NULL) return -5;
g_isInitialized = true;
return 0;
}
// 呼び出しコード
int callTopFunc ( unsigned char* x, unsigned int y) {
if (false == g_isInitialized) return -1;
return topFunc(x, y, &g_table);
}
#pragma code_seg(".mysect")
// 原プログラムコード開始
int topFunc(unsigned char* x, unsigned int y,
// 引数(スタックまたはレジスタ経由)で外部参照テーブルのアドレスを渡す例
struct ExternalObjectReferenceTable& pTable) {
// 原プログラムコード内から外部オブジェクトを参照する例
unsigned char* pBuffer = (unsigned char*)(*pTable->pHeapAlloc)(pTable->hHeap, 0, y);
// 機能の提供
// 原プログラムコード内から外部オブジェクトを参照する例
if (pBuffer != NULL) (*pTable->pHeapFree)(pTable->hHeap, 0, pBuffer);
return 0;
}
int tailFunc(int a){ return a; }
// 符号化対象コード終了
#pragma code_seg()
上述の実施の形態では、復号コード124と外部参照テーブル作成コード126とを含む初期化関数122を、リンク元コードから明示的に呼び出す構成を説明したが、これは一例に過ぎない。リンク元コードから初期化関数122を明示的に呼び出す代わりに、リンク元コードから呼び出しコード128が最初に呼び出された際に、初期化関数122を実行するようにしてもよい。このために、ライブラリの初期化が既に実行されたか未実行であるかを示すフラグを例えばデータセクション140などに用意しておき、呼び出しコード128が呼ばれる毎にそのフラグを確認して、最初の呼び出しであれば、初期化関数122を呼び出す構成にすればよい。フラグが既実行を示す場合には、初期化関数122を呼び出さない。この例では、リンク元コードがライブラリの初期化関数122を呼ぶ手間が省かれる。
上述の実施の形態では、原プログラムコードから外部オブジェクトへの参照のために外部参照テーブルを用いたが、外部参照のためのデータがテーブルである必要はなく、外部参照に必要な情報が原プログラムコードに渡すことができるものであればどのような方法を用いてもよい。例えば、個々の外部オブジェクト毎に当該オブジェクトのメモリ400上でのアドレスを示す外部参照情報をデータセクション140上に記述又は生成し、外部オブジェクトを参照する関数に対し、そのオブジェクトに対応する外部参照情報のアドレスを引数として渡すようにしてもよい。すなわち、複数の外部オブジェクトのアドレス情報をテーブルの形で一括して原プログラムコードに渡すのではなく、個々の外部オブジェクトのアドレス情報を個別に原プログラムコード中の関数に渡してもよい。特に、原プログラムコードが複数のインタフェースを持つ場合には、すべてのインタフェースに同一の情報(外部参照テーブル)を渡すのではなく、インタフェース毎に、それぞれ必要な外部参照情報を渡すという方法も取れる。
上述の実施の形態では、符号化プログラムコード132の復号結果である原プログラムコードを、独自セクション130に格納する例を説明したが、これは一例に過ぎない。実施の形態の手法は、原プログラムコードは外部参照テーブルを介して外部オブジェクトにアクセスするため、原プログラムコードがメモリ400のメモリ空間のどこに置かれても正しく動作する。したがって、変形例として、復号コード124の実行により実現された復号部410が、必要な大きさの、書き込み、読み出し及び実行のすべてが可能なメモリ領域をメモリ400のメモリ空間内に確保し、そのメモリ領域上に復号結果の原プログラムコードを置く構成としてもよい。この場合には、呼び出しコード128が、確保されたメモリ領域上の原プログラムコードを呼び出せるように、アドレス解決を行う必要がある。この場合には、復号部410は、原プログラムコードを置いたメモリ領域のアドレスを知っているので、呼び出しコード128に、関数ポインタを用いるなどの方法で、そのアドレスを原プログラムコード中の関数に渡すことで、そのアドレス解決を実現すればよい。
上述の実施の形態では、原プログラムコードを一括して符号化する構成を説明したが、原プログラムコードが複数の機能を提供する場合、機能毎に分割して符号化するようにしてもよい。個々の機能は、それぞれ1つ又は複数の関数により提供される。この場合には、機能を提供するコード毎に当該コードがオブジェクトファイル中のどこに置かれたかの情報を、符号化プログラムと復号コード124(復号部410)が把握する必要がある。この情報は、ライブラリのラベル名を用いれば取得することができる。例えば、原プログラムコード中において複数の対象関数をひとかたまりとして符号化する場合を考える(原プログラムコード中には、そのようなかたまりが1以上存在する)。この場合、ひとかたまりとして符号化する対象関数群のうち最初に置かれた関数の関数名をシンボルとするコード位置から、その符号化する対象関数群の直後に置かれた関数名をシンボルとするコード位置の直前までが、ひとかたまりの符号化対象のコード(すなわち原プログラムコード)であると判断される。また、符号化したい対象となる関数が一つの場合(すなわち符号化の単位が1関数)は、その関数の先頭から次の関数の先頭の直前までが、一単位の符号化対象のコードと認識される。また関数の終了位置がシンボルとして定義されるようなコンパイラを用いる場合の別の方法としては、符号化する対象関数(群)で最初に置かれた関数名をシンボルとするコード位置を開始位置として、符号化する対象関数(群)の最後の関数の終了シンボルのコード位置までを、符号化対象のコードであると判断する方法である。関数の置かれる順番は、ソースコード上の定義の順番であることが一般的である。また、関数を置く順番を外から指定できるコンパイラも存在する。これにより符号化対象の関数を置く順番を制御することができる。別の方法では、一般のリンカではその出力情報の一つとして、生成した実行ファイルのどの位置にどのシンボルの関数を置いたかを示す情報(マップ情報と呼ばれる)を出力させることができる。このマップ情報を参照することで、符号化対象のコードがファイル内のどの位置に置かれたかを知ることができる。このように機能単位で符号化すれば、実行時に必要なコードだけ復号するといった使い方が可能となる。
上述の実施の形態では、一度復号した原プログラムコードは実行されるだけであるが、実行された後に再び符号化する構成としてもよい。符号化の目的が暗号化の様に情報の秘匿である場合には、このように再符号化すれば、原プログラムコードがメモリ上に存在する時間を減らすことで、より強固に情報を秘匿することが期待できる。これには、例えば呼び出しコード128を呼び出す直前に復号コード126を実行し、呼び出しコード128の実行終了後に符号化のためのコードを実行して符号化結果を独自セクション130に上書きするようにプログラミングすればよい。
Claims (5)
- 原プログラムコードの符号化結果である符号化プログラムコードと、
前記符号化プログラムコードを復号して前記原プログラムコードを復元する処理を前記コンピュータに実行させるための復号プログラムコードと、
前記原プログラムコード中で参照される外部オブジェクトのアドレスを表す外部参照情報と、
外部プログラムからの呼び出しに応じて、前記復号プログラムコードにより復元された前記原プログラムコードを、前記外部参照情報のアドレスを引数として呼び出す処理を、前記コンピュータに実行させるための呼び出しプログラムコードと、
を備え、
前記原プログラムコードは、前記外部参照情報のアドレスにアクセスして前記外部オブジェクトのアドレスを取得し、取得したアドレスを用いて前記外部オブジェクトを参照する処理を前記コンピュータに実行させる、
ことを特徴とするプログラム。 - 前記原プログラムコード中で参照される外部オブジェクトのアドレスを取得し、前記外部参照情報として、取得したアドレスを含んだ情報を生成するための処理を前記コンピュータに実行させるための外部参照情報作成プログラムコード、
を更に備えることを特徴とする請求項1記載のプログラム。 - 前記プログラムは、
読み出し、書き込み、及び実行が可能なメモリ領域を前記コンピュータのメモリ上に確保する処理を前記コンピュータに実行させるためのプログラムコード、
を更に含み、
前記復号プログラムコードは、復号の結果である前記原プログラムコードを前記確保されたメモリ領域に書き込むための処理を前記コンピュータに実行させる、
ことを特徴とする請求項1記載のプログラム。 - 前記コンピュータを、
前記復号プログラムコードが既実行か未実行かを表すフラグを記憶するフラグ記憶手段、
前記呼び出しプログラムコードが呼び出された場合に、前記フラグ記憶手段に記憶された前記フラグが未実行を表す場合には前記復号プログラムコードを実行して前記フラグを既実行に変更し、前記フラグが既実行を表す場合には前記復号プログラムコードを実行しないように制御する制御手段、
として更に機能させることを特徴とする請求項1記載のプログラム。 - 原プログラムコードの符号化結果である符号化プログラムコードを復号して前記原プログラムコードを復元する復号手段と、
前記原プログラムコード中で参照される外部オブジェクトのアドレスを表す外部参照情報を記憶する外部参照情報記憶手段と、
外部プログラムからの呼び出しに応じて、前記復号プログラムコードにより復元された前記原プログラムコードを、前記外部参照情報のアドレスを引数として呼び出す呼び出し手段と、
前記呼び出し手段により呼び出された前記原プログラムコードを実行する実行手段と、
を備え、
前記原プログラムコードは、前記外部オブジェクトを参照する場合に、前記外部参照情報のアドレスにアクセスして前記外部オブジェクトのアドレスを取得し、取得したアドレスを用いて前記外部オブジェクトを参照する処理を前記実行手段に実行させる、
ことを特徴とするプログラム実行装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009078062A JP5387089B2 (ja) | 2009-03-27 | 2009-03-27 | プログラム及びプログラム実行装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009078062A JP5387089B2 (ja) | 2009-03-27 | 2009-03-27 | プログラム及びプログラム実行装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2010231477A true JP2010231477A (ja) | 2010-10-14 |
JP5387089B2 JP5387089B2 (ja) | 2014-01-15 |
Family
ID=43047231
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2009078062A Expired - Fee Related JP5387089B2 (ja) | 2009-03-27 | 2009-03-27 | プログラム及びプログラム実行装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP5387089B2 (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2014147748A1 (ja) * | 2013-03-19 | 2014-09-25 | 株式会社東芝 | コード処理装置およびプログラム |
WO2015072688A1 (ko) * | 2013-11-14 | 2015-05-21 | (주)잉카엔트웍스 | 프로그램 보호 장치 |
JP2020181522A (ja) * | 2019-04-26 | 2020-11-05 | ルネサスエレクトロニクス株式会社 | 記録システム |
CN117453548A (zh) * | 2023-10-26 | 2024-01-26 | 上海合芯数字科技有限公司 | 代码模块信息确定方法、装置、计算机设备和存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2000076075A (ja) * | 1998-09-02 | 2000-03-14 | Fuji Xerox Co Ltd | 再配置可能な実行プログラムの生成方法及び実行プログラム生成装置 |
JP2000330768A (ja) * | 1999-05-19 | 2000-11-30 | Nec Corp | 実行可能プログラムの入口設定方法 |
JP2001175466A (ja) * | 1999-12-21 | 2001-06-29 | Fuji Xerox Co Ltd | 実行プログラムの生成方法及び実行プログラム生成装置、実行プログラムの実行方法、並びに、コンピュータ可読プログラム記憶媒体 |
JP2005157502A (ja) * | 2003-11-20 | 2005-06-16 | Sony Corp | 情報処理装置及び情報処理方法、並びにコンピュータ・プログラム |
JP2005165919A (ja) * | 2003-12-05 | 2005-06-23 | Fuji Xerox Co Ltd | プログラム実行方法、プログラム作成方法、情報処理装置及びプログラム |
JP2007148575A (ja) * | 2005-11-24 | 2007-06-14 | Fuji Xerox Co Ltd | 保護済み実行プログラムの作成のためのプログラム、方法及び装置 |
-
2009
- 2009-03-27 JP JP2009078062A patent/JP5387089B2/ja not_active Expired - Fee Related
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2000076075A (ja) * | 1998-09-02 | 2000-03-14 | Fuji Xerox Co Ltd | 再配置可能な実行プログラムの生成方法及び実行プログラム生成装置 |
JP2000330768A (ja) * | 1999-05-19 | 2000-11-30 | Nec Corp | 実行可能プログラムの入口設定方法 |
JP2001175466A (ja) * | 1999-12-21 | 2001-06-29 | Fuji Xerox Co Ltd | 実行プログラムの生成方法及び実行プログラム生成装置、実行プログラムの実行方法、並びに、コンピュータ可読プログラム記憶媒体 |
JP2005157502A (ja) * | 2003-11-20 | 2005-06-16 | Sony Corp | 情報処理装置及び情報処理方法、並びにコンピュータ・プログラム |
JP2005165919A (ja) * | 2003-12-05 | 2005-06-23 | Fuji Xerox Co Ltd | プログラム実行方法、プログラム作成方法、情報処理装置及びプログラム |
JP2007148575A (ja) * | 2005-11-24 | 2007-06-14 | Fuji Xerox Co Ltd | 保護済み実行プログラムの作成のためのプログラム、方法及び装置 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2014147748A1 (ja) * | 2013-03-19 | 2014-09-25 | 株式会社東芝 | コード処理装置およびプログラム |
JP5996777B2 (ja) * | 2013-03-19 | 2016-09-21 | 株式会社東芝 | コード処理装置およびプログラム |
US10229277B2 (en) | 2013-03-19 | 2019-03-12 | Kabushiki Kaisha Toshiba | Code processing apparatus and computer program product |
WO2015072688A1 (ko) * | 2013-11-14 | 2015-05-21 | (주)잉카엔트웍스 | 프로그램 보호 장치 |
KR101556908B1 (ko) | 2013-11-14 | 2015-10-02 | (주)잉카엔트웍스 | 프로그램 보호 장치 |
CN105849737A (zh) * | 2013-11-14 | 2016-08-10 | Inka安特沃客有限公司 | 程序保护装置 |
JP2016538640A (ja) * | 2013-11-14 | 2016-12-08 | インカ・エントワークス・インコーポレイテッドInka Entworks, Inc. | プログラム保護装置 |
US9965621B2 (en) | 2013-11-14 | 2018-05-08 | Inka Entworks, Inc. | Program protection device |
JP2020181522A (ja) * | 2019-04-26 | 2020-11-05 | ルネサスエレクトロニクス株式会社 | 記録システム |
JP7123001B2 (ja) | 2019-04-26 | 2022-08-22 | ルネサスエレクトロニクス株式会社 | 記録システム |
CN117453548A (zh) * | 2023-10-26 | 2024-01-26 | 上海合芯数字科技有限公司 | 代码模块信息确定方法、装置、计算机设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
JP5387089B2 (ja) | 2014-01-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10185837B2 (en) | System and method for encapsulating and enabling protection through diverse variations in software libraries | |
US11620391B2 (en) | Data encryption based on immutable pointers | |
CN101300584B (zh) | 防止对软件或运行时数据的未经授权的修改的方法 | |
US11748468B2 (en) | Dynamic switching between pointer authentication regimes | |
US8745406B2 (en) | Program executable image encryption | |
Eilam | Reversing: secrets of reverse engineering | |
US10635823B2 (en) | Compiling techniques for hardening software programs against branching programming exploits | |
US9207918B2 (en) | Firmware extension method and firmware builder | |
US8090959B2 (en) | Method and apparatus for protecting .net programs | |
US8645930B2 (en) | System and method for obfuscation by common function and common function prototype | |
GB2438229A (en) | Method of moving data in a processing system by specifying the source and target address spaces to a move data instruction. | |
CN102402451A (zh) | 用户定义类型的编译时边界检查 | |
JP5387089B2 (ja) | プログラム及びプログラム実行装置 | |
JP5953867B2 (ja) | プログラム、及びプログラム保護装置 | |
US20130275688A1 (en) | Data processing device and method | |
Ramakesavan et al. | Intel memory protection extensions enabling guide | |
EP4012584A1 (en) | Method for creating extended elf files to provide unified and secure deployments | |
US20090106540A1 (en) | Apparatus and method for remanipulating instructions | |
JP2006072584A (ja) | 実行プログラム生成装置、実行プログラム生成方法、プログラム処理装置、プログラム処理方法及びプログラム | |
WO2022122942A1 (en) | Method for generating extended elf files to simplify complex and secure application deployments | |
Staursky | Lambda Calculus for Binary Security and Analysis | |
Chung | HSA Runtime | |
Clark | Transparently integrating debugging and dynamic binary instrumentation | |
JP2019121293A (ja) | ソースコード生成装置、ソースコード生成プログラム、ドキュメント生成システムおよびドキュメント生成方法 | |
Eimot | Offloading an encrypted user space file system on Graphical Processing Units |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20120222 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20130306 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20130326 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20130517 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20130806 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20130822 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20130910 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20130923 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 5387089 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |