[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 多线程执行批处理脚本 cocmd 1.0

本帖最后由 Byaidu 于 2021-9-2 14:24 编辑

cocmd 工具通过在进程空间中加载多个 cmd.dll 实例实现了真正意义上的多线程执行批处理脚本,其中 cmd.dll 修改自 cmd.exe

使用方法:cocmd [命令1] [命令2] ...

不同于 start /b 的启动方式,因为环境变量和进程环境是绑定的,所以多个脚本线程间可以实时共享变量

举个应用的例子,可以在请求输入的同时动态显示时间

后续可能会引入线程锁之类的功能,不过肯定没有 powershell 这种原生的好用就是了

运行环境:Windows 10 x64

1.bat 代码:
  1. @echo off
  2. cls
  3. :loop
  4. echo #1.bat %time% 1>&2
  5. title time:%time%(1.bat) a:%a%(2.bat) b:%b%(3.bat)
  6. ping -n 2 localhost >nul
  7. goto loop
复制代码
2.bat 代码:
  1. @echo off
  2. cls
  3. set a=0
  4. :loop
  5. echo #2.bat %a% 1>&2
  6. set /a a+=1
  7. ping -n 3 localhost >nul
  8. goto loop
复制代码
3.bat 代码:
  1. @echo off
  2. cls
  3. set b=0
  4. :loop
  5. echo #3.bat %b% 1>&2
  6. set /a b+=1
  7. ping -n 4 localhost >nul
  8. goto loop
复制代码
执行命令:
  1. cocmd 1.bat 2.bat 3.bat
复制代码
执行结果(注意标题栏内容):


cocmd 源码:
  1. #include <cstdio>
  2. #include <windows.h>
  3. #include <thread>
  4. using namespace std;
  5. typedef int (*func1)();
  6. BYTE Data[4096];
  7. HKEY hKey;
  8. HMODULE hdll;
  9. DWORD dllcnt = 0;
  10. WCHAR dllname[4096];
  11. WCHAR dllcopy[4096];
  12. thread threadlist[1024];
  13. int main() {
  14.     int argc;
  15.     WCHAR **argv=CommandLineToArgvW(GetCommandLineW(), &argc);
  16.     for (int i=1;i<argc;i++){
  17.         RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Command Processor", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
  18.         swprintf(dllname,L"cmd_%d.dll",dllcnt);
  19.         CopyFileW(L"cmd.dll",dllname,false);
  20.         wcscpy((PWCHAR)Data, argv[i]);
  21.         RegSetValueExW(hKey, L"AutoRun", 0, REG_EXPAND_SZ, Data, (wcslen((PWCHAR)Data) + 1) * sizeof(WCHAR));
  22.         hdll = LoadLibraryW(dllname);
  23.         threadlist[dllcnt] = thread(func1((unsigned char*)hdll + 0x18F50));
  24.         dllcnt++;
  25.         Sleep(100);
  26.         RegDeleteValueW(hKey, L"AutoRun");
  27.     }
  28.     while (1){Sleep(1000);}
  29.     return 0;
  30. }
复制代码
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

本帖最后由 Byaidu 于 2021-9-2 22:57 编辑

回复 3# cmd1152


下面是支持 32 位的版本,Windows 10 以下的系统需要安装微软最新版本的 C++ 运行库

msvcrt 下载链接:https://support.microsoft.com/zh ... 3-9aff-95f26a218cc0

cocmd 下载链接:https://pan.baidu.com/s/1we7J41KATOzo78ineR9zwg

提取码:opcb

TOP

回复 5# peterboy666


需要带参数运行,例如 cocmd 1.bat 2.bat 3.bat,就可以多线程同时运行这三个脚本了

TOP

回复 7# peterboy666


However I only get the error on win7 systems. It loads fine on win10. The date of this original question suggests it was win7.


似乎是系统的问题,看起来只能用 Windows 10 来运行了

https://stackoverflow.com/questi ... library-193/9380329

TOP

回复 9# peterboy666


修改了一下版本限制,现在也许可以运行了

链接:https://pan.baidu.com/s/1mJ2p7QE3ijdYlE2mJjVg6w

提取码:glcc

TOP

回复 13# peterboy666

请问一下你补上的这两个 dll 文件是 x86 的吗
api-ms-win-core-kernel32-legacy-l1-1-0.dll
api-ms-win-core-libraryloader-l1-2-0.dll

TOP

等下我开个 Windows 7 虚拟机调试吧

TOP

返回列表