找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3021|回复: 12

求助会批处理的大佬

[复制链接]

7

主题

55

回帖

1089

积分

金牌会员

积分
1089
发表于 2022-1-13 14:22:28 | 显示全部楼层 |阅读模式
这有一个注入dll的批处理,代码如下:
  1. @echo off
  2. :: author
  3. mode con cols=82 lines=30
  4. color 0b
  5. echo setdll for firefox
  6. echo =============================================================
  7. echo 主要功能:
  8. echo * 向firefox.exe注入或移除DLL文件
  9. echo * 可选 [注入]或是[移除]
  10. echo * 可选 32位(x86)、64位(x64)
  11. echo 使用说明:
  12. echo * 所有选择页面,选项 1 均为默认选项
  13. echo * 所有选择页面在倒计时 1 分钟后将自动选择默认选项
  14. echo =============================================================
  15. echo 请选择是注入DLL还是移除DLL
  16. echo 1.注入【默认】
  17. echo 2.移除
  18. echo =============================================================
  19. choice  /c 12 /n /m "请输入目标选项前的数字:" /d 1 /t 60
  20. if %errorlevel%==2 set arg1=r&set arg2=移除
  21. if %errorlevel%==1 set arg1=d&set arg2=注入
  22. cls
  23. echo =============================================================
  24. echo 请选择是%arg2%32位还是64位firefox的DLL
  25. echo 1.32位(x86)【默认】
  26. echo 2.64位(x64)
  27. echo =============================================================
  28. choice  /c 12 /n /m "请输入目标选项前的数字:" /d 1 /t 60
  29. if %errorlevel%==2 set arch=64
  30. if %errorlevel%==1 set arch=32
  31. cls
  32. del /s /q version.dll
  33. ren version%arch%.dll version.dll
  34. setdll%arch%.exe /%arg1%:version.dll firefox.exe
  35. if exist firefox.exe# echo %arg2%失败!&pause&del /s /q firefox.exe#&exit
  36. if exist firefox.exe~ echo %arg2%成功!&pause&del /s /q firefox.exe~
  37. del /s /q setdll*.exe
  38. if %arch%==32 del /s /q version64.dll
  39. if %arch%==64 del /s /q version32.dll
  40. del /s/q %0
  41. exit
复制代码
想把它改成32位和64位两个批处理,去掉所有选项,直接执行注入命令,只提示成功或失败即可。
我试着改了一下,结果根本启动不了,求问该怎么改?

回复

使用道具 举报

8

主题

7470

回帖

2万

积分

超级版主

