Ⅰ. はじめに
タイトルの通り「リバースエンジニアリングを楽にする単語のメモ」です。
随時追加します。
タイトルの通り「リバースエンジニアリングを楽にする単語のメモ」です。
随時追加します。
WebSocket4Net は2017/05/11 時点でベータ段階ですが .NET Standard 対応の WebSocket ライブラリです。
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 }"); } } }
解析対象のバイナリがどの Executable Packer を使っているかを自動的に判定するツールです。
https://github.com/horsicq/XAPKDetector
Androidアプリ用です
https://github.com/horsicq/XPEViewer
http://exeinfo.atwebpages.com/
http://www.peid.info/
2017/05/07時点 公式サイトにアクセス出来ませんでした
それなりに古くからあります
http://www.rdgsoft.net/
それなりに優秀ですがよくフリーズします
http://ntcore.com/pedetective.php
マルウェア解析用のVMにインストールされているツール
https://github.com/horsicq/Nauz-File-Detector
Visual Studioのデフォルト設定ではWindowsが発行する「システム的な例外」を捉えることはできません。
等が「システム的な例外」に該当します。
また、「『システム的な例外』をプログラム上で扱う事」を構造化例外処理(SEH: Structured Exception Handling)といいます。
SEH は Windows のみで有効です。
#include <iostream> using namespace std; int main() { try { *(int *)0 = 0; } catch (...) { cout << "catch exception" << endl; } return 0; }
あるプロセスのメモリ空間には他のプロセスからアクセスする事ができません。
OpenProcess してアクセス権を得てもメモリ上のどのアドレスに何のデータが保存されているか簡単に分かりません。
この問題は複数プロセスで共有して使えるメモリ空間(共有メモリ)を利用することで解決できます。
上記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++) { *pMemory = i; cout << i << endl; Sleep(1000); } UnmapViewOfFile(pMemory); CloseHandle(hSharedMemory); }
#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
以下記事の方法でC#でも同じメモリ空間を利用できます。
https://kagasu.hatenablog.com/entry/2021/10/16/132558