備忘録

備忘録

C++でWindows上の特定プロセスの全スレッドIDを取得する方法

Ⅰ. はじめに

タイトルの通り「C++Windows上の特定プロセスの全スレッドIDを取得する方法」です。

Ⅱ. サンプルプログラム

#include <Windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <vector>
#include <algorithm>

std::vector<uint32_t> GetAllThreadIds(uint32_t processId)
{
  std::vector<uint32_t> threadIds;
  THREADENTRY32 threadEntry32 = { 0 };

  auto hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, processId);
  if (hThreadSnap != INVALID_HANDLE_VALUE)
  {
    threadEntry32.dwSize = sizeof(THREADENTRY32);

    if (!Thread32First(hThreadSnap, &threadEntry32))
    {
      CloseHandle(hThreadSnap);
    }
    else
    {
      do
      {
        if (threadEntry32.th32OwnerProcessID == processId)
        {
          threadIds.emplace_back(threadEntry32.th32ThreadID);
        }
      } while (Thread32Next(hThreadSnap, &threadEntry32));

      CloseHandle(hThreadSnap);
    }
  }

  return threadIds;
}

int main()
{
  auto pid = GetCurrentProcessId();
  auto threadIds = GetAllThreadIds(pid);
  std::sort(threadIds.begin(), threadIds.end());
  for (auto threadId : threadIds)
  {
    std::cout << "threadId: " << threadId << std::endl;
  }

  return 0;
}

実行結果

f:id:kagasu:20210305114445p:plain

ハードウェアブレークポイント(HWBP)とVEHを利用してデバッガを作成する方法

Ⅰ. はじめに

タイトルの通り「ハードウェアブレークポイント(HWBP)とVEHを利用してデバッガを作成する方法」です。

Ⅱ. サンプルプログラム

https://github.com/kagasu/VEHTest

HWBPのメリット/デメリット

メリット
  • メモリを変更する必要がない為メモリ改ざんチェックを回避できる
  • ページガードを利用した方法よりもHWBPの方が高速に処理できる
デメリット
  • GetThreadContext等で簡単に検知可能
  • ブレークポイントの数に制限がある(スレッドごとに最大4個)
  • 新規スレッドが生成された時に新規スレッドに対して自動的にHWBPを設定する処理を実装する必要がある(新規スレッドに対してHWBPを設定する必要がなければ実装しなくてOK)

ページガードBPのメリット/デメリット

メリット
デメリット
  • VirtualQuery等で検知可能
  • 処理速度が低速

Twitterのトレンド(おすすめ)にNGワードを設定して非表示にする方法

Ⅰ. はじめに

タイトルの通り「Twitterのトレンド(おすすめ)にNGワードを設定して非表示にする方法」です。

Ⅱ. やり方

2. 以下スクリプトを貼り付ける
// ==UserScript==
// @name         TwitterTrendCleaner
// @version      1.0.0
// @author       kagasu
// @match        https://*.twitter.com/*
// @grant        none
// ==/UserScript==

(function () {
  let timeoutId = null

  function trendCleaner () {
    const ngWords = [ 'ハフポスト', '週刊文春', '日刊ゲンダイ' ]

    const title = document.evaluate('//h1[contains(text(), "トレンド")]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0)
    const trends = title.nextSibling.childNodes[0].childNodes
    for (const trend of trends) {
      for (const ngWord of ngWords) {
        if (trend.innerText.includes(ngWord)) {
          trend.style.display = 'none'
          break
        }
      }
    }
    // do not delete
    // clearTimeout(timeoutId)
  }

  timeoutId = setInterval(trendCleaner, 1000)
})()

実行結果

f:id:kagasu:20210302010315p:plain

Windowsでマザーボード型番を調べる方法

Ⅰ. はじめに

タイトルの通り「Windowsでマザーボード型番を調べる方法」です。

Ⅱ. やり方

1. 以下コマンドを実行する
wmic baseboard get product,Manufacturer

実行結果

Manufacturer           Product
ASUSTeK COMPUTER INC.  TUF GAMING B550-PLUS

C++でjoinする方法

Ⅰ. はじめに

タイトルの通り「C++でjoinする方法」です。

Ⅱ. やり方

1. 必要なパッケージをインストールする
vcpkg install fmt
2. サンプルプログラムを書く
#include <fmt/format.h>
#include <iostream>

int main()
{
  auto delimiter = ",";
  auto items = { "a", "b", "c" };
  auto result = fmt::format("{}", fmt::join(items, delimiter));
  std::cout << result << std::endl;
  return 0;
}

実行結果

a,b,c