(^^ゞ

积分
21067
发表于 2022-1-13 18:03:20 | 显示全部楼层
直接给参数部分赋值不就可以了?

  1. @echo off
  2. :: author
  3. mode con cols=82 lines=30
  4. color 0b
  5. echo setdll for firefox
  6. set arch=64
  7. set arg1=d&set
  8. set arg2=注入
  9. del /s /q version.dll
  10. ren version%arch%.dll version.dll
  11. setdll%arch%.exe /%arg1%:version.dll firefox.exe
  12. if exist firefox.exe# echo %arg2%失败!&pause&del /s /q firefox.exe#&exit
  13. if exist firefox.exe~ echo %arg2%成功!&pause&del /s /q firefox.exe~
  14. del /s /q setdll*.exe
  15. if %arch%==32 del /s /q version64.dll
  16. if %arch%==64 del /s /q version32.dll
  17. del /s/q %0
  18. exit
复制代码
¯\(°_o)/¯
回复

使用道具 举报

7

主题

55

回帖

1089

积分

金牌会员

积分
1089
 楼主| 发表于 2022-1-13 22:11:36 | 显示全部楼层
S8F8ry 发表于 2022-1-13 18:03
直接给参数部分赋值不就可以了?

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

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

  1. @echo off&PUSHD %~DP0 &TITLE 注入DLL
  2. :: author
  3. mode con cols=30 lines=10
  4. color f1
  5. echo setdll for firefox
  6. set arch=64
  7. set arg1=d&set
  8. set arg2=注入
  9. cls
  10. :: del /s /q version.dll >nul
  11. ren version%arch%.dll version.dll 2>nul  >nul
  12. setdll%arch%.exe /%arg1%:version.dll firefox.exe 2>nul  >nul
  13. echo.
  14. if exist firefox.exe# echo %arg2%失败!&del /s /q firefox.exe#&exit >nul
  15. if exist firefox.exe~ echo %arg2%成功!&del /s /q firefox.exe~ >nul
  16. ping 127.0.0.1 -n 3 >nul
复制代码


回复

使用道具 举报

8

主题

7470

回帖

2万

积分

超级版主

(^^ゞ

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

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

PS: 第 7 行的 set arg1=d&set 中 &set 是多余的。
¯\(°_o)/¯
回复

使用道具 举报

7

主题

55

回帖

1089

积分

金牌会员

积分
1089
 楼主| 发表于 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,最后自动删除其余注入文件
2022-01-13_231048.png

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

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


只是不知道该怎么写

回复

使用道具 举报

8

主题

7470

回帖

2万

积分

超级版主

(^^ゞ

积分
21067
发表于 2022-1-14 12:38:25 | 显示全部楼层
cf2d 发表于 2022-1-13 23:27
这是64位注入文件,它们和firefox.exe都是在App中,这里为了便于说明,拿到目录外面了。如果是原批处理还 ...

你是想要这样的效果?

  1. @echo off
  2. :: author
  3. mode con cols=82 lines=30
  4. color 0b
  5. echo setdll for firefox
  6. set arch=64
  7. setdll%arch%.exe /d:version.dll firefox.exe
  8. if exist firefox.exe# echo 注入失败!&pause&del /s /q firefox.exe#&exit
  9. if exist firefox.exe~ echo 注入成功!&pause&del /s /q firefox.exe~
  10. exit
复制代码


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

使用道具 举报

7

主题

55

回帖

1089

积分

金牌会员

积分
1089
 楼主| 发表于 2022-1-14 14:29:12 | 显示全部楼层
S8F8ry 发表于 2022-1-14 12:38
你是想要这样的效果?

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

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

使用道具 举报

8

主题

7470

回帖

2万

积分

超级版主

(^^ゞ

积分
21067
发表于 2022-1-14 18:15:16 | 显示全部楼层
cf2d 发表于 2022-1-14 14:29
感谢回复,搞定了
需要三个文件:注入.bat、setdll.exe、version.dll,因为version.dll本身就是扩展功能 ...

也许是没有处理好当前工作目录的问题。
¯\(°_o)/¯
回复

使用道具 举报

7

主题

55

回帖

1089

积分

金牌会员

积分
1089
 楼主| 发表于 2022-1-14 19:27:25 | 显示全部楼层
S8F8ry 发表于 2022-1-14 18:15
也许是没有处理好当前工作目录的问题。

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

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

  1. move "a.exe" .\App
  2. move "b.exe" .\App
  3. move "c.exe" .\App

  4. call :dfile
  5. if exist "a.exe" goto dfile
  6. goto start
  7. :dfile
  8. del /s /q a.exe
  9. if exist "b.exe" goto dfile
  10. goto start
  11. :dfile
  12. del /s /q b.exe
  13. if exist "c.exe" goto dfile
  14. goto start
  15. :dfile
  16. del /s /q c.exe

  17. exit
复制代码


回复

使用道具 举报

8

主题

7470

回帖

2万

积分

超级版主

(^^ゞ

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

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

按照你的需求下面这样应该可行吧:
  1. @echo off
  2. for %%i in (a.exe b.exe c.exe) do (
  3.         if exist ".\App\%%i" (
  4.                 echo 目录下已存在 %%i,不再移动并删除
  5.                 del /q %%i
  6.         ) else (
  7.                 move /y %%i .\App
  8.         )
  9. )
  10. rem or exit
  11. pause
复制代码
¯\(°_o)/¯
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|百分浏览器论坛

GMT+8, 2024-11-22 01:47 , Processed in 0.018713 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表