ちなみに中の人はCもC++も全然解ってません。
<この話題今更すぎません?>
万能フロントエンドとして個人的に重宝している携帯動画変換君(3GP_Converter)。
ガラケー(A5505SA/W63SA)時代は携帯動画/音声変換、ここ最近は
waifu2x や
OptiPNG とやりたい放題です。
ちなみに動画ffmpeg音声qtaacencをMP4Boxで結合するのが一番品質が高いと思います
しかーしWindows10で使おうとすると主に以下の症状が出る。
①avscheck.exeがばくはつして氏ぬ
②付属のffmpegがばくはつして氏ぬ
③Setup.exeで設定ファイルを指定して起動するとドラッグアンドドロップができない
参考:
携帯動画変換君をWindows10で無理矢理に作動させる - ぼくんちのTV 別館
まあ①はavscheckをリネーム、②は
今どきのffmpeg を使えばいいので対応は楽。
試せてないけどQT3GPPFlattenとATOMChanger使えればガラケーに積めるファイル作れるはず…ここ最近はffmpegのAAC音質クソだったけど
というかパッチありました。コレ当てればOKでしょう。試してないけど。
【Windows10対応】 携帯動画変換君 魔改造版 – 機械仕掛けのキュリオシティ
魔改造ってどういう改造してるんでしょうね?いっそSetup.exeにもパッチ当てて③も対処してくれればいいのに(謎の上から目線)
<ほぼコピペじゃねーか>
ググってみるとSetupから起動するとドラッグ(ryできないのはSetupが子プロセスに管理者権限を継承するからとの事。
だから通常権限のexplorerから3GP_Converterを起動するとドラッグ(ryできるって訳だね。
そこで試してみるとSetupは単純にカレントディレクトリの3GP_Converterを叩いてる模様。
脆弱性じゃ?
つまり間に権限の継承を断ち切る何かを噛ませば回避可能。
本当はSetupを改造するのが一番なんだけどバイナリ改造する知識が無い
という訳でいつもの動けばよかろう逝っとけコードです(しろめ)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*
//////////////////////////////////////////////////////////////
携帯動画変換君をWin10で使うテスト
2017/11/07 柏木てるみ
//////////////////////////////////////////////////////////////
・これは何?
→携帯動画変換君をSetup.exeから起動するとD&Dできない不具合対策
・何をしてるの?
→Setup(ryが管理者権限で3GP(ryを起動するのでD&Dできない
なので子プロセスを降格させてD&Dできるようにさせます
・使い方
①3GP_Converter.exeを3GP_Converter-exec.exeにリネーム
②コイツを3GP_Converter.exeとしてmakeして投げ込む
③普通にSetup.exeから設定を選んで起動させるだけ
*/
#include <stdio.h>
#include <windows.h>
#include <locale.h>
char crpath[256],t1[256];
WCHAR tpath,t2[256];
char LaunchAsNormalUser(LPCWSTR tpath) /*FirefoxのnsWindowsRestart.cppから拝借*/
{
HWND hwndShell = FindWindowA("Progman", NULL);
DWORD dwProcessId;
GetWindowThreadProcessId(hwndShell,&dwProcessId);
HANDLE hProcessShell = OpenProcess(MAXIMUM_ALLOWED,FALSE,dwProcessId);
if(!hProcessShell)
{
return FALSE;
}
HANDLE hTokenShell;
BOOL ok = OpenProcessToken(hProcessShell, MAXIMUM_ALLOWED, &hTokenShell);
CloseHandle(hProcessShell);
if (!ok)
{
return FALSE;
}
HANDLE hNewToken;
ok = DuplicateTokenEx(hTokenShell,
MAXIMUM_ALLOWED,
NULL,
SecurityDelegation,
TokenPrimary,
&hNewToken);
CloseHandle(hTokenShell);
if (!ok)
{
return FALSE;
}
STARTUPINFOW si = {sizeof(si), 0};
PROCESS_INFORMATION pi = {0};
WCHAR* myenv = GetEnvironmentStringsW();
ok = CreateProcessWithTokenW(hNewToken,
0,
tpath, /*実行ファイルのパス*/
NULL, /*これNULLでよかった*/
CREATE_UNICODE_ENVIRONMENT,
myenv,
NULL,
&si,
&pi);
if (myenv)
FreeEnvironmentStringsW(myenv);
CloseHandle(hNewToken);
if (!ok)
{
return FALSE;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
}
int main(void)
{
size_t ret;
GetCurrentDirectory(256,crpath); /*カレントディレクトリのパス取得*/
sprintf(t1,"%s\\3GP_Converter-exec.exe",crpath); /*文字列結合してパス作成*/
setlocale( LC_CTYPE, "jpn" ); /*日本語パス対策*/
mbstowcs_s(&ret,t2,256,t1,_TRUNCATE); /*charからWCHARに変換*/
LaunchAsNormalUser(t2); /*権限降格させて起動*/
return 0;
}
肝心要な降格部分は
有名なFirefoxのコード をコピペして動くようにいじっただけというこの(GPL汚染)
デスクトップ(Progman)からトークン取得して通常な権限で起動するという処理は判るけど実装は解ってません(無知)
しかし非コピペ部分から醸し出される素人感がすごいですね…変数ってどうやって確保量決めるんでしょう?
一応gccは-Wallでエラー吐かなかったので大丈夫…?脆弱性は知りません('A`)
使い方はコードの通り3GP_Converterを3GP_Converter-execにリネームしてmakeした奴を3GP_Converterとして投げ込むだけ。
これさえバッチファイルで用意しないと出来ない人はおらんよな?
ただ出力先とかの設定ファイルが別になるので再設定が必要。初回だけだけどね。
gcc等コンパイルできる環境が無い、何やってんのか全く解らない人(
64bit版限定 )は
自己責任 でこちら↓
3GP_Converter-DnD-Win10.zip
※64bit版RubyのDevkit(gcc4.7.2)で出力したので64bit版専用のはず。-m32指定したらエラー吐いたので32bitバイナリはありません※
※追記※
Setupの
互換性の設定が全部解除された状態 じゃないと3GP_Converterが
起動しません (´・ω・`)
あと元ソースにあったWin2k/WinXP回避部分は無視したのでVista以前だとエラーで氏ぬと思います。
Win10以外だと必要無いけど
※追記 - 2021/03/28※
自己責任バイナリで一瞬DOS窓が映るのを修正しました(´・ω・`)make時に-Wl,--subsystem,windows足しただけ
あとオマケでデュアルディスプレイ時に「変換君」設定ファイルセレクターがモニタ1とモニタ2の間に表示される件の対策を蔵出し。
自分用に作ってそのまんまになってた
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*
//////////////////////////////////////////////////////////////
携帯動画変換君の設定ファイルセレクタを画面中央に表示するテスト
2019/05/09 柏木てるみ
//////////////////////////////////////////////////////////////
横並びデュアルディスプレイ時にモニタ1とモニタ2の間に表示されるのをモニタ1中央に移動させる
(縦並び&トリプル以上は要修正)
何故か管理者権限が要るので.manifest書くか"管理者としてこのプログラムを実行する"にチェック入れること
*/
/*メモ:gccに-Wl,--subsystem,windows渡してDOS窓非表示にすること*/
#include <stdio.h>
#include <windows.h>
#include <locale.h>
int main(void)
{
RECT desk,SWND;
HWND hDeskWnd = GetDesktopWindow(),STITL=NULL;
long SX,SY,MX,MY;
WinExec("Setup-exec.exe",SW_HIDE); //オリジナルのSetup.exeをリネームしておくこと
STITL=FindWindowEx(NULL,NULL,NULL,"「変換君」設定ファイルセレクター");
GetWindowRect(hDeskWnd,&desk);
GetWindowRect(STITL,&SWND);
SX=SWND.right-SWND.left;
SY=SWND.bottom-SWND.top;
MX=(desk.right-SX)/2; //移動先のX原点(なんで2なのかわかんない)
MY=(desk.bottom-SY)/2; //移動先のY原点(なんで2なのかわかんない)
MoveWindow(STITL,MX,MY,SX,SY,0);
ShowWindow(STITL,5);
return 0;
}
…ぶっちゃけなんで動いてるのか解らないのでバイナリはありません。