180206 逆向-C++多线程调用PinTools

本文介绍了如何使用C++通过多线程调用PinTools进行逆向工程,探讨了C++11的thread类以及如何利用CreateProcess创建进程并重定向输出。在解决字符编码问题后,发现C++实现比Python运行速度更快,优化CPU使用能有效提升效率。
摘要由CSDN通过智能技术生成

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可以构造一个宽字符转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值