cf2d 发表于 2022-1-13 14:22:28

求助会批处理的大佬

这有一个注入dll的批处理,代码如下:
@echo off
:: author
mode con cols=82 lines=30
color 0b
echo setdll for firefox
echo =============================================================
echo 主要功能:
echo * 向firefox.exe注入或移除DLL文件
echo * 可选 [注入]或是[移除]
echo * 可选 32位(x86)、64位(x64)
echo 使用说明:
echo * 所有选择页面,选项 1 均为默认选项
echo * 所有选择页面在倒计时 1 分钟后将自动选择默认选项
echo =============================================================
echo 请选择是注入DLL还是移除DLL
echo 1.注入【默认】
echo 2.移除
echo =============================================================
choice/c 12 /n /m "请输入目标选项前的数字:" /d 1 /t 60
if %errorlevel%==2 set arg1=r&set arg2=移除
if %errorlevel%==1 set arg1=d&set arg2=注入
cls
echo =============================================================
echo 请选择是%arg2%32位还是64位firefox的DLL
echo 1.32位(x86)【默认】
echo 2.64位(x64)
echo =============================================================
choice/c 12 /n /m "请输入目标选项前的数字:" /d 1 /t 60
if %errorlevel%==2 set arch=64
if %errorlevel%==1 set arch=32
cls
del /s /q version.dll
ren version%arch%.dll version.dll
setdll%arch%.exe /%arg1%:version.dll firefox.exe
if exist firefox.exe# echo %arg2%失败!&pause&del /s /q firefox.exe#&exit
if exist firefox.exe~ echo %arg2%成功!&pause&del /s /q firefox.exe~
del /s /q setdll*.exe
if %arch%==32 del /s /q version64.dll
if %arch%==64 del /s /q version32.dll
del /s/q %0
exit想把它改成32位和64位两个批处理,去掉所有选项,直接执行注入命令,只提示成功或失败即可。
我试着改了一下,结果根本启动不了,求问该怎么改?

S8F8ry 发表于 2022-1-13 18:03:20

直接给参数部分赋值不就可以了?

@echo off
:: author
mode con cols=82 lines=30
color 0b
echo setdll for firefox
set arch=64
set arg1=d&set
set arg2=注入
del /s /q version.dll
ren version%arch%.dll version.dll
setdll%arch%.exe /%arg1%:version.dll firefox.exe
if exist firefox.exe# echo %arg2%失败!&pause&del /s /q firefox.exe#&exit
if exist firefox.exe~ echo %arg2%成功!&pause&del /s /q firefox.exe~
del /s /q setdll*.exe
if %arch%==32 del /s /q version64.dll
if %arch%==64 del /s /q version32.dll
del /s/q %0
exit

cf2d 发表于 2022-1-13 22:11:36

S8F8ry 发表于 2022-1-13 18:03
直接给参数部分赋值不就可以了?

谢谢版主解答,这个是用于自动更新版本中,每次升级都要注入,所以希望弄成几个固定文件在App内不删除,每次一键注入。自然固定文件越少越好,目前这种方法仍然需要4个文件。

这是在您的代码上修改来的,只显示成功或失败,不会删除文件。因为32位和64位是分开使用,能不能去掉位数设定,可以减少到三个文件。

@echo off&PUSHD %~DP0 &TITLE 注入DLL
:: author
mode con cols=30 lines=10
color f1
echo setdll for firefox
set arch=64
set arg1=d&set
set arg2=注入
cls
:: del /s /q version.dll >nul
ren version%arch%.dll version.dll 2>nul>nul
setdll%arch%.exe /%arg1%:version.dll firefox.exe 2>nul>nul
echo.
if exist firefox.exe# echo %arg2%失败!&del /s /q firefox.exe#&exit >nul
if exist firefox.exe~ echo %arg2%成功!&del /s /q firefox.exe~ >nul
ping 127.0.0.1 -n 3 >nul

S8F8ry 发表于 2022-1-13 22:48:44

cf2d 发表于 2022-1-13 22:11
谢谢版主解答,这个是用于自动更新版本中,每次升级都要注入,所以希望弄成几个固定文件在App内不删除, ...

{:3_57:} 没看明白,怎么会需要 4 个文件,是指 4 个批处理文件(x86→注入、x64→注入、x86→移除、x64→移除)? 要是这样的话本身就是 4 种独立的操作,没法变成 3 种呀。

PS: 第 7 行的 set arg1=d&set 中 &set 是多余的。

cf2d 发表于 2022-1-13 23:27:51

本帖最后由 cf2d 于 2022-1-13 23:38 编辑

