スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

libpng……

ネタややってみたいことはたくさんあるものの
会社のPCが Windows 2000 なうえに VC++6.0、さらにメモリーも256MBしか積んでおらずろくなことができず(つД`)

そういえば BMP ⇒ PNG の変換するツールを作成したのですが
その際せっかくなのでつい最近報告された脆弱性を修正した libpng (Ver1.2.13)を使用したのですが
中の人がコンパイルチェックしていなかったのか、
変数の宣言がブロックの先頭で行われていなかったため VC++6.0 でエラーになりますた。
(VC++6.0 の C言語の仕様は古いので……)

意外に適当なんだな、と思った今日この頃。
……って 1.2.14 が出とるΣ(゚д゚lll)ガーン



今日は適当なソースを載せて終えてみる

bool GetDriveLetter()
{
TCHAR device_names[10000];
TCHAR device_path[10000];
TCHAR *cp;
TCHAR drive_letter[500];

::QueryDosDevice(NULL, device_names, 10000);

cp = device_names;
while(*cp != '\0')
{
drive_letter[0] = NULL;
::QueryDosDevice(cp, device_path, 10000);
_tprintf(_T("%s ... %s\n"), cp, device_path);

while(*cp++ != '\0');
}

return true;
}


デバイス一覧を表示するプログラムです。
バッファのサイズが妙に大きいのは Windows 2000 と XP のデバイスの数が大量に存在するためです。

本当は .Net Framework 2.0 とか 3.0 とか書いてみたいけど
時間がねえー


スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2006.11.30 | Comments(0) | Trackback(0) | プログラム

Cryptography API

またずいぶん期間があいてしもうた・・・・・・

いやネタがないわけではないのだが
プログラムを載せるのは結構労力が必要なのです(´・ω・`)
(いい加減なコード載せるわけにもいかんしのお)

しかし最近思ったのだがインターネット上に載っている
ソースコードはあまり信頼でき無いと気づいた。
(参考にしては毎回毎回間違った部分を修正している自分がいる)

プログラム掲示板で回答することがよくあるのだが
質問の際に提示されたコードが明らかにどこかのサイトからコピーしてきた
ものだということがよくある。
(プログラムって人によって個性が出るからすぐわかる)
ひどいものになると複数のサイトからコピーして混ぜた状態のものがあり
変数の命名がめちゃくちゃなソースが提示されたりする。
・・・・・・これが日曜プログラマーや学生ならまだいいのだが会社人だったすることがあるので困ったものだ。

そこで前述の話になるわけで・・・・・・
いったいどれだけ危険なコードが世の中には出回っているのだろうか?

まあ、あまり人のこといえないか(;´Д`)y─┛~~
正直自分のソースコードに自信なんか無いしね・・・・・・



というわけで(?)今回は「Cryptography API」を使用したプログラムです。
IEにインストールされている証明書の情報を取得します。
コメント化されている箇所は取得した証明書に情報を追加するコードなので
動作確認する際には注意してください。
(実際に書き換えられてしまいます)
※確認する際には自分の証明書(My)で試してみるのがよかろうかと。

( ´・ω・)ちなみにプロンプト画面で入力する情報は"ストア"ですからね?


#include "stdafx.h"

#include <windows.h>
#include <wincrypt.h>
#include <comdef.h>
#include <conio.h>
#include <prsht.h>
#include <Cryptuiapi.h>

static const int MY_ENCODING_TYPE = PKCS_7_ASN_ENCODING |
X509_ASN_ENCODING;


bool CertStore()
{
HANDLE cert_store;
PCCERT_CONTEXT cert_context = NULL;
TCHAR cert_name[256];
TCHAR store_name[256];


printf("取得する証明書ストアを入力してください。\n");
wscanf_s(L"%s", store_name);

if(!(cert_store = ::CertOpenSystemStore(NULL, store_name)))
{
printf("証明書ストアのオープンに失敗しました。\n");
while(!_kbhit());
exit(1);
}

while(cert_context = ::CertEnumCertificatesInStore(cert_store,
cert_context))
{
if(::CertGetNameString(
cert_context,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
cert_name,
128))
{
printf("\n発行先 : %ls \n",cert_name);
}
else
{
printf("\n発行先の取得に失敗しました。\n");
}

/*
LPCSTR usage_identifier = szOID_RSA_RC4;

if(::CertAddEnhancedKeyUsageIdentifier(
cert_context,
usage_identifier))
{
printf("拡張キー使用法に(szOID_RSA_RC4)を追加しました。\n");
}
else
{
printf("拡張キー使用法に(szOID_RSA_RC4)を追加できませんでした。\n");
}

TCHAR response;
BYTE *name =
reinterpret_cast<BYTE *>(L"Temp Name.");
CRYPT_DATA_BLOB friendly_name_blob = {32,name};

printf("フレンドリ名を追加しますか?");
wscanf_s(L"%c", &response);
if(response == 'y')
{
if(CertSetCertificateContextProperty(
cert_context,
CERT_FRIENDLY_NAME_PROP_ID,
0,
&friendly_name_blob))
{
wprintf(L"フレンドリ名を設定しました。\n");
}
else
{
wprintf(L"フレンドリ名を設定できませんでした。\n");
}
}
*/

// 電子証明書詳細の表示
CRYPTUI_VIEWCERTIFICATE_STRUCT *ui_certificate = new
CRYPTUI_VIEWCERTIFICATE_STRUCT;
BOOL properties_changed = false;
SecureZeroMemory(ui_certificate,
sizeof(CRYPTUI_VIEWCERTIFICATE_STRUCT));
ui_certificate->dwSize = sizeof(CRYPTUI_VIEWCERTIFICATE_STRUCT);
ui_certificate->dwFlags = CRYPTUI_DISABLE_EDITPROPERTIES |
CRYPTUI_DISABLE_ADDTOSTORE |
CRYPTUI_DISABLE_EXPORT;
ui_certificate->pCertContext = cert_context;
ui_certificate->szTitle = L"証明書の詳細";
ui_certificate->nStartPage = 0;
::CryptUIDlgViewCertificate(ui_certificate, &properties_changed);
delete ui_certificate;

printf("何かキーを押してください。\n");
while(!_kbhit());
}

if(cert_context)
{
::CertFreeCertificateContext(cert_context);
}

::CertCloseStore(cert_store, 0);
printf("全ての証明書ストアの取得に成功しました。\n");

return true;
}



適当に main 関数から呼び出して実行してみてくらはい。




テーマ:プログラミング - ジャンル:コンピュータ

2006.11.27 | Comments(0) | Trackback(0) | プログラム

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。