備忘録

備忘録

C/C++

InfinityHook を利用して Windows の syscall を hook する方法

Ⅰ. はじめに Ⅱ. やり方 1. clone する 2. コンパイルする 3. 実行する 実行結果 FAQ Q. hook できません。 参考 Ⅰ. はじめに Windows の syscall を hook するメジャーな方法は SSDT Hook です。 しかし、Windows にはカーネル領域の改ざんを検知する仕組み…

Windows カーネルドライバでプロセスメモリを読み書きする方法

Ⅰ. はじめに タイトルの通り「Windows カーネルドライバでプロセスメモリの読み書きをする方法」です。 Ⅱ. サンプルプログラム https://github.com/kagasu/KMMM 実行結果 ① プロセスメモリの読み込みに成功し、「value 100」が出力された ② プロセスメモリの…

Windows Kernel Driver で HelloWorld する方法

Ⅰ. はじめに Ⅱ. やり方 1. Windows Driver Kit(WDK) をインストールする 2. Kernel Mode Driver, Empty(KMDF) の新規プロジェクトを作成する 3. サンプルプログラムを書く 4. 実行する 実行結果 FAQ Q. 以下のメッセージが表示され、ドライバの実行ができな…

Thread Hijacking を利用して他プロセスの関数を呼び出す方法

Ⅰ. はじめに タイトルの通り「Thread Hijacking を利用して他プロセスの関数を呼び出す方法」です。 Ⅱ. サンプルプログラム https://github.com/kagasu/ThreadHijacking

WOW64 syscall をhookする方法

Ⅰ. はじめに タイトルの通り「WOW64 syscall をhookする方法」です。 Ⅱ. サンプルプログラム https://github.com/kagasu/WOW64SyscallHook 参考 https://github.com/mq1n/Wow64SyscallHook http://www.codereversing.com/blog/archives/243 http://www.coder…

C++でJSONを扱う方法

Ⅰ. はじめに タイトルの通り「C++でJSONを扱う方法」です。ライブラリは cereal を利用します。 cereal は JSON 出力だけでなく、XMLやバイナリ出力にも対応しています。 Ⅱ. やり方 1. vcpkg で cereal をインストールする vcpkg install cereal 2. サンプル…

Qt + VisualStudio2019 + C++ で HelloWorldする方法

Ⅰ. はじめに Ⅱ. やり方 1. Qt5 のインストーラをダウンロードする 2. Qt5 をインストールする 3. 「MSVC v141 VS 2017 C++ x64/x86 ビルドツール」をインストールする 4. Qt Visual Studio Tools をインストールする 5. Qt Options から、Qtのディレクトリを…

C++でUUID(v4)を生成する方法

Ⅰ. はじめに Ⅱ. やり方(Botanを利用する場合) 1. Botanをインストールする 2. サンプルプログラムを書く 3. 実行結果 Ⅲ. やり方(Windowsのみ) 1. サンプルプログラムを書く 2. 実行結果 参考 Ⅰ. はじめに タイトルの通り「C++でUUID(v4)を生成する方法」…

C++でAESの暗号化と複合を行う方法

Ⅰ. はじめに タイトルの通り「C++でAESの暗号化と複合を行う方法」です。 Ⅱ. やり方 1. botanをインストールする vcpkg install botan 2. サンプルプログラムを書く #include <iostream> #include <botan/pipe.h> #include <botan/key_filt.h> #include <botan/hex_filt.h> #include <botan/b64_filt.h> // #include <botan/hex.h> #include <botan/base64.h> using namesp</botan/base64.h></botan/hex.h></botan/b64_filt.h></botan/hex_filt.h></botan/key_filt.h></botan/pipe.h></iostream>…

C++でBase64をエンコード、デコードする方法

Ⅰ. はじめに Ⅱ. やり方 1. botanをインストールする 2. サンプルプログラムを書く 2. サンプルプログラムを書く(Pipeを利用する方法) 3. 実行結果 参考 Ⅰ. はじめに タイトルの通り「C++でBase64をエンコード、デコードする方法」です。 Ⅱ. やり方 1. bota…