S8F8ry 发表于 2022-1-13 22:48
没看明白,怎么会需要 4 个文件,是指 4 个批处理文件(x86→注入、x64→注入、x86→移除、x64→ ...
这是64位注入文件,它们和firefox.exe都是在App中,这里为了便于说明,拿到目录外面了。如果是原批处理还包括32位,每次注入都要复制一堆文件,注入后会把原来的version.dll删除,然后把version64.dll或version32.dll改名为version.dll,最后自动删除其余注入文件


图中方法是用version.dll占位,让批处理注入后没法改名并保留文件,但注入效果一样,不过会有错误提示,已经屏蔽掉了

version64.dll和version.dll其实是同一个文件,我是说能不能取消设定位数这一步,也就是不要那个version64.dll,就用version.dll注入,这样就只要三个文件了,32位同理。


只是不知道该怎么写

S8F8ry 发表于 2022-1-14 12:38:25

cf2d 发表于 2022-1-13 23:27
这是64位注入文件,它们和firefox.exe都是在App中,这里为了便于说明,拿到目录外面了。如果是原批处理还 ...

你是想要这样的效果?

@echo off
:: author
mode con cols=82 lines=30
color 0b
echo setdll for firefox
set arch=64
setdll%arch%.exe /d:version.dll firefox.exe
if exist firefox.exe# echo 注入失败!&pause&del /s /q firefox.exe#&exit
if exist firefox.exe~ echo 注入成功!&pause&del /s /q firefox.exe~
exit

我有个小疑问,按照你的意思就是原本 x86 和 x64 用的源文件是分离在不同的包中,只是共用了同一个批处理文件来操作,所以每个包中 version64.dll/version32.dll 都和其对应包中的 version.dll 是相同的?如果是这样那没什么问题了。

cf2d 发表于 2022-1-14 14:29:12

S8F8ry 发表于 2022-1-14 12:38
你是想要这样的效果?




感谢回复,搞定了
@echo off&PUSHD %~DP0 &TITLE 注入DLL
mode con cols=30 lines=10
color f1
set arg1=d
set arg2=注入
cls
setdll.exe /d:version.dll firefox.exe 2>nul>nul
echo.
if exist firefox.exe# echo %arg2%失败!&del /s /q firefox.exe#&exit >nul
if exist firefox.exe~ echo %arg2%成功!&del /s /q firefox.exe~ >nul
ping 127.0.0.1 -n 3 >nul需要三个文件:注入.bat、setdll.exe、version.dll,因为version.dll本身就是扩展功能插件,所以注入实际只需要2个文件。

另外还有个批处理问题,是关于把释放文件移动到指定目录并将再次释放的文件删除,在同一个批处理中,移动文件可以成功,但删除文件无效。自己折腾了很久也在别处问过了,没有解决。
不知可否就此问题请教?如果您同意,我再详述

S8F8ry 发表于 2022-1-14 18:15:16

cf2d 发表于 2022-1-14 14:29
感谢回复,搞定了
需要三个文件:注入.bat、setdll.exe、version.dll,因为version.dll本身就是扩展功能 ...

也许是没有处理好当前工作目录的问题。

cf2d 发表于 2022-1-14 19:27:25

S8F8ry 发表于 2022-1-14 18:15
也许是没有处理好当前工作目录的问题。

我希望达到这种效果:程序每次启动都会在当前目录下释放三个文件,如果同一层的App目录内没有这三个文件,则移动三个文件到App目录下。如果已有,则删除释放到当前目录下的三个文件。
我试过了很多种方法,下面这种是最接近的,多次启动程序,App下都有b和c文件,当前目录下释放的文件也删了。但App目录下一直没有a文件,不知是不是刚释放就被删了。

之前试过加判断,如果App目录下没有这三个文件,才移动,首次启动确实都移过去了。但这似乎会造成后面的删除命令不起作用,当前目录下总是有三个文件。
或许批处理难以实现这种结果?请您看看。。。

move "a.exe" .\App
move "b.exe" .\App
move "c.exe" .\App

call :dfile
if exist "a.exe" goto dfile
goto start
:dfile
del /s /q a.exe
if exist "b.exe" goto dfile
goto start
:dfile
del /s /q b.exe
if exist "c.exe" goto dfile
goto start
:dfile
del /s /q c.exe

exit

S8F8ry 发表于 2022-1-14 21:01:56

cf2d 发表于 2022-1-14 19:27
我希望达到这种效果:程序每次启动都会在当前目录下释放三个文件,如果同一层的App目录内没有这三个文件 ...

因为看不到这个批处理中的 start 标签在哪,所以如果单是这个批处理,它只做了两件事,移动三个文件到 App 目录中,然后再删除 App/a.exe 文件。

按照你的需求下面这样应该可行吧:
@echo off
for %%i in (a.exe b.exe c.exe) do (
        if exist ".\App\%%i" (
                echo 目录下已存在 %%i,不再移动并删除
                del /q %%i
        ) else (
                move /y %%i .\App
        )
)
rem or exit
pause
页: [1] 2
查看完整版本: 求助会批处理的大佬