ãã¼ã«ã«ã¹ãã¬ã¼ã¸ã«ä¿åãããã¼ã¿ã®æå·å â Windows ã®å ´å
Gumblar ã«ãã FFFTP ã¸ã®æ»æã«ã¤ãã¦
Gumblarã«ããFFFTPã¸ã®æ»æã«ã¤ãã¦
FTPã®ã¢ã«ã¦ã³ããçã¿ããµã¤ããæ¹ç«ããGumblarã¦ã¤ã«ã¹ãçå¨ããµãã£ã¦ããã¾ãã
ãã®Gumblarã¦ã¤ã«ã¹ã®äºç¨®ããFFFTPãçã£ã¦æ»æãã¦ãããã¨ãå ±åããã¦ããã¾ãã 詳ããã¯ä»¥ä¸ã®ãµã¤ããåç §ãã¦ãã ããã
smilebanana
UnderForge of LackFFFTPã¯ãã¹ã¯ã¼ããã¬ã¸ã¹ããªã«è¨é²ãã¦ããã¾ããç°¡åãªæå·åãããã¦ããã¾ãããFFFTPã¯ãªã¼ãã³ã½ã¼ã¹ã§ãããããæå·ã®è§£é¤æ³ã¯ããã°ã©ã ã½ã¼ã¹ã解æããã°å¯è½ã§ãã
Gumblarã¦ã¤ã«ã¹ã®äºç¨®ã¯ãã¬ã¸ã¹ããªã«è¨é²ããã¦ãããã¹ã¯ã¼ããèªã¿åãããµã¤ãæ¹ç«ã«ä½¿ç¨ãã¦ããããã§ãã
ä¸è¨çç±ã«ããã以ä¸ã®ããããã®å¯¾çããåããã ããã
âæ¥ç¶å ã®FTPãµã¼ãã¼ãSSLçã«å¯¾å¿ãã¦ããå ´åã
âSSL対å¿ã®FTPã½ããã¸ã®åãæ¿ãããè¦ããã¾ããç¾å¨ãFFFTPã¯SSLçã«å¯¾å¿ãã¦ãã¾ããããªããåãæ¿ãã®éã¯ãã³ã³ããã¼ã«ããã«ã®ãããã°ã©ã ã®è¿½å ã¨åé¤ãã使ã£ã¦ãFFFTPãã¢ã³ã¤ã³ã¹ãã¼ã«ãã¦ãã ããã
âæ¥ç¶å ã®FTPãµã¼ãã¼ãSSLçã«å¯¾å¿ãã¦ããªãå ´åã
âãã¹ã¯ã¼ããFFFTPã«è¨æ¶ãããã®ããããæ¥ç¶æã«æ¯åãã¹ã¯ã¼ããå ¥åããããã«ãã¦ãã ããããã ããGumblarã¦ã¤ã«ã¹ã¯éä¿¡ã®ååãè¡ã£ã¦ããã¨èãããããããFTPãµã¼ãã¼ã«æ¥ç¶ããæç¹ã§ãGumblarã¦ã¤ã«ã¹ã«ãã¹ã¯ã¼ããçã¾ããå¯è½æ§ããããä¸å ¨ã§ã¯ããã¾ããã
ãªããUnderForge of Lackã«è¨è¼ããã¦ããã¬ã¸ã¹ããªã®åé¤ã§ãããé常ã¯FFFTPãã³ã³ããã¼ã«ããã«ã使ã£ã¦ã¢ã³ã¤ã³ã¹ãã¼ã«ãã段éã§åé¤ããã¾ãã
ã¨ãã£ãã®ã§ï¼FFFTP ã®ã½ã¼ã¹ãèªãã§ã¿ã¾ããï¼
/*----- ãã¹ã¯ã¼ããæå·åãã ------------------------------------------------ * * Parameter * char *Str : ãã¹ã¯ã¼ã * kchar *Buf : æå·åãããã¹ã¯ã¼ããæ ¼ç´ãããããã¡ * * Return Value * ãªã *----------------------------------------------------------------------------*/ static void EncodePassword(char *Str, char *Buf) { unsigned char *Get; unsigned char *Put; int Rnd; int Ch; srand((unsigned)time(NULL)); Get = (unsigned char *)Str; Put = (unsigned char *)Buf; while(*Get != NUL) { Rnd = rand() % 3; Ch = ((int)*Get++) << Rnd; Ch = (unsigned char)Ch | (unsigned char)(Ch >> 8); *Put++ = 0x40 | ((Rnd & 0x3) << 4) | (Ch & 0xF); *Put++ = 0x40 | ((Ch >> 4) & 0xF); if((*(Put-2) & 0x1) != 0) *Put++ = (rand() % 62) + 0x40; } *Put = NUL; return; } /*----- ãã¹ã¯ã¼ãã®æå·åã解ã ---------------------------------------------- * * Parameter * char *Str : æå·åãããã¹ã¯ã¼ã * kchar *Buf : ãã¹ã¯ã¼ããæ ¼ç´ãããããã¡ * * Return Value * ãªã *----------------------------------------------------------------------------*/ static void DecodePassword(char *Str, char *Buf) { unsigned char *Get; unsigned char *Put; int Rnd; int Ch; Get = (unsigned char *)Str; Put = (unsigned char *)Buf; while(*Get != NUL) { Rnd = ((unsigned int)*Get >> 4) & 0x3; Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4); Ch <<= 8; if((*Get & 0x1) != 0) Get++; Get += 2; Ch >>= Rnd; Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF); *Put++ = Ch; } *Put = NUL; return; }
ä»ååé¡ã¨ãªã£ã¦ããæ¥ç¶ãã¹ã¯ã¼ãçã¯ï¼ä¸è¨ EncodePassword é¢æ°ã§ã¨ã³ã³ã¼ãããã¦ã¬ã¸ã¹ããªã«è¨é²ããã¦ããããã§ãï¼
CryptProtectData API
æåã«æ³¨ææ¸ãï¼
ç§ã¯ã»ãã¥ãªãã£ã®å°é家ã§ã¯ããã¾ããã®ã§ï¼ä¸è¨ã®å
容ãä¿¡ç¨ããåã«ç¤¾å
å¤ã®ã»ãã¥ãªãã£å°é家ã®æ¹ã«ããç¸è«ããããã¨ããããããã¾ãï¼
ãã¦ä»åã®ä»¶ï¼ããªã¼ãã³ã½ã¼ã¹ãªãããã¯ãã®å ´åï¼ã½ã¼ã¹ãèªãã°ãã³ã¼ãæ¹æ³ãåãããã¨ããç¹ãããæ°ã«ãªããããªæ°ã«ãªããªããããªæãã§ãï¼
ã¾ãåºçºç¹ã¨ãã¦ï¼Microsoft ãæ¨å¥¨ãã¦ããæ¹æ³ãè¦ã¦ã¿ã¾ãããï¼
Storing Passwords
Never store passwords in plaintext (unencrypted). Encrypting passwords significantly increases their security. For information about storing encrypted passwords, see CryptProtectData. For information about encrypting passwords in memory, see CryptProtectMemory. Store passwords in as few places as possible. The more places a password is stored, the greater the chance that an intruder might find it. Never store passwords in a Web page or in a Web-based file. Storing passwords in a Web page or in a Web-based file allows them to be easily compromised.
After you have encrypted a password and stored it, use secure ACLs to limit access to the file. Alternatively, you can store passwords and encryption keys on removable devices. Storing passwords and encryption keys on a removable media, such as a smart card, helps create a more secure system. After a password is retrieved for a given session, the card can be removed, thereby removing the possibility that an intruder can gain access to it.
ä¸è¨æç« ã«ããããã«ï¼CryptProtectData API ã CryptProtectMemory API *1 ã使ã£ã¦ãã¼ã¿ãæå·åããä¸ã§ï¼ä¿åå
ã®ã¢ã¯ã»ã¹ã³ã³ããã¼ã«ãªã¹ãã«ãæ°ãã¤ããï¼ã¨ããã¾ãï¼
å®éï¼CryptProtectData ã§ãã¹ã¯ã¼ãçãæå·åãã¦ãããªã¼ãã³ã½ã¼ã¹ãªãããã¯ãã«ï¼Chromium (Google Chrome) ãããã¾ãï¼
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/password_manager/encryptor.h" #include <windows.h> #include <wincrypt.h> #include "base/string_util.h" #pragma comment(lib, "crypt32.lib") bool Encryptor::EncryptWideString(const std::wstring& plaintext, std::string* ciphertext) { return EncryptString(WideToUTF8(plaintext), ciphertext); } bool Encryptor::DecryptWideString(const std::string& ciphertext, std::wstring* plaintext){ std::string utf8; if (!DecryptString(ciphertext, &utf8)) return false; *plaintext = UTF8ToWide(utf8); return true; } bool Encryptor::EncryptString(const std::string& plaintext, std::string* ciphertext) { DATA_BLOB input; input.pbData = const_cast<BYTE*>( reinterpret_cast<const BYTE*>(plaintext.data())); input.cbData = static_cast<DWORD>(plaintext.length()); DATA_BLOB output; BOOL result = CryptProtectData(&input, L"", NULL, NULL, NULL, 0, &output); if (!result) return false; // this does a copy ciphertext->assign(reinterpret_cast<std::string::value_type*>(output.pbData), output.cbData); LocalFree(output.pbData); return true; } bool Encryptor::DecryptString(const std::string& ciphertext, std::string* plaintext){ DATA_BLOB input; input.pbData = const_cast<BYTE*>( reinterpret_cast<const BYTE*>(ciphertext.data())); input.cbData = static_cast<DWORD>(ciphertext.length()); DATA_BLOB output; BOOL result = CryptUnprotectData(&input, NULL, NULL, NULL, NULL, 0, &output); if(!result) return false; plaintext->assign(reinterpret_cast<char*>(output.pbData), output.cbData); LocalFree(output.pbData); return true; }
Chromium Revision 8066 ã§ã¯ï¼CryptProtectData API ã® pOptionalEntropy å¼æ°ããã³ pPromptStruct å¼æ°ã« NULL ã渡ãã¦ãã¾ãï¼ããã¯ï¼åãã³ã³ãã¥ã¼ã¿ã®åãã¦ã¼ã¶ã§ããã°ï¼èª°ã§ã CryptUnprotectData API ã§å¾©å·ã§ãããã¨ãæå³ãã¾ãï¼
åãã³ã³ãã¥ã¼ã¿ã使ãå¥ã®ã¦ã¼ã¶ãã復å·ã¯ï¼(æå·åãè¡ããã PC ç°å¢ã®æå·åè¨å®ã§æå¾
ãããç¨åº¦ã«) é²ããã¾ãï¼æå·åããããã¼ã¿åãæµåºããå ´åã«ãï¼å¾©å·ã¯ (æå·åãè¡ããã PC ç°å¢ã®æå·åè¨å®ã§æå¾
ãããç¨åº¦ã«) é²ããã¾ãï¼
ä¾ã¨ãã¦ï¼ä»¥ä¸ã®ãã¤ãåã Chromium ã¨åãæ¹æ³ã§æå·åãã¦ã¿ã¾ããï¼
const unsigned char original_password[] = { 0x6b, 0x6f, 0x67, 0x61, 0x69, 0x64, 0x61, 0x6e, };
æå ã«æ§ç¯ããä»®æ³ç°å¢ã® Windows XP SP3 ã§ã¯ï¼ä¸è¨ãã¤ãåãã以ä¸ã®ãããªãã¤ãåãçæããã¾ããï¼ãªãï¼åãå ¥åãã¼ã¿ã§ãã£ã¦ãæ¯åç°ãªãçµæãè¿ããã¾ããï¼ã©ã®åºåã«å¯¾ãã¦ã復å·çµæã¯åãã«ãªãã¾ãï¼
const unsigned char encrypted_password[] = { 0x01, 0x00, 0x00, 0x00, 0xd0, 0x8c, 0x9d, 0xdf, 0x01, 0x15, 0xd1, 0x11, 0x8c, 0x7a, 0x00, 0xc0, 0x4f, 0xc2, 0x97, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x22, 0xd6, 0xf5, 0x5e, 0x47, 0x15, 0xa1, 0x4d, 0x97, 0xde, 0x34, 0xbf, 0xc8, 0xb9, 0x4c, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x66, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf6, 0xbb, 0xf7, 0x64, 0xd3, 0xe0, 0x27, 0x58, 0xcf, 0xd0, 0xf1, 0xab, 0x21, 0x3f, 0x6b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x98, 0x84, 0x42, 0xa8, 0x82, 0xff, 0x44, 0xc2, 0x44, 0xeb, 0xaa, 0xc8, 0x84, 0xd2, 0x0d, 0x18, 0x10, 0x00, 0x00, 0x00, 0x56, 0x63, 0x8c, 0x93, 0x17, 0x8e, 0xe0, 0x7d, 0x38, 0x77, 0x6f, 0xe1, 0xda, 0x64, 0x85, 0xdc, 0x14, 0x00, 0x00, 0x00, 0x31, 0xd4, 0xab, 0x9c, 0xeb, 0xc3, 0x17, 0x62, 0xa6, 0xcd, 0xcc, 0x1c, 0x0e, 0x35, 0xfa, 0x13, 0x52, 0x0e, 0x00, 0x3a, };
ãã¦ãã®æå·åï¼åä¸ã¦ã¼ã¶ã¼ã®ããã»ã¹ããã¯ç°¡åã«å¾©å·ã§ãã¦ãã¾ãã¨ãããã¨ã§ï¼ä½ããã®ã¢ããªã±ã¼ã·ã§ã³ãé¥è½ããæç¹ã§ãã¾ãæå³ãããã¾ãã*2ï¼ã¨ã¯ããï¼Windows ã§åä¸ã¦ã¼ã¶ã¼ã®ããã»ã¹ããã®æ»æã«å¯¾å¦ããã®ã¯å¤§å¤ã§ãï¼ããã¯ãã¯ã OS ã®é åï¼ãããæ´å²ã®é·ã OS ã¨ãããã¨ã§ï¼æ¹åãããã«ãäºææ§ã¸ã®å½±é¿ã大ããï¼Integrity Level ã UAC ã®å°å
¥ã§è¦ããããªå¤§ããªæ··ä¹±ã¨é·æã®åªåãã¤ãã¾ã¨ãã¾ãï¼
Windows ç°å¢ã§ã®éçºçµé¨è
åãã« 3 è¡ã§ã¾ã¨ããã¨ï¼ã¤ã¾ãã¯ããã§ãï¼
- ä»®ã«ï¼Integrity Level Low ãªå¯¾è©±åããã»ã¹ (ãã©ã¦ã¶ããã®ãã©ã°ã¤ã³) ã«ä»»æã®ã³ã¼ããå®è¡å¯è½ãªèå¼±æ§ãåå¨ããã¨ãã¦ï¼
- ãã®ããã»ã¹ã§ã¯ï¼ã¬ã¸ã¹ããªããã¡ã¤ã«ãããã¼ã¿ãèªã¿åºãããã® API 㨠CryptUnprotectData API ãå®è¡å¯è½ã¨ãã
- ãã¦ï¼ã¬ã¸ã¹ããªããã¡ã¤ã«ããå人æ å ± (ã®ããã«ä¿ç®¡ããã¦ããæ©å¯ãã¼ã¿) ãçã¿åºãããªãããã«ããã«ã¯ï¼
ããããè¦æ±ã®å®ç¾ã¯ï¼(ä»ã® Windows ã§ã¯) ã¢ããªã±ã¼ã·ã§ã³ã¨è¨ããã OS ã¨ããããï¼ã¢ã³ãã¦ã£ã«ã¹ã½ããã®é åã®ããã«ãæãããã¾ãï¼
ä»æ¥ãç¾å®ããã©ãã§ãâ¦*3
å®é¨ã«ä½¿ã£ããµã³ãã«ã³ã¼ã
#include <iostream> #include <windows.h> #include <wincrypt.h> #include <iostream> #pragma comment(lib, "crypt32.lib") bool EncryptString(const std::string& plaintext, std::string* ciphertext) { DATA_BLOB input; input.pbData = const_cast<BYTE*>( reinterpret_cast<const BYTE*>(plaintext.data())); input.cbData = static_cast<DWORD>(plaintext.length()); DATA_BLOB output; BOOL result = CryptProtectData( &input, L"", NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, // remove if you want to use password &output); if (!result) return false; // this does a copy ciphertext->assign(reinterpret_cast<std::string::value_type*>(output.pbData), output.cbData); LocalFree(output.pbData); return true; } bool DecryptString(const std::string& ciphertext, std::string* plaintext){ DATA_BLOB input; input.pbData = const_cast<BYTE*>( reinterpret_cast<const BYTE*>(ciphertext.data())); input.cbData = static_cast<DWORD>(ciphertext.length()); DATA_BLOB output; BOOL result = CryptUnprotectData( &input, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, // remove if you want to use password &output); if(!result) return false; plaintext->assign(reinterpret_cast<char*>(output.pbData), output.cbData); LocalFree(output.pbData); return true; } void dump_string(const std::string& label, const std::string& test); int main() { std::string original_test = "kogaidan"; dump_string("original_password", original_test); std::string encrypted_text; if (!EncryptString(original_test, &encrypted_text)) { std::cerr << "EncryptString failed" << std::endl; return 1; } dump_string("encrypted_password", encrypted_text); std::string derypted_text; if (!DecryptString(encrypted_text, &derypted_text)) { std::cerr << "DecryptString failed" << std::endl; return 1; } dump_string("decrypted_password", derypted_text); return 0; } #pragma region dump_string void dump_string(const std::string& label, const std::string& test) { std::cout << "const unsigned char " << label.c_str() << "[] = {\n"; std::cout << std::hex; int count = 0; for (std::string::const_iterator i = test.begin(); i != test.end(); ++i) { if (count++ == 0) { std::cout << " "; } std::cout << "0x"; std::cout.width(2); std::cout.fill('0'); std::cout << (*i & 0xff) << ", "; if (count >= 8) { std::cout << "\n"; count = 0; } } std::cout << std::dec; std::cout << "};\n"; std::cout << std::endl; } #pragma endregion
åè
- DPAPI / DPAPIによる暗号化 - EternalWindows
- CryptProtectData ã®ä½¿ç¨æ¹æ³ã«ã¤ãã¦è§£èª¬ããã¦ãã¾ãï¼ããã³ããã表示ãã¦ãã¹ã¯ã¼ããä½µç¨ããæ¹æ³ããããã¦ç´¹ä»ããã¦ãã¾ãï¼
- http://www.forest.impress.co.jp/docs/news/20100130_346056.html:title=
- FFFTP ãä¿åãããã¼ã¿ãçããã¦ãã件ã«ã¤ãã¦è²ã
åè2
CryptProtectMemory API 㯠Windows Vista 以éã§å©ç¨å¯è½*4ã§ï¼ä»åã®ãã°ãªã³ã»ãã·ã§ã³ã®ã¿å¾©å·å¯è½ï¼ã¨ãã£ãæéä»ãã®æå·åãè¡ããã¨ãã§ãã¾ãï¼
pDataã¯ãæå·åããããã¼ã¿ãæå®ãã¾ãã cbDataã¯ãpbDataã®ãµã¤ãºãæå®ãã¾ãã ãã®å¤ã¯ãCRYPTPROTECTMEMORY_BLOCK_SIZEå®æ°ã®åæ°ã§ãªããã°ãªãã¾ããã dwFlagsã¯ã次ã«ç¤ºãå®æ°ã®ãããããæå®ãã¾ãã
å®æ° 説æ CRYPTPROTECTMEMORY_SAME_PROCESS æå·åãè¡ã£ãããã»ã¹ã ãããã¼ã¿ã復å·åã§ããã ããã»ã¹ãçµäºããã¨ãâã¿ãè¤ååãããã¨ã¯ã§ããªãã CRYPTPROTECTMEMORY_CROSS_PROCESS æå·åãè¡ã£ãããã»ã¹ã ãã§ãªããå¥ã®ããã»ã¹ããã¼ã¿ãè¤ååã§ããã ã·ã¹ãã ãã·ã£ãããã¦ã³ããã¨ãâã¿ãè¤ååãããã¨ã¯ã§ããªãã CRYPTPROTECTMEMORY_SAME_LOGON æå·åãè¡ã£ãããã»ã¹ã ãã§ãªããå¥ã®ããã»ã¹ããã¼ã¿ãè¤ååã§ããã ãã ãããã®ããã»ã¹ã¯æå·åãè¡ã£ãããã»ã¹ã¨åã ãã°ãªã³ã»ãã·ã§ã³ã§åä½ãã¦ããå¿ è¦ãããã ã·ã¹ãã ãã·ã£ãããã¦ã³ããã¨ãâã¿ãè¤ååãããã¨ã¯ã§ããªãã
åè3
CredUIPromptForCredentials (Vista 以é㯠CredUIPromptForWindowsCredentialsæ¨å¥¨) ãï¼ãã¹ã¯ã¼ã管çã«ä½¿ãããã§ããï¼ã¦ã¼ã¶ã¼åä½ã«ç§å¯æ å ±ãæ ¼ç´ããããï¼åä¸ã¦ã¼ã¶ã¼ã®ããã»ã¹ãã©ããã²ã¨ã¤é¥è½ããæç¹ã§ãã°ãã«è¦ãã¾ãï¼
ã¯ããã«
ã¢ããªã±ã¼ã·ã§ã³ãããã¼ã¿ãã¼ã¹ã FTP ãµã¤ããªã©ä¿è·ããããªã½ã¼ã¹ã«ã¢ã¯ã»ã¹ããããã«ãã¦ã¼ã¶ã¼æä¾ã®è³æ ¼æ å ±ãå¿ è¦ãªå ´åãããã¾ããããããã¦ã¼ã¶ã¼ã® ID ã¨ãã¹ã¯ã¼ããåå¾ãæ ¼ç´ãããã¨ã¯ãã·ã¹ãã ã«ã¨ã£ã¦ã»ãã¥ãªãã£ä¸ã®ãªã¹ã¯ã«ããªãã¾ããå¯è½ã§ããã°ãã¦ã¼ã¶ã¼ãè³æ ¼æ å ±ãæä¾ããªãããã«ããå¿ è¦ãããã¾ãã (ãã¨ãã°ããã¼ã¿ãã¼ã¹ç¨ã«çµ±åãããèªè¨¼ã使ç¨ãããªã©)ãããã¯é¿ããããªãå ´åãããã¾ããã¦ã¼ã¶ã¼ããã®è³æ ¼æ å ±ã®ãªã¯ã¨ã¹ããå¿ è¦ã§ãã¢ããªã±ã¼ã·ã§ã³ã¯ãMicrosoft® Windows® XP ã¾ã㯠Microsoft® Windows Server 2003 ä¸ã§å®è¡ãã¦ããå ´åããªãã¬ã¼ãã£ã³ã° ã·ã¹ãã ã¯ãã®ã¿ã¹ã¯ã容æã«ããé¢æ°ãæä¾ãã¾ãã
Stored User Names and Passwords
Windows XP 㨠Windows Server 2003 ã¯ããStored User Names and Passwordsãã¨å¼ã°ããæ©è½ (å³ 1 ãåç §ãã¦ãã ãã) ã使ç¨ãã¦ã1 ã¤ã® Windows ã¦ã¼ã¶ã¼ ã¢ã«ã¦ã³ãã« 1 ã»ããã®è³æ ¼æ å ±ãé¢é£ä»ããData Protection API (DPAPI) ã使ç¨ãã¦ããããã®è³æ ¼æ å ±ãæ ¼ç´ãã¾ãã
å³ 1. Windows XP ã® [Credential Management] ãã¤ã¢ãã° ããã¯ã¹
ã¢ããªã±ã¼ã·ã§ã³ã Windows XP ã¾ã㯠Windows .NET ä¸ã§å®è¡ãã¦ããå ´åãã¢ããªã±ã¼ã·ã§ã³ã¯ãè³æ ¼æ å ±ç®¡ç API æ©è½ã使ç¨ãã¦ãã¦ã¼ã¶ã¼ã«è³æ ¼æ å ±ã確èªãã¾ãããããã® API ã®ä½¿ç¨ã«ãã£ã¦ãä¸è²«ããã¦ã¼ã¶ã¼ ã¤ã³ã¿ã¼ãã§ã¤ã¹ (å³ 2 ãåç §ãã¦ãã ãã) ãæä¾ããããªãã¬ã¼ãã£ã³ã° ã·ã¹ãã ã«ãããããã®è³æ ¼æ å ±ã®ãã£ãã·ã¥ãèªåçã«ãµãã¼ããã¾ãã
å³ 2. æ¨æºã® Windows XP ã®è³æ ¼æ å ±ãã¤ã¢ãã° ããã¯ã¹
ã¦ã¼ã¶ã¼ã®è³æ ¼æ å ±ãã¢ããªã±ã¼ã·ã§ã³ã§ããªã¯ã¨ã¹ããæ ¼ç´ã使ç¨ãããã¨ã«é¢ããåé¡ã¯ãMichael Howard and David LeBlanc ã«ãããããã°ã©ãã®ããã®ã»ãã¥ãªãã£å¯¾çãã¯ããã¯ãã§ããã«è©³ãã説æããã¦ãã¾ãã詳細æ å ±ã«ã¤ãã¦ã¯ããã®æ¬ãèªããã¨ããå§ããã¾ããããã§ã¯ãMicrosoft® Visual Basic® .NET 㨠C# ã¢ããªã±ã¼ã·ã§ã³ããã®è³æ ¼æ å ±ç®¡ç API ã®ä½¿ç¨æ¹æ³ã示ãã¾ãã
ã¾ãã EternalWindows ããã®è¨äºãåèã«ï¼
*1:ãããã® API 㯠Windows 2000 以éã§ã®ã¿å©ç¨å¯è½ã§ã
*2:仮㫠pOptionalEntropy å¼æ°ãä½µç¨ããã¨ãã¦ãä»åº¦ã¯ pOptionalEntropy ã®å 容ãã©ããã£ã¦é ããã¨ããåé¡ã«ãªãã¾ãï¼pOptionalEntropy ã®å 容ãã½ã¼ã¹ã³ã¼ãã«æ¸ãã¦ãã¾ãã®ã¯ï¼ãã¹ã¯ã¼ããã½ã¼ã¹ã³ã¼ãã«æ¸ãã¦ãã¾ããã¨ã¨åãã§ãï¼
*3:[http://niha28.sakura.ne.jp/b/log/100:title=å ãã¿]
*4:Windows 2000 SP3 以éã«é¢ãã¦ã¯ [http://msdn.microsoft.com/en-us/library/aa387693.aspx:title=RtlEncryptMemory]