C/C++ パッケージマネージャvcpkgの使い方

Ⅰ. はじめに Ⅱ. インストール方法 Ⅲ. 使い方 パッケージをインストールする Windows 32bit 動的リンク用のパッケージをインストールする Windows 64bit 動的リンク用のパッケージをインストールする Windows 64bit 静的リンク用のパッケージをインストールす…

VC++ビルド時にMSB8038, LNK1104が出る場合の解決方法

Ⅰ. はじめに Ⅱ. 解決方法1(Spectre 軽減策オプションを「無効」にする) Ⅲ. 解決方法2 1. Visual Studio Installer を起動する 2. Libs for Spectre(x86 and x64) をインストールする Ⅰ. はじめに タイトルの通り「VC++ビルド時にMSB8038, LNK1104が出る場…

botanをWindowsでビルドする方法

Ⅰ. はじめに タイトルの通り「botanをWindowsでビルドする方法」です。 Ⅱ. 環境(必要なもの) ・Visual Studio 2017 Community (C++) ・Python 2.6以降 Ⅲ. やり方 1. リポジトリを clone する git clone https://github.com/randombit/botan 2. 「VS 2017用…

Pythonでダイナミックリンクライブラリを利用する方法

Ⅰ. はじめに Ⅱ. やり方 1. ダイナミックリンクライブラリを作成する 2. Pythonから呼び出す 実行結果 Ⅲ. 関数名に記号が入っている場合について 参考 Ⅰ. はじめに タイトルの通り「Pythonでダイナミックリンクライブラリを利用する方法」です。 Ⅱ. やり方 1.…

C++でHTTPサーバ、クライアントを作る方法

Ⅰ. はじめに Ⅱ. HTTPサーバ サンプルプログラム 実行結果 Ⅲ. HTTPクライアント サンプルプログラム 実行結果 参考 Ⅰ. はじめに タイトルの通り「C++でHTTPサーバ、クライアントを作る方法」です。以下のライブラリを使います。 https://github.com/yhirose/c…

タスクトレイのアイコンを消す方法

Ⅰ. はじめに タイトルの通り「タスクトレイのアイコンを消す方法」です。 Ⅱ. やり方 C++の場合 #include <Windows.h> int main() { auto hWnd = FindWindow(L"ApplicationWindow", NULL); NOTIFYICONDATA data; data.cbSize = sizeof(NOTIFYICONDATA); data.hWnd = hWnd</windows.h>…

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

Ⅰ. はじめに タイトルの通り「C++でLINQを使う方法(cpplinqの使い方)」です。 Ⅱ. 使い方 1. GitHubから cpplinq.hpp をダウンロードする https://github.com/mrange/cpplinq 2. サンプルプログラムを書く #include <iostream> #include <list> #include <algorithm> #include <string> #includ</string></algorithm></list></iostream>…

Linuxで他プロセスのメモリを読み書きする方法

Ⅰ. はじめに タイトルの通り「Linuxで他プロセスのメモリを読み書きする方法」です。 Windowsの場合はOpenProcessしてプロセスのハンドルを取得した後にReadProcessMemory, WriteProcessMemoryすればOKです。 Ⅱ. サンプルプログラム メモリを読み書き「され…

VisualStudioでx64アセンブリを書き、実行する方法

Ⅰ. はじめに 2018/01/03時点、VisualStudioでプラットフォームをx64と指定した場合インラインアセンブリ(__asm)がサポートされていない為使えません。 エラー C4235 非標準の拡張機能が使用されています: '__asm' キーワードはこのアーキテクチャではサポ…

C++(EXE)からC#(DLL)の関数を呼び出す

Ⅰ. はじめに Ⅱ. 「C++/CLIを使う」方法 1. C++のプロジェクト設定を開き「共通言語ランタイム サポート (/clr)」に変更する 2. サンプルプログラム 3. 実行結果 Ⅲ. 「C#(DLL)側で関数をエクスポートする」方法 1. サンプルプログラム 2. DllExport.bat をダ…

