1625-5 王子昂 总结《2018年2月6日》 【连续第494天总结】
A. C++多线程调用Pintools
B.
为了更进一步提高效率,转向C++的编写
虽然对于逆向手而言C必须扎实,但是实际上Python太方便已经很久没有写C程序了……
这个程序写了一下午,主要是各种设定和变量类型引起的。C中繁多复杂的类型很容易让人懵逼,虽然实际还是自己对C中各种类型、机制的理解不够…
查了一下C++11标准中引入了thread类来方便的调用多线程,另一方面为了规避效率较低的管道,所以使用CreateProcess来调用Pintools
思考过程中突然想起可以使用’<’重定向stdin,那当然也可以用’>’来重定向stdout啊。这样就可以在命令行调用,即线程级别指定输出文件名,从而区分每个线程的输出结果
查了一下发现在CreateProcess函数的一个参数中可以设置输入输出流的句柄
STARTUPINFO si;
HANDLE cmdOutput = CreateFile(ConvertCharToLPWSTR(out.c_str()),
GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
&sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE cmdInput = CreateFile(ConvertCharToLPWSTR(in.c_str()),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
&sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
si.hStdInput = cmdInput;
si.hStdOutput = cmdOutput;
si.dwFlags = STARTF_USESTDHANDLES;
CreateProcess(NULL, ConvertCharToLPWSTR((CMD).c_str()), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)
大体思路和python的多线程脚本相似,主线程获取参数,开启多线程运行pintools,然后回收返回值并比较、分析,找到较多的指令计数对应的字符,记录下来并进入下一轮
值得一提的是不知道是C++11以后的标准还是VS2017的设定啥的,很多API诸如CreateProcess都要求W即宽字符字符串,实际上也就是Unicode字符集。对于普通的字符数组则不满足—因为它们是一个字节每字符;而宽字符中是两个字节没字符,导致命令行用cout打印出来是可以用的,但通过CreateProcess就是调用不来。
通过MultiByteToWideChar这个API可以构造一个宽字符转