2005年10月07日

他プロセスのメモリへのちょっかい@タブコントロール

さて今回は毎度おなじみ@ITの会議室より、タスクバーのタスクボタンの情報を取得したいスレッドをネタに話を進めましょう。

私も以前タスクバーから特定アプリのタスクボタンを隠したいとか思って色々調べてみたことがあります。で、まず初めに知ったのがWindows XPからはタスクバーで使用されるコモンコントロールが変更され、もともとTabControlが使われていたのが代わりにToolBarを使われるようになったこと。この変更の波及は大きく、2000までだったらTabControlにTCM_GETITEMをTCIF_PARAMつきで投げてやれば、そのタブが扱うアプリのウィンドウハンドルが手に入ったんですが、XPではToolBarにTB_BUTTONINFOをTBIF_LPARAMつきで投げても良く分からない値しか取得できなくなったんです。おかげでウィンドウタイトルからFindWindowするハメになると言う……。

ま、そんな益体もない話はおいておいて、今回の話に入りましょう。

今まで、SendMessage関数をごく何気なく使っていました。構造体でもref(ByRef)やMarshal.StructureToPtrで普通に参照(アドレス)を渡していました。自分のプロセスのことならメモリアドレスは一意ですから何も問題はなかったんですね。しかし、他のプロセスということになると話は変わってきます。仮想アドレス空間はプロセスごとに用意され、これにプログラムはそれぞれ関数や変数を割り当てて、そのアドレスを使用します。Marshal.AllocCoTaskMemなどで返される値もこの仮想アドレス空間におけるアドレスです。

仮想アドレス空間はプロセスごとと言いました。つまりプロセスが異なれば、同じアドレスを違うものが指していることになるわけです。もちろんそんなの認めるわけにはいきませんから(あっさり暴走しちゃいます)、OSはあるプロセスが扱う仮想アドレス空間には他のプロセスからはアクセスできないようにしています。

ですから、例えば他のプロセスのあるタブコントロールにTCM_GETITEM送信したい場合、単純にTCITEMへの参照を渡すわけにはいきません。こちらのプロセスで作成した構造体の参照(アドレス)は、当然こちらのプロセスの仮想アドレス空間上のアドレスを指すわけで、それをSendMessageで送信してもあちらのプロセスはそのアドレスを処理できません。なんとかあちらのプロセスの仮想アドレス空間を扱う必要があります。

そこで登場するのが、今回のVirtualAllocEx、WriteProcessMemory、ReadProcessMemoryの各Win32API関数です。VirtualAllocExは、指定したプロセスの仮想アドレス空間にメモリ領域を確保する関数。Write/ReadProcessMemoryがその確保した領域とこちらのプロセスの間でデータをコピーする関数です。

大雑把な流れはこうです。

  1. 対象のプロセスのハンドルを、OpenProcess関数などで取得。
  2. VirtualAllocExで、対象のプロセスの仮想アドレス空間に構造体のメモリ領域を確保。
    • TCM_GETITEMでTCIF_TEXTを使用する場合、その文字列分も確保する必要がある。
  3. WriteProcessMemoryで、VirtualAllocExで確保した領域に必要な構造体をコピー。
  4. SendMessageで目的のコントロールに送信。
    • 勿論この際構造体アドレスに使用するのはVirtualAllocExで確保したアドレス。
  5. ReadProcessMemoryで結果をこちらのプロセスのメモリ空間にコピー。

これだけ分かれば後は細々としたプログラミング技術の話になるでしょう。

  • TCM_GETITEMでTCIF_TEXTを取得する場合、自プロセスの話であれば、適当にmallocしたアドレスをTCITEMのpszTextに割り当て、それをSendMessageしてやればそのアドレスにタブの文字が入っていると言うことになります。別プロセスと言うことになると、やはり当然ながらpszTextに指定するのもその別プロセスの仮想アドレス空間のアドレスと言うことになりますから、VirtualAllocExが必要になります。二回も同じ関数を呼ぶのは馬鹿馬鹿しいですから、一回でまとめて構造体と文字列バッファを確保し、前半をTCITEM用、後半を文字列バッファ用として扱うのが便利です。このとき、文字列バッファの先頭アドレスは、VirtualAllocExで確保した全体のアドレスからTCITEM構造体のサイズ分進んだところと言うことになります。
  • WriteProcessMemoryの第三引数は書き込むデータの先頭のポインタですが、これにByRef As TCITEM構造体を指定してやれば自動的にマーシャリングしてくれるので、TCITEMをそのまま渡すだけでOKになり、構造体ポインタを考える必要が無くなります。
  • ReadProcessMemoryで受け取るには、下記のサンプルではIntPtr(=ポインタ)で受け取るようにし、こちら側のメモリ領域をMarshal.AllocCoTaskMemで確保しています。もう一つの手段として、IntPtrの代わりにByte配列を使用する方法があります。この場合、配列要素をアンマネージド関数から変更可能であることを指定するためにOut属性をbufferパラメータに指定する必要があります。
    <Out> ByVal buffer As Byte()
    後は
    Dim textBuffer As Byte() = New Byte(textSize){}
    とバッファを確保してReadProcessMemoryを呼ぶだけです。この場合Byte配列から文字列に変更するのにはEncodingクラス(Encoding.DefaultがANSIコードページのEncodingインスタンスを指します)を普通使用するでしょうが、そのままGetStringするだけでは恐らく後ろに大量のNULL文字が付加されるでしょう(Marshal.PtrToStringAnsiを使用した場合はNULL文字を発見次第変換を終了します)。TrimEndを使用するなどして巧く取り除いてください。
  • System.Diagnostics名前空間のProcessクラスを使用すれば、メインウィンドウのウィンドウハンドルやプロセスIDを取得できます。が、巧く使うのは多少難しいかも知れません。またHandleプロパティは十分なアクセス許可がされているのかどうか不明です(PROCESS_VM_OPERATION、PROCESS_VM_READ、PROCESS_VM_WRITEの3つが必要です。一応Process.Handleの解説を読む限りフルアクセスの権限で取得しているっぽいのですが)。

今回は元スレッドに乗っかってVB.NETオンリーの記事です。尤も下調べはC#でしたのですが。

ところでこれ、元スレッドのそのまま答えというかそのままコードなんですが、こういうのいつもポストバックするかどうか悩むんですよねー。そのままコードは余り質問の答えにはしたくないので。とは言えまあこんな記事書いてる時点で結局書いたのを見せたいという願望があるのは事実ですが。

追記(2005/10/13)
フォロー記事を書きましたので、そちらも参照してください。

Option Strict On
Imports System
Imports System.Diagnostics
Imports System.Runtime.InteropServices

