(12/22)気づいたら2013年が終わってた。コメント:0[自分用メモ][Win32]ReadFile()の謎ReadFile()がうまく動作してくれない。errmsg("失敗");これでbufにカレントファイルポインタから1byte読み込まれるはずなんだけど、読み込まれない。buf[3]と宣言して、ReadFile()にはbufを渡し、3byte読み込むようにしてみるとbuf[1],buf[2]には正しい値が読み込まれるけどbuf[0]は上と同じで00。buf[2]にしてみるとbuf[0],buf[1]とも00でだめ。いうわけで現在深追い中。while(1)より普通な半永久ループ以下で紹介するコードは、コンパイラに大きく依存する。このコードの動作を確認した環境は以下の通り。0;}これで、abcabcabc..と、資源が許す限り永久にループします。s1[4]とs2[4]でスタックにバッファを確保すると、s1かs2からスタック内のアドレスがわかります。s1,s2より上位のアドレスには、その関数がreturnするときに戻る場所(retアドレス)が格納されています。この2つを組み合わせれば、retアドレスを弄って、本来戻る場所とは別のところに戻せることが分かります。そのアドレスを自分自身のアドレス(foo)にすれば、ループするだろうってことです。Overflowというやつですね。foo()内のスタックはこんな感じです。retアドレス目的は0012FF88に格納されている関数return時の戻り先(retアドレス)を書き換えることですから、s1かs2のアドレスにいくつ足せばretアドレスを参照できか調べます。ここではs1のほうを使います。s1[6]で0012FF88の中身、つまりretアドスが参照できますね。すれば、戻り先をfooにすることでループできるでしょう。このコードは半永久的と書いた通り問題があります。retアドレスをfoo自身のアドレスに書き換えることによって、またfooが呼び出されるのですが、正確に言うと呼び出されるというよりは、fooのコードにジャンプするんです。callの動作はただ、ジャンプさせるのではなく、戻り先のアドレスをスタックに格納し、その後にjmpさせます。call命令でスタックに格納されたretアドレスを上書きしているこのコードだと、foo()が再び呼び出されても、retアドレスがスタックに格納されていないので、前回より1つ上位のアドレスにretアドレスが書き込まれ、繰り返し呼び出されていくうちに、スタックを使い切ってしまいます。スタックを使い切るとアクセス違反で止まってしまうでしょう。この問題を回避する方法は凄く簡単です。いうかむしろ、これは間違ったやり方ですね。その"正しい"方法でのコードを書いてみたかったけど長くなるので興味を持った方は考えてみてください。その方法でも環境に依存してしまうかもしれません。"ネタにはなるが、実務では使えない。putchar大文字と小文字を逆転するプログラムを書く。コメント:0マッチしたやつを置き換えるmixiのC言語とC++言語コミュを覗いてたら僕にもできそうなのが質問として投げ出されていたはじめまして。照合したいパターン文字列をそれぞれchar型配列sとpに読み込み、関数ptnmchを利用して、文字列sにおいてパターンpと一致する部分を全て*で置き換えて出力するプログラムを作成しなさい。zo******となりたいのです。