備忘録

備忘録

リバースエンジニアリングを楽にする単語のメモ

Ⅰ. はじめに

タイトルの通り「リバースエンジニアリングを楽にする単語のメモ」です。
随時追加します。

Ⅱ. 一覧

  • algorithm
  • encrypt
  • encode
  • decrypt
  • decode
  • cipher
  • extract
  • rijndael
  • aes
  • pkcs
  • rsa
  • x509
  • certificate
  • key
  • block
  • cbc
  • su
  • MII
    RSA暗号秘密鍵/公開鍵はMIIから始まることが多い
    (絶対にMIIになるかは不明。でもMII以外を見たことがない)
  • AQAB
    16進数01 00 01をBASE64エンコードするとこの文字になる。
    01 00 01(65537)はRSAのExponentとして使われる事が多い。

WebSocket4Net C# .NET Standard対応 WebSocket クライアントライブラリ

Ⅰ. はじめに

WebSocket4Net は2017/05/11 時点でベータ段階ですが .NET Standard 対応の WebSocket ライブラリです。

Ⅱ. 使い方

1. 「WebSocket4Net」で検索し、インストールする

f:id:kagasu:20170511113556p:plain

2. サンプルプログラム
using System;
using WebSocket4Net;

namespace WebSocketSample
{
  class Program
  {
    static void Main(string[] args)
    {
      var websocket = new WebSocket("ws://example.com:81/...");

      // var proxy = new HttpConnectProxy(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8008));
      // websocket.Proxy = proxy;

      websocket.Opened += Websocket_Opened;
      websocket.MessageReceived += Websocket_MessageReceived;
      websocket.Closed += Websocket_Closed;
      websocket.DataReceived += Websocket_DataReceived;
      websocket.Error += Websocket_Error;

      websocket.AutoSendPingInterval = 30;
      websocket.EnableAutoSendPing = true;

      websocket.Open();

      Console.ReadKey();
    }

    private static void Websocket_Opened(object sender, EventArgs e)
    {
      Console.WriteLine("Websocket_Opened");
    }

    private static void Websocket_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e)
    {
      Console.WriteLine("Websocket_Error");
    }

    private static void Websocket_DataReceived(object sender, WebSocket4Net.DataReceivedEventArgs e)
    {
      Console.WriteLine($"Websocket_DataReceived { e.Data }");
    }

    private static void Websocket_Closed(object sender, EventArgs e)
    {
      Console.WriteLine("closed");
    }

    private static void Websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
    {
      Console.WriteLine($"Websocket_MessageReceived { e.Message }");
    }
  }
}

Packer Detectorまとめ

Ⅰ. はじめに

解析対象のバイナリがどの Executable Packer を使っているかを自動的に判定するツールです。

Ⅱ. Packer Detector 一覧

XAPKDetector

https://github.com/horsicq/XAPKDetector
Androidアプリ用です

XPEViewer

https://github.com/horsicq/XPEViewer

Exeinfo PE

http://exeinfo.atwebpages.com/

Detect It Easy

http://ntinfo.biz/

PEiD

http://www.peid.info/
2017/05/07時点 公式サイトにアクセス出来ませんでした
それなりに古くからあります

RDG Packer Detector

http://www.rdgsoft.net/
それなりに優秀ですがよくフリーズします

PE Detective

http://ntcore.com/pedetective.php
マルウェア解析用のVMにインストールされているツール

Nauz File Detector

https://github.com/horsicq/Nauz-File-Detector

その他

C++ で全ての例外を try catch 出来るようにする方法

Ⅰ. はじめに

Visual Studioのデフォルト設定ではWindowsが発行する「システム的な例外」を捉えることはできません。

  • 無効なメモリアドレスへのアクセス
  • 0での割り算

等が「システム的な例外」に該当します。

また、「『システム的な例外』をプログラム上で扱う事」を構造化例外処理(SEH: Structured Exception Handling)といいます。
SEH は Windows のみで有効です。

Ⅱ. やり方

1. プロジェクトのプロパティを開く

2. 構成プロパティ → C/C++ → コード生成

C++ の例外を有効にする」を「はい - SEH 例外あり(/EHa)」に変更する。

f:id:kagasu:20170504223041p:plain

3. メモリアクセス違反が発生するサンプルプログラムを実行する

#include <iostream>

using namespace std;

int main()
{
  try
  {
    *(int *)0 = 0;
  }
  catch (...)
  {
    cout << "catch exception" << endl;
  }

  return 0;
}

実行結果

f:id:kagasu:20170504223215p:plain

C++で複数プロセスから読み書き可能な共有メモリを作る

Ⅰ. はじめに

あるプロセスのメモリ空間には他のプロセスからアクセスする事ができません。
OpenProcess してアクセス権を得てもメモリ上のどのアドレスに何のデータが保存されているか簡単に分かりません。
この問題は複数プロセスで共有して使えるメモリ空間(共有メモリ)を利用することで解決できます。

Ⅱ. サンプル

  • 1. 1秒毎に共有メモリにデータを書き込むだけのプログラム
  • 2. 1秒毎に共有メモリからデータを読み込むだけのプログラム

上記2つのサンプルです。

1. 共有メモリにデータを書き込むだけのプログラム
#include <windows.h>
#include <iostream>

using namespace std;

void main()
{
  auto name = "hoge";
  auto size = 4;

  HANDLE hSharedMemory = CreateFileMapping(NULL, NULL, PAGE_READWRITE, NULL, size, name);
  auto pMemory = (int*)MapViewOfFile(hSharedMemory, FILE_MAP_ALL_ACCESS, NULL, NULL, size);

  for (int i = 0; i < 10; i++)
  {
    *pMemory = i;
    cout << i << endl;
    Sleep(1000);
  }

  UnmapViewOfFile(pMemory);
  CloseHandle(hSharedMemory);
}
2. 共有メモリからデータを読み込むだけのプログラム
#include <windows.h>
#include <iostream>

using namespace std;

void main()
{
  auto name = "hoge";
  auto size = 4;

  HANDLE hSharedMemory = CreateFileMapping(NULL, NULL, PAGE_READWRITE, NULL, size, name);
  auto pMemory = (int*)MapViewOfFile(hSharedMemory, FILE_MAP_ALL_ACCESS, NULL, NULL, size);

  for (int i = 0; i < 10; i++)
  {
    cout << *pMemory << endl;
    Sleep(1000);
  }

  UnmapViewOfFile(pMemory);
  CloseHandle(hSharedMemory);
}

Ⅲ. カーネルモードについて

カーネルモードとユーザーモードからアクセス可能な領域を作成するには名前を工夫する必要があります。
カーネルモード側はそのままで問題ありませんが、ユーザーモード側の名前を

auto name = "Global\\hoge";

とする必要があります。
また、場合によっては実行するユーザーをSYSTEMまで引き上げる必要があります。

参考
http://nahitafu.cocolog-nifty.com/nahitafu/2013/03/expartan-6twind.html
http://kagasu.hatenablog.com/entry/2017/09/27/191922

Ⅳ. 実行結果

f:id:kagasu:20170503003512g:plain

その他

以下記事の方法でC#でも同じメモリ空間を利用できます。
https://kagasu.hatenablog.com/entry/2021/10/16/132558