備忘録

備忘録

C#でWinPcapを使う方法(SharpPcapの使い方)

Ⅰ. はじめに

タイトルの通り「C#WinPcapを使う方法(SharpPcapの使い方)」です。
WinPcapを利用したキャプチャを行う為、レイヤ2(データリンク層)レベルでのキャプチャが可能です。

予めWinPcapをインストールする必要があります。
https://www.winpcap.org/default.htm

Ⅱ. やり方

1. NuGetからSharpPcapをインストールする
Install-Package SharpPcap

# .NET Core版
Install-Package SharpPcap.Core
2. サンプルプログラムをコピペする
// https://github.com/chmorgan/sharppcap/blob/master/Examples/Example3.BasicCap/Example3.BasicCap.cs
using SharpPcap;
using SharpPcap.AirPcap;
using SharpPcap.LibPcap;
using SharpPcap.WinPcap;
using System;
using System.Linq;

namespace WinPcapTest
{
  class Program
  {
    public static void Main(string[] args)
    {
      var devices = CaptureDeviceList.Instance;

      if (devices.Count < 1)
      {
        Console.WriteLine("デバイスが見つかりませんでした。");
        return;
      }

      foreach (var dev in devices.Select((val, i) => new { val, i }))
      {
        Console.WriteLine($"({dev.i}) {dev.val.Name} {dev.val.Description}");
      }

      Console.Write("キャプチャ対象のデバイスを選択して下さい: ");
      var deviceIndex = int.Parse(Console.ReadLine());
      var device = devices[deviceIndex];

      device.OnPacketArrival += Device_OnPacketArrival;

      int readTimeoutMilliseconds = 1000;
      switch (device)
      {
        case AirPcapDevice airPcap:
          // NOTE: AirPcap devices cannot disable local capture
          airPcap.Open(OpenFlags.DataTransferUdp, readTimeoutMilliseconds);
          break;
        case WinPcapDevice winPcap:
          winPcap.Open(OpenFlags.DataTransferUdp | OpenFlags.NoCaptureLocal, readTimeoutMilliseconds);
          break;
        case LibPcapLiveDevice livePcapDevice:
          livePcapDevice.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
          break;
        default:
          throw new InvalidOperationException($"unknown device type of {device.GetType().ToString()}");
      }

      device.StartCapture();
      Console.ReadLine();
      device.StopCapture();
      device.Close();
    }

    private static void Device_OnPacketArrival(object sender, CaptureEventArgs e)
    {
      var time = e.Packet.Timeval.Date;
      var length = e.Packet.Data.Length;
      Console.WriteLine($"{time.Hour}:{time.Minute}:{time.Second},{time.Millisecond} Len={length}");
      Console.WriteLine(BitConverter.ToString(e.Packet.Data));
    }
  }
}
実行結果

f:id:kagasu:20180419182408p:plain

VisualStudioでURLをリンクとして表示しない方法

Ⅰ. はじめに

タイトルの通り「VisualStudioでURLをリンクとして表示しない方法」です。

Ⅱ. やり方

1. ツール → オプション
2. 「シングル クリックでの URL ナビゲーションを有効にする」のチェックを外す
f:id:kagasu:20180415155207p:plain

設定前

f:id:kagasu:20180415155454p:plain

設定後

f:id:kagasu:20180415155504p:plain

C++でLINQを使う方法(cpplinqの使い方)

Ⅰ. はじめに

タイトルの通り「C++LINQを使う方法(cpplinqの使い方)」です。

Ⅱ. 使い方

1. GitHubから cpplinq.hpp をダウンロードする

https://github.com/mrange/cpplinq

2. サンプルプログラムを書く
#include <iostream>
#include <list>
#include <algorithm>
#include <string>
#include "cpplinq.hpp"
using namespace cpplinq;

class Human
{
public:
  std::string Name;
  int Age;

  Human(std::string name, int age)
  {
    this->Name = name;
    this->Age = age;
  }
};

int main()
{
  auto humans = std::list<Human>();
  humans.emplace_back(Human("name001", 9));
  humans.emplace_back(Human("name002", 10));
  humans.emplace_back(Human("name003", 11));

  humans = from(humans)
    >> where([](Human x) {return x.Age >= 10; })
    >> orderby([](Human x) {return -x.Age; })
    >> to_list();

  std::for_each(humans.begin(), humans.end(), [](Human x)
  {
    std::cout << x.Name << "," << x.Age << std::endl;
  });
}
実行結果

f:id:kagasu:20180411202657p:plain

KotlinでFuelにProxyを設定する方法

Ⅰ. はじめに

タイトルの通り「KotlinでFuelにProxyを設定する方法」です。

Ⅱ. サンプルプログラム

1. 通常の方法
import com.github.kittinunf.fuel.Fuel
import com.github.kittinunf.fuel.core.FuelManager
import com.google.gson.JsonParser
import java.net.InetSocketAddress
import java.net.Proxy

fun main(args: Array<String>) {
    FuelManager.instance.proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("127.0.0.1", 8008))

    val (request, response, result) = Fuel.get("http://httpbin.org/get").responseString()
    println(result.get())
}
2. オレオレ証明書のチェックを省く方法
import com.github.kittinunf.fuel.Fuel
import com.github.kittinunf.fuel.core.FuelManager
import com.google.gson.JsonParser
import java.net.InetSocketAddress
import java.net.Proxy
import java.security.cert.X509Certificate
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager

class MyX509TrustManager : X509TrustManager {
  override fun checkClientTrusted(p0: Array<out X509Certificate>?, p1: String?) {
  }

  override fun checkServerTrusted(p0: Array<out X509Certificate>?, p1: String?) {
  }

  override fun getAcceptedIssuers(): Array<X509Certificate> {
    return arrayOf()
  }
}

fun main(args: Array<String>) {
  val sslContext = SSLContext.getInstance("SSL")
  sslContext.init(null, arrayOf<TrustManager>(MyX509TrustManager()), java.security.SecureRandom())
  FuelManager.instance.socketFactory = sslContext.socketFactory
  FuelManager.instance.proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("127.0.0.1", 8008))

  val (request, response, result) = Fuel.get("http://httpbin.org/get").responseString()
  println(result.get())
}