安直なプログラムを書きました。
以下にソースを掲載します。
#include <cstdio> #include <cstdlib> #include <cstring> int main(int argc_, char **argv_) { // 基本ブロックサイズ const int BSIZE = 4096 * 64; char cmd[256]; // 文字列比較を簡単にするため、マージンを含める char *buffer = new char[BSIZE + 256]; FILE *fp; int max_count = ((1024 * 1024) / BSIZE) * 1024 * 30; bool match; int readed; for (int n = 0; n < max_count; n++) { // バッファの初期化 ::memset(buffer, 0, BSIZE + 256); // 外部コマンドの作成と実行 ::sprintf(cmd, “dd if=/dev/hdb2 of=restore.img bs=%d count=1 skip=%d”, BSIZE, n); system(cmd); // ダンプされたデータの読み込み fp = ::fopen(“restore.img”, “rb”); if (! fp) { ::fprintf(stderr, “can’t open restore.img\n”); break; } readed = ::fread(buffer, 1, BSIZE, fp); ::fclose(fp); // 検査 match = false; for (int p = 0; p < BSIZE; p++) { if (::memcmp(buffer + p, “ “, ::strlen(” “)) 0 || ::memcmp(buffer + p, "Masayuki", ::strlen("Masayuki")) 0 || ::memcmp(buffer + p, “<?php”, ::strlen(“<?php”)) 0 || ::memcmp(buffer + p, "webdb", ::strlen("webdb")) 0) { match = true; break; } } if (match) { // ヒット時のコマンドを保存 fp = ::fopen(“salv.log”, “a”); if (fp) { ::fprintf(fp, “%s\n”, cmd); ::fclose(fp); } } if (readed < BSIZE) { break; } } delete [] buffer; return 0; }
とりあえず全データの検査が終わるまでMARIONETTEでもプレイしてようかと思います。
コメント