标题: [其他] 多线程执行批处理脚本 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 代码:- @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
作者: 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |