スポンサーサイト

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

【同じタグを付けた記事の一覧】

LoadLibrary と相対パス

2009年09月23日(水)12時11分

Win9x

前回、Visual C++ 2005 でコンパイルした実行ファイルを Win95 にも対応させ、早速試したわけですが、…やっぱり動きませんでした。
Win95 ではどうやっても無理なのかと Win98 で試すも、同じエラー(ページ違反)がでて動きません。
どうやら今度はソースコードの問題、すなわち自分の実装が悪い、ということのようです。

LoadLibrary と相対パス

それでいろいろ試した結果「LoadLibrary に相対パス指定で DLL を呼び出していたこと」が問題点でした。
要旨を抜き出しますと、実行ファイルと同じ場所に「DLL」というフォルダをつくり、その中に DLL ファイルを置いて「LoadLibrary(".\\DLL\\DllName.dll")」のような感じで呼び出していたのですが、このやり方だと WinXP や Vista ではうまくいきますが、Win98 ではうまくいく場合といかない場合があります。

起動方法の違いによるカレント・ディレクトリの変化

うまくいかない場合というのは、たとえば読み込むファイルを実行ファイルにドラッグ&ドロップすることで起動した場合です。
このとき GetCurrentDirectory でカレントフォルダを確認すると Win9x の場合は「C:\」となっていましたので、どうやらここからの相対パスとして「C:\DLL\DllName.dll」を呼び出すようです。
そしてそこには DLL ファイルがないために失敗します。
実際に「C:\DLL\DllName.dll」を配置しておくと、このプログラムはちゃんと実行されます。

WinNT

その点で言えば WinXP であってもドラッグ&ドロップで実行ファイルを起動した場合は、カレントフォルダは「C:\Documents and Settings\ユーザー名」となりますので「そこに DLL ファイルはない」という点では同じなはずですが、WinXP や Vista の LoadLibrary は相対パスで指定した場合の基点として「実行ファイルの存在するフォルダ」を含めてくれるようで、うまくいってくれていたようでした。
さすがに WinXP や Vista のほうが、便利に作ってあります。

絶対パスに変換

以上の点をふまえて LoadLibrary は GetModuleFileName と _splitpath(_tsplitpath_s)を使って絶対パスにして使うことにしました。
それ以前に、呼び出しに失敗した DLL の関数を確認もせずに使っているといういい加減な実装も問題ですので、これも直しました。
もっとも、今回はこのいい加減な実装のおかげで問題点の洗い出しが早く済んだわけですが。

Win95

で、上記の点を修正することで Win98 では動作するようになったのですが、Win95 では相変わらずページ違反で動きませんでした。
まだ LoadLibrary で失敗しているようなのですが、いろいろ試してみるも理由がわからず。
結論は「Win98 以降に対応」でいいや、と…。

【追記:2010/08/26】

どうも、今(2010年8月)になって、この LoadLibrary の仕組みが問題になっているようです(「http://www.microsoft.com/japan/technet/security/advisory/2269637.mspx」や「http://support.microsoft.com/kb/2389418/」など)。
つまり攻撃者が、Windows の DLL 検索順上位に位置するフォルダに、同名の偽物 DLL ファイルを配置してしまうと、相対パス指定の LoadLibrary で DLL 呼び出しを行っているアプリケーションでは、その偽 DLL が優先して読み込まれてしまうため、偽 DLL に含まれた悪意あるコードが実行されてしまう、ということみたいです。
というわけですので、別に Win9x 系に対応する必要はなくとも、とりあえず安全のために、絶対パス指定か SetDllDirectory(WinXP sp1以降)を使うかして、検索位置を明示して呼び出した方がいいかと思います。

関連記事

【同じタグを付けた記事の一覧】
プログラミング Windows

スポンサーサイト

コメントの投稿

非公開コメント

No title

xxxx.exe.local じゃだめかな?

Re: No title

はじめまして、のこのこさん。
コメントありがとうございます。
こんな仕組みがあったんですね、全然知りませんでした。
自作のツールであればコードレベルで対処もできますが、
他の方が作ったアプリなどではそうもいきませんので、
そういう時には特に便利そうです。
最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
月別アーカイブ
プロフィール

電脳太助

Author:電脳太助
Website:電脳スピーチ web

RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

サイト内検索
Ads by Google
FC2アクセスランキング
Ads by Google
FC2拍手ランキング
ユーザータグ

音楽管理(65)
ポータブル(57)
ソフト紹介(44)
プログラミング(42)
音声技術(41)
自作ソフト(34)
サイト運営(32)
FC2(31)
ブログ(30)
iTunes(26)
Windows(25)
LISMO(24)
音声合成(23)
音声認識(22)
x-アプリ(22)
電子ブック(22)
eラーニング(20)
バックアップ(19)
語学学習(19)
foobar2000(18)
ソースコード(17)
画像管理(15)
WindowsLiveWriter(15)
C++(14)
アフィリエイト(10)
DnspTools(10)
ウォークマン(9)
fi-6130(9)
FLAC(9)
Gracenote(8)
英語音読学習計画(8)
Prolog(8)
JavaScript(8)
ベクター(8)
雑記(8)
CodeBlocks(7)
SyntaxHighlighter(7)
TraConv(7)
wxWidgets(7)
spcbght(7)
DCP-J552N(6)
W63CA(6)
MP3Gain(6)
WinRT(6)
iGoinLM(6)
VirtualBox(6)
WindowsLiveMesh(6)
英語発音矯正実験(6)
ExactAudioCopy(6)
楽器演奏(5)
Mery(5)
LAME(5)
音楽技術(5)
GalateaProject(4)
LLVM(4)
nLite(4)
MIDI(4)
ホームページ(4)
WindowsLiveSkyDrive(4)
GalateaTalk(4)
PC-98(3)
カウンター(3)
AACGain(3)
iTCDini(3)
OverCutChecker(3)
拍手(3)
PK-513L(3)
UniversalExtractor(3)
アクセスランキング(3)
ImageCompositeEditor(2)
アクセス解析(2)
OCR(2)
qtaacenc(2)
資格試験(1)
AquesTalk(1)
AquesCmdDl(1)

FC2アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
112位
アクセスランキングを見る>>

[サブジャンルランキング]
ソフトウェア
11位
アクセスランキングを見る>>
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。