備忘録

備忘録

VisualStudioで設定したAWSのプロファイルを修正する

Ⅰ. はじめに

AWS Toolkit for Visual Studioを利用しているのが前提です。
VisualStudioに追加したプロファイルの追加、編集、削除するについて説明します。

Ⅱ. やり方

1. AWS Explorer を表示させる

VisualStudioのメニューから
「表示」→「AWS Explorer」を選択します。

2. 追加、編集、削除する

人のアイコンが左から順番に
「追加」、「編集」、「削除」となっています。
f:id:kagasu:20170304201010p:plain

JMPの隠蔽

Ⅰ. はじめに

リバースエンジニアリングのテクニックの1つです。
パターン化しているので覚えておいて損はありません。
主に ASProtect というパッカーが利用する方法です。

Ⅱ. JMPの隠蔽方法

通常の場合

アセンブリでJMPする場合は以下のように書きます。

JMP x

隠蔽の例

push x
retn

push x とすると x がスタックに積まれます。
retn するときはスタックの一番上に積まれた x にジャンプします。
よって、上記2つのコードは全く同じ動作をします。

また、アセンブリ言語レベルで任意のコードを実行する場合、PUSHを利用したほうが楽になります。
JMP の場合 JMP 先のアドレスとの差を計算して第一オペランドに与える必要がありますが、PUSH を利用すると計算の必要が無くなる為です。

C# WPF 数値のみ入力できるTextBoxを作る

Ⅰ. はじめに

半角数値0~9のみを許可するTextBoxの作り方です。
数値のみ入力可能なTextBoxは標準機能として用意されていません。(2017/02/20時点)
入力値が数値かどうかを判定するコードを書く必要があります。

Ⅱ. 作り方

1. MainWindow.xaml

<TextBox
  x:Name="textBoxPrice"
  InputMethod.IsInputMethodEnabled="False"
  PreviewTextInput="textBoxPrice_PreviewTextInput"
  CommandManager.PreviewExecuted="textBoxPrice_PreviewExecuted"/>

2. MainWindow.xaml.cs

private void textBoxPrice_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
  // 0-9のみ
  e.Handled = !new Regex("[0-9]").IsMatch(e.Text);
}
private void textBoxPrice_PreviewExecuted(object sender, ExecutedRoutedEventArgs e)
{
  // 貼り付けを許可しない
  if (e.Command == ApplicationCommands.Paste)
  {
    e.Handled = true;
  }
}

C# で RSA暗号鍵(.pem)作成する

Ⅰ. はじめに

C#でpemファイルを作成する方法です。

その逆の、
C#でpemファイルを読み込む方法」はy_yoda様がQiitaに投稿している記事の通りです。
http://qiita.com/y_yoda/items/f4bd3ec56ac7591c5804

Ⅱ. 環境

  • C#
  • .NET Core 1.1.0

Ⅲ. ソースコード

NuGetで BouncyCastle をインストールして下さい。

Install-Package Portable.BouncyCastle

Program.cs

public class Program
{
  public static void Main(string[] args)
  {
    var rsa = RSA.Create();
    var parameter = rsa.ExportParameters(true);

    var privateKey = RsaPemMaker.GetPrivatePemString(parameter);
    File.WriteAllText("private-key.pem", privateKey);
    Console.WriteLine(privateKey);

    var publicKey = RsaPemMaker.GetPublicPemString(parameter);
    File.WriteAllText("public-key.pem", privateKey);
    Console.WriteLine(publicKey);

  }
}

RsaPemMaker.cs

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;

public static class RsaPemMaker
{
  public static string GetPrivatePemString(RSAParameters p)
  {
    var key = new RsaPrivateCrtKeyParameters(
      new BigInteger(1, p.Modulus),
      new BigInteger(1, p.Exponent),
      new BigInteger(1, p.D),
      new BigInteger(1, p.P),
      new BigInteger(1, p.Q),
      new BigInteger(1, p.DP),
      new BigInteger(1, p.DQ),
      new BigInteger(1, p.InverseQ));

    using (var stream = new MemoryStream())
    {
      using (var writer = new StreamWriter(stream, new UTF8Encoding()))
      {
        var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(writer);
        pemWriter.WriteObject(key);
      }

      return new UTF8Encoding().GetString(stream.ToArray()).Replace("\r\n", "\n");
    }
  }

  public static string GetPublicPemString(RSAParameters p)
  {
    var key = new RsaKeyParameters(
      false,
      new BigInteger(1, p.Modulus),
      new BigInteger(1, p.Exponent));

    using (var stream = new MemoryStream())
    {
      using (var writer = new StreamWriter(stream, new UTF8Encoding()))
      {
        var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(writer);
        pemWriter.WriteObject(key);
      }

      return new UTF8Encoding().GetString(stream.ToArray()).Replace("\r\n", "\n");
    }
  }
}

Ⅲ. 実行結果

f:id:kagasu:20170202132705p:plain

メモ(2020/03/23 追記)

.NET 5でPEMの読み書きAPIが追加されるようです。
https://github.com/dotnet/runtime/pull/32260

C#でRSS 1.0のFeedを読む

Ⅰ. はじめに

.NET Framework 3.5以降であれば Atom 1.0 と RSS 2.0を対象にした SyndicationFeed があるのですが、RSS 1.0はサポートされていません。
RSS 1.0 を手書きで解析するときのメモです。

Ⅱ. プログラム

解析対象のXMLGIGAZINEのRSS1.0のFeedを利用しました)
https://gist.github.com/anonymous/19883bc8c892ca8f8ceaa5937257a83e

static void Main(string[] args)
{
  var xml = new XmlDocument();

  xml.Load("http://feed.rssad.jp/rss/gigazine/rss_1.0");

  var nsmgr = new XmlNamespaceManager(xml.NameTable);
  nsmgr.AddNamespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
  nsmgr.AddNamespace("rss", "http://purl.org/rss/1.0/");
  nsmgr.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");

  foreach (XmlElement node in xml.SelectNodes("/rdf:RDF/rss:item", nsmgr))
  {
    var title = node.SelectNodes("rss:title", nsmgr)[0].InnerText;
    var link = node.SelectNodes("rss:link", nsmgr)[0].InnerText;
    var description = node.SelectNodes("rss:description", nsmgr)[0].InnerText;
    var date = DateTime.Parse(node.SelectNodes("dc:date", nsmgr)[0].InnerText);

    Console.WriteLine("-------");
    Console.WriteLine($"title: {title}");
    Console.WriteLine($"link: {link}");
    Console.WriteLine($"description: {description}");
    Console.WriteLine($"date: {date}");
  }
}

Ⅲ. 実行結果

f:id:kagasu:20170122230022p:plain