呼出規約とは

Ⅰ. はじめに Ⅱ. 環境 Ⅲ. 呼出規約(calling convention)とは Ⅳ. cdecl main.cpp 逆アセンブル ポイント リバースエンジニア向けのポイント Ⅴ. stdcall main.cpp 逆アセンブル ポイント リバースエンジニア向けのポイント Ⅵ. fastcall main.cpp 逆アセンブル …

Windowsでsyscallする方法

Ⅰ. はじめに タイトルの通り「Windowsでsyscallする方法」です。 この記事はWOW64を対象とした内容になっています。 x64向けはこちら http://kagasu.hatenablog.com/entry/2018/01/03/200337 Ⅱ. 環境 Windows 10 64bit 1709 Ⅱ. サンプルプログラム サンプル…

C++でWindowsのバージョンを取得する

Ⅰ. はじめに タイトルの通り「C++でWindowsのバージョンを取得する」方法です。 Ⅱ. サンプルプログラム #include <Windows.h> #include <iostream> typedef LONG NTSTATUS, *PNTSTATUS; #define STATUS_SUCCESS (0x00000000) #define OS_ANYSERVER 29 typedef NTSTATUS(WINAPI* Rt</iostream></windows.h>…

C++でプロセス名からプロセスIDを取得する

Ⅰ. はじめに Ⅱ. サンプルプログラム 1. CreateToolhelp32Snapshot を利用する場合 2. EnumProcesses を利用する場合 Ⅲ. 実行結果 Ⅰ. はじめに タイトルの通り「C++でプロセス名からプロセスIDを取得する」方法です。 Ⅱ. サンプルプログラム 1. CreateToolhel…

C++ リンカエラーを非表示にする方法

Ⅰ. はじめに タイトルの通り「C++ リンカエラーを非表示にする方法」です。 型キャスト等で出力されるコンパイラ警告は以下の一行で非表示にできますが、リンカエラーは #pragma では不可能です。 #pragma warning(disable:4312) コンパイラ警告の例 「C4312…

cpprestsdk をビルドしてstatic linkする

Ⅰ. はじめに cpprestsdk の使い方はこちらcpprestsdk はNuGetで dynamic link 版が配布されています。 static link 版は配布されていません。static link する為には2017/10/08時点、自分でビルドするしか方法がありません。 Ⅱ. 必要なもの VisualStudio 201…

C++でHTTP(S)でGET/POSTする(cpprestsdk の使い方)

Ⅰ. はじめに Ⅱ. なぜ「C++ RESET SDK(cpprestsdk)」を選んだのか Ⅲ. インストール方法 Ⅳ. GET 実行結果 Ⅴ. POST(JSON) 実行結果 Ⅵ. POST(form-urlencoded) 実行結果 その他 Ubuntuでコンパイルする時 参考 Ⅰ. はじめに .NET系 であれば WebClient や HttpCli…

OpenSSLをWindowsでビルドする方法

Ⅰ. はじめに タイトルの通り「OpenSSLをWindowsでビルドする方法」です。 コンパイル済みライブラリだけ欲しい人はこちら Ⅱ. 環境(必要なもの) ・Visual Studio 2017 Community (C++) ・Perl(ActivePerl を利用しました) ・OpenSSL 1.0.2l のソースコー…

WindowsでPOCO C++をビルドして使う

https://pocoproject.org/ Ⅰ. はじめに 「POCO C++」はモダンで強力なC++ライブラリです。 XML JSON Zip DB (SQLite, ODBC, MySQL) Foundation(基本機能ライブラリ Base64変換等) 等の機能があります。 Ⅱ. 1つづつビルドする方法 1. ソースコードをダウンロ…

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

Ⅰ. はじめに Visual Studioのデフォルト設定ではWindowsが発行する「システム的な例外」を捉えることはできません。 無効なメモリアドレスへのアクセス 0での割り算 等が「システム的な例外」に該当します。また、「『システム的な例外』をプログラム上で扱…