本帖最后由 Byaidu 于 2021-9-2 14:24 编辑
cocmd 工具通过在进程空间中加载多个 cmd.dll 实例实现了真正意义上的多线程执行批处理脚本,其中 cmd.dll 修改自 cmd.exe
使用方法:cocmd [命令1] [命令2] ...
不同于 start /b 的启动方式,因为环境变量和进程环境是绑定的,所以多个脚本线程间可以实时共享变量
举个应用的例子,可以在请求输入的同时动态显示时间
后续可能会引入线程锁之类的功能,不过肯定没有 powershell 这种原生的好用就是了
运行环境:Windows 10 x64
1.bat 代码:- @echo off
- cls
- :loop
- echo #1.bat %time% 1>&2
- title time:%time%(1.bat) a:%a%(2.bat) b:%b%(3.bat)
- ping -n 2 localhost >nul
- goto loop
复制代码 2.bat 代码:- @echo off
- cls
- set a=0
- :loop
- echo #2.bat %a% 1>&2
- set /a a+=1
- ping -n 3 localhost >nul
- goto loop
复制代码 3.bat 代码:- @echo off
- cls
- set b=0
- :loop
- echo #3.bat %b% 1>&2
- set /a b+=1
- ping -n 4 localhost >nul
- goto loop
复制代码 执行命令:复制代码 执行结果(注意标题栏内容):
cocmd 源码:- #include <cstdio>
- #include <windows.h>
- #include <thread>
-
- using namespace std;
-
- typedef int (*func1)();
-
- BYTE Data[4096];
- HKEY hKey;
- HMODULE hdll;
- DWORD dllcnt = 0;
- WCHAR dllname[4096];
- WCHAR dllcopy[4096];
- thread threadlist[1024];
-
- int main() {
- int argc;
- WCHAR **argv=CommandLineToArgvW(GetCommandLineW(), &argc);
-
- for (int i=1;i<argc;i++){
- RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Command Processor", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
- swprintf(dllname,L"cmd_%d.dll",dllcnt);
- CopyFileW(L"cmd.dll",dllname,false);
- wcscpy((PWCHAR)Data, argv[i]);
- RegSetValueExW(hKey, L"AutoRun", 0, REG_EXPAND_SZ, Data, (wcslen((PWCHAR)Data) + 1) * sizeof(WCHAR));
- hdll = LoadLibraryW(dllname);
- threadlist[dllcnt] = thread(func1((unsigned char*)hdll + 0x18F50));
- dllcnt++;
- Sleep(100);
- RegDeleteValueW(hKey, L"AutoRun");
- }
-
- while (1){Sleep(1000);}
-
- return 0;
- }
复制代码 PS:
目前默认情况下的管道有点小问题,需要在控制台输出时请在后面加上 1>&2
不知道为什么在 cmd.exe 进程下通过 LoadLibrary 加载 cmd.dll 会出现 c0000409 错误,所以暂时就没有做成注入式的工具
下载地址:
https://drive.google.com/file/d/ ... F-/view?usp=sharing
https://pan.baidu.com/s/1_POOZQtXxG_Ja8T0YljerA
提取码:101g |