'他のプロセスのタブコントロールにちょっかいをかけてみます。WinNT系限定です。
Public Class TabControlAccessor
    '指定プロセスの仮想アドレス空間のメモリを確保する
    Private Declare Auto Function VirtualAllocEx Lib "Kernel32.dll" ( _
        ByVal process As IntPtr, ByVal address As IntPtr, _
        ByVal size As Integer, ByVal allocationType As MemoryAllocTypes, _
        ByVal protect As MemoryProtectTypes) As IntPtr
    'VirtualAllocExで確保したメモリ領域を開放する
    Private Declare Auto Function VirtualFreeEx Lib "Kernel32.dll" ( _
        ByVal process As IntPtr, ByVal address As IntPtr, _
        ByVal size As Integer, ByVal freeType As MemoryFreeTypes) As Boolean
    '指定したプロセスのメモリ領域にデータをコピーする
    Private Declare Auto Function WriteProcessMemory Lib "Kernel32.dll" ( _
        ByVal process As IntPtr, ByVal baseAddress As IntPtr, _
        ByRef buffer As TabItem, ByVal size As Integer, _
        ByRef writtenSize As Integer) As Boolean
    '指定したプロセスのメモリ領域のデータを呼び出し側プロセスのバッファにコピーする
    Private Declare Auto Function ReadProcessMemory Lib "Kernel32.dll" ( _
        ByVal process As IntPtr, ByVal baseAddress As IntPtr, _
        ByVal buffer As IntPtr, ByVal size As Integer, _
        ByRef readSize As Integer) As Boolean
    '指定したプロセスのハンドルを取得する。
    Private Declare Auto Function OpenProcess Lib "Kernel32.dll" ( _
        ByVal accress As ProcessAccessTypes, ByVal inheritHandle As Boolean, _
        ByVal processId As Integer) As IntPtr
    'ハンドルを閉じる。
    Private Declare Function CloseHandle Lib "Kernel32.dll" ( _
        ByVal handle As IntPtr) As Boolean
    '指定したウィンドウにメッセージを送信する。
    Private Declare Auto Function SendMessage Lib "User32.dll" ( _
        ByVal window As IntPtr, ByVal msg As Integer, _
        ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean
    '指定したウィンドウクラス・ウィンドウタイトルを持つトップレベルウィンドウを探す
    Private Declare Auto Function FindWindow Lib "User32.dll" ( _
        ByVal windowClass As String, ByVal windowTitle As String) As IntPtr
    '特定の親ウィンドウの中の子ウィンドウを探す
    Private Declare Auto Function FindWindowEx Lib "User32.dll" ( _
        ByVal parentWindown As IntPtr, ByVal childWindowAfter As IntPtr, _
        ByVal windowClass As String, ByVal windowTitle As String) As IntPtr
    '指定したウィンドウのスレッドIDとプロセスIDを取得する
    Private Declare Function GetWindowThreadProcessId Lib "User32.dll" ( _
        ByVal window As IntPtr, ByRef processId As Integer) As Integer
    'タブコントロールのアイテムの情報。
    Private Structure TabItem
        Public Mask As TabItemMask
        Public State As Integer
        Public StateMask As Integer
        Public Text As IntPtr
        Public TextMax As Integer
        Public ImageIndex As Integer
        Public LParam As IntPtr
    End Structure
    'タブアイテムの取得する情報を表すマスク。
    <Flags> Private Enum TabItemMask
        Text = 1
    End Enum
    'メモリを確保するタイプ
    <Flags> Private Enum MemoryAllocTypes
        Commit  = &H1000
        Reserve = &H2000
    End Enum
    'メモリのアクセス保護のタイプ
    <Flags> Private Enum MemoryProtectTypes
        ReadWrite = &H4
    End Enum
    '開いたプロセスの許可されるアクセスのタイプ
    <Flags> Private Enum ProcessAccessTypes
        Operation = &H8
        Read      = &H10
        Write     = &H20
        OperationReadWrite = Operation Or Read Or Write
    End Enum
    'メモリの解放タイプ
    <Flags> Private Enum MemoryFreeTypes
        Release = &H8000
    End Enum
    'TCM_GETITEMメッセージ。TabItem.TextにAnsi文字列を代入する。
    Private Const TcmGetItemAnsi As Integer = &H1300 + 5

    Public Shared Sub Main(ByVal args() As string)
        If Not(Environment.OSVersion.Platform = PlatformID.Win32NT) Then
            Throw New PlatformNotSupportedException("NT系限定です。")
        End If
        'この辺はプロセスIDとTabControlのハンドルを取得するためのコードです……

        'Windows 2000まではタスクバーがTabControlだったので絶好の解説対象だったんですが、
        'Windows XPではタスクバーはToolBarになったためそうも行かなくなりました。
        '下で取得しているのは自前で用意したTabControlを含むFormのプロセスです。
        'このままでは動作しません。各自適当にやってください。Spy++とか便利です。
		  Dim p As Process = Process.GetProcessById(1360)
        Dim tabControl As IntPtr = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, _
            "WindowsForms10.SysTabControl32.app.0.378734a", Nothing)
        If tabControl.Equals(IntPtr.Zero) Then
            Console.WriteLine("ウィンドウが見つかりません。")
            Return
        End If
        'プロセスIDからハンドルを取得
        Dim hProcess As IntPtr = OpenProcess( _
            ProcessAccessTypes.OperationReadWrite, False, p.Id)
        p.Dispose()

        '例えばWindows 2000でタスクバーのTabControlを取得するにはこんな感じでしょうか。
        '動作未チェックです。
        'Dim taskbar As IntPtr = FindWindow("Shell_TrayWnd", Nothing)
        'taskbar = FindWindowEx(taskbar, IntPtr.Zero, "ReBarWindow32", Nothing)
        'taskbar = FindWindowEx(taskbar, IntPtr.Zero, "MSTaskSwWClass", Nothing)
        'Dim tabControl As IntPtr = FindWindowEx( _
        '    taskbar, IntPtr.Zero, "SysTabControl32", Nothing)
        'Dim processId As Integer = 0
        'GetWindowThreadProcessId(tabControl, processId)
        'Dim hProcess As IntPtr = OpenProcess( _
        '    ProcessAccessTypes.OperationReadWrite, False, processId)


        'ということでなんやかやあってhProcessとtabControlを取得。

        '以降何かあっても確実にCloseHandleできるようにTry-Finally
        Try
            'SendMessageに使用するTabItemを作成
            Dim item As New TabItem()
            '一応取得する文字は512バイトを上限とする
            Const textSize As Integer = 512
            '構造体のサイズ。
            Dim itemSize As Integer = Marshal.SizeOf(item)
            '相手プロセスの仮想アドレス空間のメモリを確保。
            'TabItem構造体と文字分の合計サイズをまとめて確保。
            Dim processMemory As IntPtr = VirtualAllocEx(hProcess, IntPtr.Zero, _
                itemSize + textSize, _
                MemoryAllocTypes.Commit Or MemoryAlloctypes.Reserve, _
                MemoryProtectTypes.ReadWrite)
            If processMemory.Equals(IntPtr.Zero) Then
                Console.WriteLine("VirtualAllocExに失敗しました。")
                Return
            End If
            '以降何かあっても確実にVirtualFreeExできるようにTry-Finally
            Try
                item.Mask = TabItemMask.Text
                'item.TextはSendMessageで書き込まれる文字列の先頭アドレスを指定。
                '構造体+文字列をまとめて確保したので、構造体分の直後から文字列に使用する
                item.Text = New IntPtr(processMemory.ToInt64() + itemSize)
                item.TextMax = textSize
                Dim accessedSize As Integer = 0
                '書き込むのは構造体分だけでOK。
                'WriteProcessMemoryそのものがByRef As TabItemと構造体分しか書き込まない
                If Not(WriteProcessMemory(hProcess, processMemory, _
                                          item, itemSize, accessedSize)) Then
                    Console.WriteLine("WriteProcessMemoryに失敗しました。")
                    Return
                End If
                '確保した仮想アドレス空間の先頭(=TabItem構造体の先頭)を指定
                'ちなみに第3引数は取得するタブのインデックス
                If Not(SendMessage(tabControl, TcmGetItemAnsi, New IntPtr(0), _
                                   processMemory)) Then
                    Console.WriteLine("SendMessageに失敗しました。")
                    Return
                End If
                'こちらのプロセス側に、結果をコピーするバッファを作成
                Dim textBuffer As IntPtr = Marshal.AllocCoTaskMem(textSize)
                '以降何かあっても確実にMarshal.FreeCoTaskMemできるようにTry-Finally
                Try
                    '仮想アドレスの文字列開始アドレスはitem.Textで指定したまま。
                    If Not(ReadProcessMemory(hProcess, item.Text, textBuffer, _
                                             textSize, accessedSize)) Then
                        Console.WriteLine("ReadProcessMemoryに失敗しました。")
                        Return
                    End If
                    'あとはAnsiとしてバイト列を文字列に変換。
                    Console.WriteLine(Marshal.PtrToStringAnsi(textBuffer))
                Finally
                    'こちらプロセス側の文字列バッファを解放。
                    Marshal.FreeCoTaskMem(textBuffer)
                End Try
            Finally
                '仮想プロセス空間に確保したメモリを解放。
                VirtualFreeEx(hProcess, processMemory, itemSize + textSize, _
                              MemoryFreeTypes.Release)
            End Try
        Finally
            '使い終わったハンドルは閉じる。
            CloseHandle(hProcess)
        End Try
    End Sub
End Class

posted by Hongliang at 23:11| Comment(55) | TrackBack(0) | VB.NET | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
他アプリのタブコントロールの操作法をずっと探していたので非常に参考になりました。
Posted by 通りすがり at 2007年12月15日 08:05
参考になったのならば幸いでした。
Posted by Hongliang at 2007年12月15日 15:31
販売 水着 [url=http://www.patekphilippeequivalent.asia/]懐中時計[/url] <a href="http://www.patekphilippeequivalent.asia/" title="懐中時計">懐中時計</a>
Posted by 懐中時計 at 2013年07月26日 16:50
ウィキLIVEDOORブランドコピー財布時計ファッションのブログ,歓迎を。 ルイヴィトンコピー http://997seo.cosplay-japan.net/
Posted by ルイヴィトンコピー at 2013年08月04日 15:20
ウィキLIVEDOORブランドコピー財布時計ファッションのブログ,歓迎を。 スーパーコピー腕時計 http://jp-sakura.webnode.jp/
Posted by スーパーコピー腕時計 at 2013年08月04日 15:20
ウィキLIVEDOORブランドコピー財布時計ファッションのブログ,歓迎を。 スーパーコピー http://w.livedoor.jp/supercopywatches777/
Posted by スーパーコピー at 2013年08月04日 15:21
ウィキLIVEDOORブランドコピー財布時計ファッションのブログ,歓迎を。 ロレックスコピー http://rolexweb.webnode.jp/
Posted by ロレックスコピー at 2013年08月04日 15:21
ウィキLIVEDOORブランドコピー財布時計ファッションのブログ,歓迎を。
Posted by スーパーコピー時計 at 2013年08月07日 12:25
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://yaplog.jp/love-yaplog/ http://yaplog.jp/love-yaplog/
Posted by http://yaplog.jp/love-yaplog/ at 2013年08月12日 17:13
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 ロレックススーパーコピー http://rolexweb.webnode.jp/
Posted by ロレックススーパーコピー at 2013年08月12日 17:14
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://hotman7786.diarynote.jp/ http://hotman7786.diarynote.jp/
Posted by http://hotman7786.diarynote.jp/ at 2013年08月12日 17:14
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://supercopy888.slowtown.net/blog/ http://supercopy888.slowtown.net/blog/
Posted by http://supercopy888.slowtown.net/blog/ at 2013年08月12日 17:14
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://roles555.008.burogu.jp/ http://roles555.008.burogu.jp/
Posted by http://roles555.008.burogu.jp/ at 2013年08月12日 17:14
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://rolexsupercopy.sublimeblog.net/ http://rolexsupercopy.sublimeblog.net/
Posted by http://rolexsupercopy.sublimeblog.net/ at 2013年08月12日 17:14
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://yaplog.jp/copylvbagss/ http://yaplog.jp/copylvbagss/
Posted by http://yaplog.jp/copylvbagss/ at 2013年08月12日 17:14
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://etasakura.exblog.jp http://etasakura.exblog.jp
Posted by http://etasakura.exblog.jp at 2013年08月12日 17:14
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://yaplog.jp/supercopy777/ http://yaplog.jp/supercopy777/
Posted by http://yaplog.jp/supercopy777/ at 2013年08月12日 17:15
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://blog.livedoor.jp/cheapsupercopy/ http://blog.livedoor.jp/cheapsupercopy/
Posted by http://blog.livedoor.jp/cheapsupercopy/ at 2013年08月12日 17:15
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://beautycity.jp/page.asp?idx=10010209 http://beautycity.jp/page.asp?idx=10010209
Posted by http://beautycity.jp/page.asp?idx=10010209 at 2013年08月12日 17:15
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://hotman777.fruitblog.net/ http://hotman777.fruitblog.net/
Posted by http://hotman777.fruitblog.net/ at 2013年08月12日 17:15
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://www.chatwalker.com/roles555/ http://www.chatwalker.com/roles555/
Posted by http://www.chatwalker.com/roles555/ at 2013年08月12日 17:15
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://blog.goo.ne.jp/supercopy777love http://blog.goo.ne.jp/supercopy777love
Posted by http://blog.goo.ne.jp/supercopy777love at 2013年08月12日 17:15
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://www.chatwalker.com/kiposakura/ http://www.chatwalker.com/kiposakura/
Posted by http://www.chatwalker.com/kiposakura/ at 2013年08月12日 17:15
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://yokubrands.exblog.jp/ http://yokubrands.exblog.jp/
Posted by http://yokubrands.exblog.jp/ at 2013年08月12日 17:15
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://supercopy777.cocolog-nifty.com/ http://supercopy777.cocolog-nifty.com/
Posted by http://supercopy777.cocolog-nifty.com/ at 2013年08月12日 17:16
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://maruta.be/maoai999/ http://maruta.be/maoai999/
Posted by http://maruta.be/maoai999/ at 2013年08月12日 17:16
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://rolexblog.sublimeblog.net/ http://rolexblog.sublimeblog.net/
Posted by http://rolexblog.sublimeblog.net/ at 2013年08月12日 17:16
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://plaza.rakuten.co.jp/taobaostore/ http://plaza.rakuten.co.jp/taobaostore/
Posted by http://plaza.rakuten.co.jp/taobaostore/ at 2013年08月12日 17:16
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://inublo.jp/blog/bagwagches http://inublo.jp/blog/bagwagches
Posted by http://inublo.jp/blog/bagwagches at 2013年08月12日 17:16
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://rolex.slowtown.net/blog/ http://rolex.slowtown.net/blog/
Posted by http://rolex.slowtown.net/blog/ at 2013年08月12日 17:16
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://jayzz9678.exblog.jp http://jayzz9678.exblog.jp
Posted by http://jayzz9678.exblog.jp at 2013年08月12日 17:17
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://inublo.jp/blog/lovenanoda http://inublo.jp/blog/lovenanoda
Posted by http://inublo.jp/blog/lovenanoda at 2013年08月12日 17:17
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://maruta.be/roles555/ http://maruta.be/roles555/
Posted by http://maruta.be/roles555/ at 2013年08月12日 17:17
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://japantaobao.diarynote.jp/ http://japantaobao.diarynote.jp/
Posted by http://japantaobao.diarynote.jp/ at 2013年08月12日 17:17
腕時計、財布、ブログ、最新の情報。私の家をご光臨賜ることを歓迎します。 http://taobaojp.blog.wox.cc/ http://taobaojp.blog.wox.cc/
Posted by http://taobaojp.blog.wox.cc/ at 2013年08月12日 17:17
внимание:No matter where you live, sites deliver a good price of http://ghostwritersforhiredissertation2writingservices.com/ article writer ., Read more information at custom writings http://copywritingservices2businessplanwritingservices.com/ from solid online pharmacies when you need cost-effective, and kick your ailments. Guaranteed online proven methods with help with writing http://articlewritingservice2thesiswritingservice.com/ that they have been labeled properly., People can save money and buy writing websites for students http://writingcustom2thesiswriter.com/ sold with amazing discounts by a specialist site, Fear no more with academic writer http://customwriting2technicalwriter.com/ solutions for your health with online ordering. !
Posted by ZvmnttiZO at 2017年02月10日 17:00
cash advance online ’
<a href="https://tgswfastcashloans.com/">need cash now</a>
same day loans
<a href="https://tgswfastcashloans.com/">unsecured loans</a>
Posted by wovwrp at 2017年05月06日 06:11
Posted by jljnuc at 2017年05月08日 07:30
payday loans online ’
<a href="https://resbestpersonalloansquickonline.com/">personal loan online</a>
loans people bad credit
<a href=https://resbestpersonalloansquickonline.com/>online personal loans</a>
Posted by at 2017年05月11日 06:37
payday cash loan - https://quickcashfastcashpaydayloans.online/
cash advance loans <a href="https://quickcashfastcashpaydayloans.online/">best payday loans</a> ’
Posted by AervsoacyTM at 2017年05月12日 08:03
best loan companies - https://www.ljeionlinecashadvancefast.com/
same day payday loan <a href="https://www.ljeionlinecashadvancefast.com/">quick cash loans</a> ’
Posted by at 2017年05月15日 06:55
Posted by at 2017年05月15日 07:05
cash advance online - https://loansonlinevaec.org/
online payday loans <a href="https://loansonlinevaec.org/">payday day loans</a> ’
Posted by LnbolsoacyNR at 2017年05月16日 02:35
3 month payday loans - https://paydayloanxwer.com/
best payday loans <a href="https://paydayloanxwer.com/">best payday loans</a> ’
Posted by LbmnsoacyVD at 2017年05月16日 02:36
payday loans online direct lenders only - https://personalloansxjil.org/
unsecured personal loan <a href="https://personalloansxjil.org/">personal loan</a> ’
Posted by at 2017年05月16日 03:40
best payday loans - https://cashadvancemuil.com/
cash advance loans online <a href="https://cashadvancemuil.com/">fast payday loans</a> ’
Posted by at 2017年05月16日 03:41
loans bad credit - https://badcreditbert.com/
payday loan online <a href="https://badcreditbert.com/">bad credit loans</a> ’
Posted by BvgfsoacyOX at 2017年05月17日 01:10
best payday loans
<a href="https://cashadvancemuil.com/">payday loans</a>
cash advance credit card
<a href="https://cashadvancemuil.com/">online payday loans</a> ’
Posted by at 2017年05月17日 04:19
cash advance - https://loansonlinevaec.org/
online payday advance <a href="https://loansonlinevaec.org/">cash advance loan</a> ’
Posted by DwdbsoacyCZ at 2017年05月22日 20:13
cash advance loans - https://paydayloanxwer.com/
cash advance american express <a href="https://paydayloanxwer.com/">instant payday loans</a> ’
Posted by FbfxvsoacyBH at 2017年05月22日 20:21
quick installment loans - https://personalloansxjil.org/
personal installment loans <a href="https://personalloansxjil.org/">installment loans near me</a> ’
Posted by at 2017年05月22日 20:53
quick personal loans - https://cashadvancemuil.com/
small personal loans online <a href="https://cashadvancemuil.com/">small personal loans online</a> ’
Posted by at 2017年05月22日 21:46
auto insurance quote - https://cheapbcarinsurance.org/
car insurance <a href="https://cheapbcarinsurance.org/">quote car insurance</a> ’
Posted by FnhysoacyAK at 2017年05月24日 06:05
best payday loans - https://paydayloansonlinergc.org/
pay day loan <a href="https://paydayloansonlinergc.org/">best payday loans</a> ’
Posted by GdcsoacyYE at 2017年05月28日 07:02
quick cash - https://onlinepaydayloansrhv.org/
payday day loans <a href="https://onlinepaydayloansrhv.org/">payday loan lenders</a> ’
Posted by at 2017年05月28日 08:57
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。