Skip to content

Instantly share code, notes, and snippets.

@rinsuki
Last active July 18, 2025 11:59
Show Gist options
  • Save rinsuki/7d3e89e80e1878e4c2d43b8e2a78e449 to your computer and use it in GitHub Desktop.
Save rinsuki/7d3e89e80e1878e4c2d43b8e2a78e449 to your computer and use it in GitHub Desktop.
OpenCV.NET のカメラ解像度を無理矢理変えるくん

OpenCV.NET の解像度を無理矢理変えるくん

こいつがやること

  • OpenCV.NET が OpenCV を呼び出す処理にフックをかけて、アプリが解像度を設定する時に値をこっそり置き換えます

使い方

  • frida-inject を落としてくる
    • 動くことを確認済み: https://github.com/frida/frida/releases/download/17.2.11/frida-inject-17.2.11-windows-x86_64.exe.xz
    • たぶんウイルスじゃないと思います きっと でも保証はできないので USE AT OWN RISK でお願いします
      • 参考: 私が落とした時の .xz ファイルの SHA-256 は 0b0581fb449d010533f1bb40df272b24cd7bcfeb501ebb673aab34a1eca64b43 でした (7-zip などで検証できます)
      • こいつは他のアプリにちょっかいを出すためのアプリ (Cheat Engine とかと同じ類) なので、まあウイルス扱いされてもそれはそうという感じ
    • xz で圧縮されてるので、最近の Windows 11 だったら右クリック→「すべて展開…」をするなり、そうでなかったら 7-Zip (あるいはその派生) などを使うなりして素の .exe を展開してください。
  • 以下のjsを落とす
    • なんか Raw って書かれてるボタンがjsのファイル名の隣にあると思うのでそこを右クリックして「リンク先を別名で保存」とやるといいと思います
  • ターゲットのアプリを起動する
  • 一旦 OpenCV を使いそうな機能を使う
    • 一旦映像を出してみるとか
  • frida-inject を引数付けて起動する
    • ターゲットのアプリに管理者権限が必要な場合は frida-inject も管理者権限のcmdとかPowershellで開かないといけないので注意
    • 引数は frida-inject-ほげほげ-windows-x86_64.exe -R v8 -s さっき落としたjsのパスをこれと置換する.js -n ターゲットのアプリのexe名.exe
      • 例: frida-inject-ほげほげ-windows-x86_64.exe -R v8 -s C:\Users\user\Downloads\hogehoge.js -n "OpenCV Demo.exe"
    • 空白が含まれる場合はダブルクオートで包むなりしてください
    • これが起動している間だけフックが有効になるのでそのままにしておいてください

ここまでやって、キャプボの画面を出そうとした時に set width: とかが frida-inject を動かしてるウィンドウに出てたら成功で、逆に {"type":"error", なんたらかんたら とか出てたら何かが失敗してます

const WIDTH = 1920 // お好みの横幅に書き換えてください (半角数字、あなたのカメラが対応している数値)
const HEIGHT = 1080 // お好みの高さに書き換えてください (半角数字、あなたのカメラが対応している数値)
// --- ここから処理
const VideoCapture_set_ptr = Process.getModuleByName("OpenCvSharpExtern.dll").getExportByName("videoio_VideoCapture_set")
const VideoCapture_set = new NativeFunction(VideoCapture_set_ptr, "int", ["pointer", "int", "double"])
// videoio_VideoCaptureSet は (void* obj, int id, double value) のsignatureだが
// Interceptor.attach では args は全部 NativePointer になり NativePointer から double にはできない (ちゃんとやればできる気はするが)
// (ref. https://github.com/frida/frida/issues/266#issuecomment-294729705 )
// ため、Interceptor.replace で頑張る
Interceptor.replace(VideoCapture_set, new NativeCallback((obj, id, value) => {
if (id === 3) { // width
console.log(`set width: ${value} -> ${WIDTH}`)
value = WIDTH
} else if (id === 4) { // height
console.log(`set height: ${value} -> ${HEIGHT}`)
value = HEIGHT
} else if (id === 5) { // fps
}
return VideoCapture_set(obj, id, value)
}, "int", ["pointer", "int", "double"]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment