前言
- 在使用metasploit的时候难免会遇到一些操作会用到中文,比如执行带用中文路径的文件,进程返回和窗口信息返回中出现中文乱码的情况,在修改Metasploit源码都无法实现的情况下就要重新编译metasploit-payload进行修复。
- 下面对不支持执行带有中文路径进行修复简述。
目前状况

- 对执行文件整个流程的跟踪,在命令调度器中对
client.sys.process.execute
传递的参数,并没有异常。

- 到了发送到客户端前的编码也没有问题,所以只能是metasploit-payload中出现bug了。

- fork一个主分支到自己的github,克隆到本地,开发环境为VS2013。
git clone <https://github.com/cn-kali-team/metasploit-payloads>
- 因为metasploit-payload中用到了很多其他的开源项目,所以需要初始化子模块
git submodule init && git submodule update
- 进程处理这一块都是在stdapi这一个插件里,使用VS2013打开
ext_server_stdapi
这个工程项目中的process.c
文件。

- 定位调用接收PATH参数的地方也很简单,直接搜索在Metasploit源码中找到的
TLV_TYPE_PROCESS_PATH
就可以找到了。
- UNCICODE支持可以看官方的wiki,但是现在接口已经变了,但是主要的思路没有变,就是官方提供接口将utf8和wchar两种编码互换,只要新加一个变量,将你想用到的编码转换后赋值给这个变量就直接可以用了。
- wiki中的转换方法是:
wchar_t *utf8_to_wchar(const char *in);
char *wchar_to_utf8(const wchar_t *in);
met_api->string.wchar_to_utf8(name);
met_api->string.wchar_to_utf8(path);

- 详细修改请看我提交的PR,这里只是将
CreateProcessW
和commandLine_w
修复Unicode支持。

- 编译成功后会生成对应的dll文件,将
ext_server_stdapi.x86.dll
文件复制替换掉你原来的文件,例如我的ruby开发环境下的模块路径为:.rbenv\\versions\\2.7.2\\lib\\ruby\\gems\\2.7.0\\gems\\metasploit-payloads-2.0.23\\data\\meterpreter\\ext_server_stdapi.x86.dll
修复后

- 按照metasploit-payload的官方wiki,下载DebugView,以管理员权限打开,设置拦截全局Win32调试信息。

- 在项目的common.h文件中修改
# define DEBUGTRACE 1
调试标志为真,在你想调试输出的地方加上dprintf([format string])
,你想打印的信息。
- 再次运行木马就可以查看调试信息了。但是这还不如我自己用x64dbg附加进程调。
