めいくりぷとのブログ

技術的なことをまったりと。

文字列クラス

C++

gyazo.comstd::string の代用として使います。単なる自己満です。

std::mapに代わるコンテナクラス

C++

gyazo.com結果: gyazo.com

std::list, std::vectorに代わるコンテナクラス

C++

gyazo.com 値格納して取り出しまでを100万回ループ(最適化はしていません。)速度的には std::listとでは勿論, std::vectorと殆ど変わらない(むしろ速い?)、std::vectorが10万回辺りから高頻度でクラッシュするので、ZList(某MMORPGのから再現したコンテナク…

template class #3

C++

ある程度まとまっては来たが、何か微妙...

EA作成 #2

DLLからポインタの受渡しが不可能らしい(?)ので、MT4用にクラスのインスタンス作成から破棄まで全て __dllexport してあげて.... gyazo.comMT4側でラッパークラス作って... gyazo.comMT4側での動作確認&デストラクタが呼ばれてメモリ破棄されてるのも確認...…

EA作成のためのヤーツ

まずは関数の動作確認やら・・・最終的に相場巡回的な奴と、スピード注文的な奴に、自動売買までが目標です。それらのために、必要な処理やらクラスを少しずつ実装して行ってます。。。まあ地道に作っていきます。

template class #2

C++

CopyFromとかいうのだけ定義出来てないけど、メイプルでライブラリとして使うなら使えるはず..(オフセット変わってなければ) メイプルやらないから自己満でしか無いな。

template class

// Lock/Unlockするアレ メイプルのPDB見ながら地道に書いてます... メイプルどうこうってよりも、別の用途で書いてます。 書きながら学べた事が色々とあるので、一石二鳥ですの。

メインスレッドにメッセージウィンドウを仕込む #2

C++

BOOL Detour_KiUserCallbackDispatcher(__in BOOL fEnable) { typedef void(__stdcall *KiUserCallbackDispatcher_t)(void* a1, void* a2, void* a3); static KiUserCallbackDispatcher_t _KiUserCallbackDispatcher = reinterpret_cast<KiUserCallbackDispatcher_t>(GetProcAddress(GetM</kiusercallbackdispatcher_t>…

プロパティーを参照する。

AGameInfo *pGameInfo = reinterpret_cast<AGameInfo*>(pObject); if (pGameInfo != NULL && pGameInfo->IsA(AGameInfo::StaticClass())) { UOnlineGameSettings *pGameSettings = pGameInfo->GameSettings; if (pGameSettings != NULL) { TArray<FSettingsProperty> aProperties = pGameSet</fsettingsproperty></agameinfo*>…

ランダムな文字列を生成する。

C++

void GenerateRandomStringA(char* c, int maxlen) { int len = rand() % maxlen + 1; for (int c; c = rand() % 62, *s++ = (c + "07="[(c + 16) / 26])*(len-->0);); } void GenerateRandomStringW(wchar_t* c, int maxlen) { int len = rand() % maxlen +…

プロセスを列挙する。

typedef struct _PROCESS_INFO { WCHAR ImageName[MAX_PATH / 4]; ULONG UniqueProcess; }PROCESS_INFO, *PPROCESS_INFO; typedef std::vector<PROCESS_INFO> PROCESS_LIST; // src BOOL EnumerateProcess(__out PROCESS_LIST &ProcessList) { NTSTATUS ntStatus; PVOID pB</process_info>…

プロセスのセクション情報を取得する。

typedef struct _PE_INFO { DWORD Signature; IMAGE_DOS_HEADER DosHeader; IMAGE_FILE_HEADER FileHeader; union { IMAGE_OPTIONAL_HEADER32 OptionalHeader32; IMAGE_OPTIONAL_HEADER64 OptionalHeader64; }; }PE_INFO, *PPE_INFO; typedef struct _SYSTEM…

System Service Dispatch Table のアドレスを検索する。

C++

PVOID FindSSDT() { BYTE KiSystemServiceStartPattern[] = { 0x8B, 0xF8, 0xC1, 0xEF, 0x07, 0x83, 0xE7, 0x20, 0x25, 0xFF, 0x0F, 0x00, 0x00 }; ULONG uSize, uModuleSize; ULONG uOffset; PVOID pKernelModule; BOOL bFound; pKernelModule = GetKernelM…

GetModuleHandle Emulate

GetModuleHandle https://msdn.microsoft.com/ja-jp/library/ms683199(v=vs.85).aspx HMODULE WINAPI GetModuleHandleW( _In_ LPCWSTR lpModuleName ) { PPEB pProcessEnvironmentBlock; HMODULE hModule; pProcessEnvironmentBlock = this->GetProcessEnvir…

DeviceIoControl Emulate

DeviceIoControl https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa363216(v=vs.85).aspx BOOL WINAPI DeviceIoControl( _In_ HANDLE hDevice, _In_ DWORD dwIoControlCode, _In_opt_ LPVOID lpInBuffer, _In_ DWORD nInBufferSize, _Out_opt_ L…

GetProcAddress Emulate

GetProcAddress https://msdn.microsoft.com/en-us/library/windows/desktop/ms683212(v=vs.85).aspx FARPROC WINAPI GetProcAddress( _In_ HMODULE hModule, _In_ LPCSTR lpProcName ) { PIMAGE_EXPORT_DIRECTORY pExportDirectory; PIMAGE_NT_HEADERS pNtH…

メモリからファイルを作成する。

C++

BOOL CreateFileFromMemoryA(_In_ LPCSTR lpFileName, _In_reads_bytes_(nSize) LPCVOID lpBuffer, _In_ SIZE_T nSize) { INT nLength = MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, NULL, 0); if (nLength == 0) return FALSE; std::unique_ptr<WCHAR> wszBuf</wchar>…

プロセス/実行ファイルのPE情報を取得する。

まずは、適当な構造体を用意します。 自分の場合は、x86/x64共用で動作する関数を作りたかったので、オフセットが異なる構造体だけ unionで定義します。 typedef struct _PE_INFO { DWORD Signature; IMAGE_DOS_HEADER DosHeader; IMAGE_FILE_HEADER FileHea…

自/他プロセスのモジュールの列挙 x86/x64

x64 -> x86/x64 x86 -> x86 に対応対象プロセスがx86の場合は、NtQueryInformationProcessにProcessWow64Information を渡し、PEBのアドレスを取得する。 対象プロセスがx64の場合はWow64が無いので、ProcessBasicInformation を引数に渡し、PROCESS_BASIC_I…

高速でプロセスのメモリを調べる。

std::vector<SCAN_MEMORY_INFO> vScanMemory; MEMORY_BASIC_INFORMATION mbi; HANDLE hProcess; PBYTE pbStartAddress, pbEndAddress; SIZE_T nBufferSize, nNumberOfBytesRead; int nScanValue; hProcess = pIDEngine->GetAttachedProcess(); if (hProcess == INVALID_HANDLE_</scan_memory_info>…

逆アセンブルの実装

Disassembly with Intel XED.ついでに、CALL先のアドレスもIntel XED使ったら簡単に取得出来るから、IDA Proの関数列挙やらxrefのような事が簡単に作れてしまう。さすがに、IDA Pro自体をエミュレートする事は毎日コード書いても半年以上かかるレベルで大変…

メインスレッドにメッセージウィンドウを仕込む

#ifndef MAKEULONGLONG #define MAKEULONGLONG(ldw, hdw) ((ULONGLONG(hdw) << 32) | ((ldw) & 0xFFFFFFFF)) #endif #ifndef MAXULONGLONG #define MAXULONGLONG ((ULONGLONG)~((ULONGLONG)0)) #endif // utils.cpp DWORD GetMainThreadId(__in DWORD dwProc…

対象プロセスの関数列挙の実装 #4

関数のサイズ取得もこれで完成です。 とまあ・・・。コードが荒れ放題ですが、テストコードなので動作確認さえ取れればいいのです。 コード整理と言いつつ、2割整理して残り8割は中途半端に終わってるから、関数の統一性の無さと、無駄な引数が目立つでござ…

対象プロセスの関数列挙の実装 #3

DetourCopyInstructionで命令コピーして、 0xC3の場合はret、0xC2 0xXX 0x00 の場合は ret 00XX、それぞれ、ret, ret 00XXの次の命令もコピーして、0xCC or 0x90の場合は関数終了と判断する。 これで、near/far jmpが含まれない関数のサイズ取得までは出来た…

対象プロセスの関数列挙の実装 #2

エントリーポイント、エクスポート関数、各セクションのアドレスの取得まで書きました。 先にコードの整理を行ってから、次のステップに進みたいと思います。

対象プロセスの関数列挙の実装 #1

完成するかも分からない動的デバッガーを作っていこうかと。 フレームワークはQt, 言語はC++イメージとしては、IDA Pro 一部機能 + CheatEngine + α って感じかな。 ドライバによりメモリプロテクションが施されているプロセスに対しては、DKOMやらExploitを…

xigncode copy dll bypass

VOID Detour_o_o() { typedef LPVOID(WINAPI *VirtualAlloc_t)( _In_opt_ LPVOID lpAddress, _In_ SIZE_T dwSize, _In_ DWORD flAllocationType, _In_ DWORD flProtect ); typedef BOOL(WINAPI *VirtualProtect_t)( _In_ LPVOID lpAddress, _In_ SIZE_T dwSi…

D3D DDI SetRenderState Callback Function

BeginScene, EndSceneが呼ばれた時に D3D DDI SetRenderState callback functionが呼ばれるらしい。 docs.microsoft.com BeginSceneの時は、D3DDDIARG_RENDERSTATE 構造体メンバのD3DDDIRENDERSTATETYPE StateがD3DRENDERSTATE_SCENECAPTUREで、ValueがTRUE…

WDDM Hook #2

gyazo.com前記事の続き。どうやら、nvldumd.OpenAdapterが呼ばれて、内部でnvd3dum.OpenAdapterが呼ばれるらしい。 そのままnvldumd.dllを先に読み込んでおいてOpenAdapterフックするだけで良いらしい。 Direct3DCreate9 -> Direct3DCreate9Ex -> nvldumd.Op…