Board logo

标题: [其他] 多线程执行批处理脚本 cocmd 1.0 [打印本页]

作者: Byaidu    时间: 2021-9-2 13:48     标题: 多线程执行批处理脚本 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
作者: peterboy666    时间: 2021-9-2 16:11

如果能跨 OS 更好,
Windows XP/7 是用最多的 OS,
假如能的话,顺便支持 Windows XP/7.
作者: cmd1152    时间: 2021-9-2 19:58

该版本的 C:\Users\Administrator\Desktop\cocmd\cocmd.exe 与您运行的 Windows 版本
不兼容。请查看计算机的系统信息,了解是否需要 x86 (32 位)或 x64 (64 位)版本的程序
,然后联系软件发布者。

有没有 x86 (32 位) 的
作者: Byaidu    时间: 2021-9-2 22:29

本帖最后由 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
作者: peterboy666    时间: 2021-9-2 22:55

Windows 7 X64
已有 MS VC 2015-2019 Redistributable X86/X64 14.27.29112
运行 cocmd.exe 卡住不动.
作者: Byaidu    时间: 2021-9-2 22:58

回复 5# peterboy666


需要带参数运行,例如 cocmd 1.bat 2.bat 3.bat,就可以多线程同时运行这三个脚本了
作者: peterboy666    时间: 2021-9-2 23:03

本帖最后由 peterboy666 于 2021-9-2 23:06 编辑

C:\>cocmd 1.bat 2.bat 3.bat
ERROR:193
ERROR:193

[Window Title]
cocmd.exe

[Main Instruction]
cocmd.exe 已经停止运作

[Content]
由于发生问题,导致程式停止正常运作。请关闭程式。

[关闭程式] [为程式进行侦错]

PS:
缺文件 我有補上
api-ms-win-core-kernel32-legacy-l1-1-0.dll
api-ms-win-core-libraryloader-l1-2-0.dll
作者: Byaidu    时间: 2021-9-2 23:09

回复 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
作者: peterboy666    时间: 2021-9-2 23:09

看了下 cmd.dll 最小 OS 需求是 V10.0
会不会是这个原因 ?
作者: peterboy666    时间: 2021-9-2 23:15

本帖最后由 peterboy666 于 2021-9-2 23:16 编辑

0040158F   .  E8 DC460000   CALL <JMP.&ADVAPI32.RegSetValueExW>                           ; \RegSetValueExW
00401594   .  83EC 18       SUB ESP,0x18
00401597   .  C70424 40B040>MOV DWORD PTR SS:[ESP],cocmd.0040B040                         ; |UNICODE "cmd_0.dll"
0040159E   .  E8 7D470000   CALL <JMP.&KERNEL32.LoadLibraryW>                             ; \LoadLibraryW
004015A3   .  83EC 04       SUB ESP,0x4
004015A6   .  A3 24B04000   MOV DWORD PTR DS:[0x40B024],EAX                               ; |
004015AB   .  E8 C0470000   CALL <JMP.&KERNEL32.GetLastError>                             ; |[GetLastError
004015B0   .  894424 04     MOV DWORD PTR SS:[ESP+0x4],EAX                                ; |
004015B4   .  C70424 E47040>MOV DWORD PTR SS:[ESP],cocmd.004070E4                         ; |ASCII "ERROR:%d",LF
004015BB   .  E8 00460000   CALL <JMP.&msvcrt.printf>                                     ; \printf

004015C0   .  A1 24B04000   MOV EAX,DWORD PTR DS:[0x40B024]

报错
ERROR:193
作者: Byaidu    时间: 2021-9-2 23:15

回复 9# peterboy666


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

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

提取码:glcc
作者: peterboy666    时间: 2021-9-2 23:17

看它 LoadLibraryW 就报错
作者: peterboy666    时间: 2021-9-2 23:25

试了新还是报错
ERROR:193
ERROR:193
作者: Byaidu    时间: 2021-9-2 23:29

回复 13# peterboy666

请问一下你补上的这两个 dll 文件是 x86 的吗
api-ms-win-core-kernel32-legacy-l1-1-0.dll
api-ms-win-core-libraryloader-l1-2-0.dll
作者: Byaidu    时间: 2021-9-2 23:30

等下我开个 Windows 7 虚拟机调试吧
作者: peterboy666    时间: 2021-9-2 23:35

本帖最后由 peterboy666 于 2021-9-2 23:49 编辑

回复 14# Byaidu


api-ms-win-core-kernel32-legacy-l1-1-0.dll X86 10.0(Win10)
api-ms-win-core-libraryloader-l1-2-0.dll   X86 6.3(Win8.1/2012 R2)

我是 Windows 7 X64
会不会版本不兼容 ?
找不到合用的 DLL.


又補
api-ms-win-core-systemtopology-l1-1-0.dll
api-ms-win-core-console-l2-1-0.dll
但找不到
api-ms-win-core-console-l2-2-0.dll




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2