【覚書】ロリポップ付属のphpmyadminにsshから接続するため悪魔の力を手に入れた話

スポンサードリンク

こんにちは。ふぁんたです。



前回の記事で、このWebページが有るサーバー「ロリポップ」付属のデータベースに無理やりつなげようとして全滅した、という話をしました。



今回は、悪魔に魂を売り、データベース接続に成功しましたので、そのやり方を書こうと思います。






[toc]

前回もやったSSHポートフォワーディング


1.SSH接続する

2.MySQLでログインする

3.すっごーい!



という方法は、前回試しましたが、だめでした。

MySQL接続をするためのstring _conというコネクション情報を色々に弄り倒してみたんですけど、びくともしませんでした。


手入力で成功


しかしながら、手入力すると成功してしまいました。解せぬ。



まず、コマンドプロンプトで

ssh ユーザー名@サーバーのホスト -p 2222

とすると、パスワードを聞かれるので、入れます。



そしたら、mysqlのCUIが出てくるので、

mysql -u データベースにおけるユーザー名 -h データベースがあるサーバー -p

とすると、パスワードを聞かれるので、今度はデータベースのパスワードを入れます。



なんと、接続できてしまいます。(ポートフォワーディングとは違うのかも?)

で、どのデータベースを使いたいかを指定するために、

use `データベースの名前`;

すると、SQL文でテーブルが操作できるようになります。



手作業の勝利。 プログラムの敗北。


そして知る絶望








できないんだそうです。なんてこった…

悪魔との契約


手入力では、できた。

プログラムでは、できなかった。





…「コマンドプロンプトにコマンドを入力するプログラム」にしてしまえばいいんじゃないか…?


闇営業簡易版


C#のコードで、キーボードを叩くことを考えました。

これができれば、手入力と変わりない。



VBA(Excelのマクロとかのやつ)のdllを参照から読み込んで、キーボードを操作できるようにします。



それによって使える、SendKeysステートメント、というのがあります。



これは、引数にとったstringをキーボードで打ち込んだのと同じとみなせるような、そんな効果があります。





…それでも、パスワードを求められたときの入力ではうまくいきませんでした。



Sendkeysの力では、乗り越えられない困難があるようです。

闇営業複雑版


もっと難しいのがありました。



keybd_eventというものです。



(キーをどのタイミングで押して、どのタイミングで離すか、というレベルまで指定することができる代わりに、めっちゃくちゃ操作が難解なやつです。)



これに手を出すことにしました。
    class KeyBoardHandle

{
[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVK, byte bScan, byte dwFlags, int dsExtraiInfo);
public byte KeyDown = 0x0;
public byte KeyUp = 0x2;
public byte keyextend = 0x1;

public byte VK_LEFT = 0x25;
public byte VK_UP = 0x26;
public byte VK_RIGHT = 0x27;
public byte VK_DOWN = 0x28;
public byte VK_0 = 0x30;
public byte VK_1 = 0x31;
public byte VK_2 = 0x32;
public byte VK_3 = 0x33;
public byte VK_4 = 0x34;
public byte VK_5 = 0x35;
public byte VK_6 = 0x36;
public byte VK_7 = 0x37;
public byte VK_8 = 0x38;
public byte VK_9 = 0x39;
public byte VK_A = 0x41;
public byte VK_B = 0x42;
public byte VK_C = 0x43;
public byte VK_D = 0x44;
public byte VK_E = 0x45;
public byte VK_F = 0x46;
public byte VK_G = 0x47;
public byte VK_H = 0x48;
public byte VK_I = 0x49;
public byte VK_J = 0x4A;
public byte VK_K = 0x4B;
public byte VK_L = 0x4C;
public byte VK_M = 0x4D;
public byte VK_N = 0x4E;
public byte VK_O = 0x4F;
public byte VK_P = 0x50;
public byte VK_Q = 0x51;
public byte VK_R = 0x52;
public byte VK_S = 0x53;
public byte VK_T = 0x54;
public byte VK_U = 0x55;
public byte VK_V = 0x56;
public byte VK_W = 0x57;
public byte VK_X = 0x58;
public byte VK_Y = 0x59;
public byte VK_Z = 0x5A;

public byte VK_CONTROL = 0x11;
public byte VK_BACK = 0x8;
public byte VK_TAB = 0x9;
public byte VK_RETURN = 0xD;
public byte VK_PRINT = 0x2C;
public byte VK_Esc = 0x1B;

public byte VK_COLON = 0xBA;

public byte VK_MINUS = 0x6D;
public byte VK_DOT = 0x6E;
public byte VK_ATMARK = 0xC0;
public byte VK_SHIFT = 0x10;
public byte VK_SEMICOLON = 0xBB;

public void input(string s)
{
for (int i = 0; i < s.Length; i++)
{
inputOneChar(s[i]);
}
push(VK_RETURN);
}

public void inputOneChar(char c)
{


string s = c.ToString();
if (char.IsNumber(c))
{
push((byte)c);
}
else if (c >= 'A' && c <= 'Z')
{
pushcombi(VK_SHIFT, (byte)c);
}
else if (c >= 'a' && c <= 'z')
{
c = char.ToUpper(c);
push((byte)c);

}
else if (c == ' ')
{
push((byte)32);

;//space
}
else if (c == '@')
{
push(VK_ATMARK)
;//atmark
}
else if (c == '-')
{
push(VK_MINUS);
;//minus
}
else if (c == ';')
{
push(VK_SEMICOLON);
}
else if (c == '.')
{
push(VK_DOT);
}
else if (c == '`')
{
pushcombi(VK_SHIFT, VK_ATMARK);
}
else if (c == '*')
{
pushcombi(VK_SHIFT, VK_COLON);
}
else
{

;
}

}


public void push(byte key)
{
keybd_event(key, 0, KeyDown, 0);
keybd_event(key, 0, KeyUp, 0);
Thread.Sleep(72);
}
public void pushcombi(byte meta, byte key)
{
keybd_event(meta, 0, (byte)(KeyDown | keyextend), 0);
keybd_event(key, 0, (byte)(KeyDown | keyextend), 0);
keybd_event(key, 0, (byte)(KeyUp | keyextend), 0);
keybd_event(meta, 0, (byte)(KeyUp | keyextend), 0);
Thread.Sleep(72);
}


}




(必要に応じて、プロジェクトを右クリック→追加→参照、として、必要なdllを参照してください)





使い方としては、KeyboardHandleクラスのインスタンスを作って、(new)

そのインスタンスを keyboardとすると、keyboard.input()の引数に、入力したい文字列を入れておくと、文字列の各文字に対して、キーボードをバーチャルで叩いて72ミリ秒待つ、というような使い方を想定しています。



今回、このコードに実装されてるのは、MySQLのCRUDで使いそうな文字だけとなってますので、例えば { とか、<とかを入力されると動きません。



普通はできないはずのところを、キーボードをシミュレートする という邪道な方法で、どうにか接続、SELECT * FROM table;を実行することができました。



あとは、tableの属性を変更して、それに合うようなInsert文をキーボードで入力させ、必要に応じてメニューから貼り付け機能を使えば、

「今日買うべき銘柄を毎日自動更新して教えてくれる」

ぜかましプロジェクトの集大成が出来上がると思うんです。



苦節1年2ヶ月、到達すべき点が見えてきました。

ラストスパート、がんばります。

スポンサードリンク