読者です 読者をやめる 読者になる 読者になる

備忘録

備忘録

プロセスを停止させる

Ⅰ. はじめに

プロセスのサスペンドリジュームを拡張メソッドにして使いやすくしたクラスを紹介します。
コピペで動きます。

Ⅱ. プログラム

Program.cs

var process = Process.GetProcessesByName("notepad").FirstOrDefault();
process.Threads.Suspend();
process.Threads.Resume();

ProcessExtensions.cs

public static class ProcessExtensions
{
  [Flags]
  private enum ThreadAccess : int
  {
    TERMINATE = 0x0001,
    SUSPEND_RESUME = 0x0002,
    GET_CONTEXT = 0x0008,
    SET_CONTEXT = 0x0010,
    SET_INFORMATION = 0x0020,
    QUERY_INFORMATION = 0x0040,
    SET_THREAD_TOKEN = 0x0080,
    IMPERSONATE = 0x0100,
    DIRECT_IMPERSONATION = 0x0200
  }

  [DllImport("kernel32.dll")]
  private static extern bool CloseHandle(IntPtr hHandle);

  [DllImport("kernel32.dll")]
  private static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);

  [DllImport("kernel32.dll")]
  private static extern uint SuspendThread(IntPtr hThread);

  [DllImport("kernel32.dll")]
  private static extern uint ResumeThread(IntPtr hThread);

  public static void Suspend(this ProcessThreadCollection threads)
  {
    foreach (ProcessThread x in threads)
    {
      var threadHandle = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)x.Id);

      if (threadHandle != IntPtr.Zero)
      {
        try
        {
          SuspendThread(threadHandle);
        }
        finally
        {
          CloseHandle(threadHandle);
        }
      }
    }
  }

  public static void Resume(this ProcessThreadCollection threads)
  {
    foreach(ProcessThread x in threads)
    {
      var threadHandle = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)x.Id);

      if (threadHandle != IntPtr.Zero)
      {
        try
        {
          ResumeThread(threadHandle);
        }
        finally
        {
          CloseHandle(threadHandle);
        }
      }
    }
  }
}

プロテクトを回避してメモリをフルダンプする

f:id:kagasu:20170412081342p:plain

Ⅰ.はじめに

物理メモリを任意の物理記憶媒体にダンプする方法です。
Belkasoft社の無料ダンプツール(Belkasoft Live RAM Capture)を利用します。

Ⅱ. Belkasoft Live RAM Captureのすごいところ

  • 無料

ダンプ後のファイルを解析するBelkasoft Evidence Center は有料ですが、Belkasoft Live RAM Capture は無料で配布されています。

  • 簡単に任意のタイミングでダンプが可能

アプリケーション単位のメモリであれば任意のタイミングでダンプ可能ですが、
物理メモリのフルダンプはシステムのクラッシュ時にのみ可能です。
従来の方法ではBSoDを意図的に発生させシステムをクラッシュさせてフルダンプを取らなければいけません。

  • プロテクトの回避が可能

アンチデバッグやダンププロテクションといったメモリダンプを妨げるものを回避してメモリのダンプが可能です。

Ⅲ. メモリダンプ方法

1. Belkasoft Live RAM Captureをダウンロードする

http://belkasoft.com/ram-capturer

2. 保存先を指定し、Captureをクリックする

f:id:kagasu:20170412080257p:plain

3. 以上でダンプ完了です。

f:id:kagasu:20170412082346p:plain

Ⅳ. ダンプから画像ファイルを取り出す

Belkasoft Evidence Center(有料。高機能。試用可能)でも可能ですが無料のWinHexを利用します。

1. WinHexでダンプしたファイルを読み込む
2. Tools -> Disk Tools -> File Recovery by Type

f:id:kagasu:20170412082715p:plain

3. Picturesにチェックを入れてOKをクリックする

f:id:kagasu:20170412082834p:plain

4. メモリダンプから画像ファイルが生成されます

f:id:kagasu:20170412083007p:plain

一時的なメールサービスのAPIサーバを作る

Ⅰ. はじめに

一時的なメールアドレスを作成するサービスはいくつか存在します。
一時的なメールアドレスを作成する - 備忘録

しかし、どのサービスもAPI経由でのアクセスが出来ないものばかりです。
送信されるリクエストを解析してサービスを利用する可能ですが、
よりスマートにAPIアクセス可能なサーバを自分で構築する方法を紹介します。

※サーバを構築しなくても こちら(restmail.net) から制限付きで利用することも可能です。

Ⅱ. やり方

0. 環境
[root@host ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
1. screen, git, nodejs, redis をインストールする
yum -y install screen git nodejs redis
2. restmail.net を入手する
git clone https://github.com/mozilla/restmail.net
3. Node.js のモジュールをインストールする
npm update
4. Redis を起動する
systemctl start redis
5. emailserver.js のポートを 9025 から 25 に変更する
6. webserver.js のポートを 8080 から 80 に変更する
7. postfix を終了する

既に25番をpostfixが利用している為終了させます。

systemctl stop postfix
8. ポートを開放する。25番と80番
firewall-cmd --zone=public --add-port=25/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
9. サーバを起動する
node webserver.js &
node emailserver.js &

または screen を利用して

screen -S webserver
node webserver.js

[Ctrl + A] → [D]

screen -S emailserver
node emailserver.js

[Ctrl + A] → [D]
10. http://[ip address]/にアクセスして、以下のページが表示されることを確認する

f:id:kagasu:20170408163431p:plain

11. ドメインのMXレコードを変更する
12. test@domain.tld にメールを送信する
13. http://[ip address]/mail/test@domain.tld にアクセスして、JSON形式でメールが確認できれば成功

VisualStudio で貼り付け時にクォートを自動的にパースする

1. はじめに

IntelliJ 系のIDEであればデフォルト機能として JSONXPath の文字列をプログラムに貼付けする時に自動的にクォートがパースされます。
VisualStudioで同様の恩恵をうけるための拡張機能の紹介です。

2. SmartPaster2017 のダウンロード

SmartPaster2017 をダウンロード、インストールする事により自動的にパースされます。

SmartPaster2017 - Visual Studio Marketplace

f:id:kagasu:20170403181325p:plain

Chrome UserAgentをワンクリックで切り替える

Ⅰ. はじめに

Google Chromeデベロッパーツールや拡張機能でUserAgentを簡単に変更することが可能です。
しかし、簡単といってもクリック回数が1回で切り替わるわけではありません。

1クリックのみでトグル式にUserAgentを変更するツールが存在していなかった為新たな拡張機能を作成しました。

Ⅱ. やり方

2. UserAgentを2つ設定する
3. トグルで変更可能になります。