博客

不用使用c++ 11 std:mutex

最近在工程vs2013 使用 std:mutex 互斥对象,用于防止线程竞争,在自己win10可以正常运行,在win7 上面会崩溃,抛出异常。我自己使用DLL库,编译运行库用mt .然后google 好多,发现很多类似的问题。貌似都是不推荐使用微软实现该std::mutex,我真的无语了,标准的库兼容性都这么差。

后面只能网上找自己封装的mutex,方便自己用于线程竞争了


#ifndef _Lock_H
#define _Lock_H
#include

//锁接口类
class IMyLock
{
public:
virtual ~IMyLock() {}
virtual void Lock() const = 0;
virtual void Unlock() const = 0;
};

//互斥对象锁类
class Mutex : public IMyLock
{
public:
Mutex();
~Mutex();
virtual void Lock() const;
virtual void Unlock() const;
private:
HANDLE m_mutex;
};

//锁
class CLock
{
public:
CLock(const IMyLock&);
~CLock();
private:
const IMyLock& m_lock;
};
#endif

cpp:
#include "stdafx.h"
#include "Lock.h"
//创建一个匿名互斥对象
Mutex::Mutex()
{
m_mutex = ::CreateMutex(NULL, FALSE, NULL);
}
//销毁互斥对象,释放资源
Mutex::~Mutex()
{
::CloseHandle(m_mutex);
}
//确保拥有互斥对象的线程对被保护资源的独自访问
void Mutex::Lock() const
{
DWORD d = WaitForSingleObject(m_mutex, INFINITE);
}
//释放当前线程拥有的互斥对象,以使其它线程可以拥有互斥对象,对被保护资源进行访问
void Mutex::Unlock() const
{
::ReleaseMutex(m_mutex);
}
//利用C++特性,进行自动加锁
CLock::CLock(const IMyLock& m) : m_lock(m)
{
m_lock.Lock();
}
//利用C++特性,进行自动解锁
CLock::~CLock()
{
m_lock.Unlock();
}

openssl无需编译方法

背景:

因为最近用到加密算法,c++ 没有自带算法库,所以决定用openssl库里面的算法,习惯了python,java 管理库,再回到c++使用第三方库,感觉好痛苦。

目的:

不需要编译,直接拿过来用。

解决方案:

1:动态库:

https://slproweb.com/products/Win32OpenSSL.html

可以直接安装,在安装目录引进include 和lib, 就直接跑起来。理论复制到自己编译程序目录,也能跑起来,没有测试过。

2:静态库

https://zhuanlan.zhihu.com/p/31154924

这个别人编译好的,直接引进,就能直接跑起来了。

 

 

逛了一下当初学习编程的论讨

论坛:

www.cctry.com

看了一下论讨,看了一下新手提的问题,一下子回到大学的时候。当初也是一个新手,学习WINDWOS API, 纠结怎么徒手写windows 消息窗口, 学习怎么对话框,然后学习MFC界面开发,然后学习网络开发,然后学习开发网络变成,然后学习驱动编程等等。

这些年过去,感觉过去学习知识都在工作有所体现,刚工作的时候思考功能怎么实现,现在思考项目盈利点在哪里,市场怎么推广。人员怎么协调,技术难点在哪里,开发周期多久。

从现在看过去:术到道的一个过程而已,术的积累,才能到道这里,才能根据自身的环境,找出最优解。记得以前被一个技术总监面试,问我你的知识点怎么建立体系的,忘记当初我怎么回答的。

OD 快捷键

别人写的文章:

https://blog.csdn.net/yizhenweifeng/article/details/8518925

 

自己笔记:

ctrl – :回到上一个函数起始位置,如果你定位在函数中,那么就快速达到函数顶部,方便自己写注释和标注。

ctrl+: 同理

因为之前一直不认为上面ctrl 可以快速定函数起始位置和结束位置。

现在就有一个问题,一直找不到数据窗口切到Unicode 界面然后按-回到原来的位置,因为有选中,就变成修改数据了,不知道有什么好的方法没有

vc++ GetMessage 小知识

背景:

自己其实很少用到GetMessage,除了win32写窗口程序基本用不到,要么就用MFC去了,虽然老,但简单。

今天远程注入DLL,然后生成窗口,发现生成窗口会立马退出,后面发现自己没有写消息循环消息,但我发现我另外一个DLL 也没有写但可以正常运行。

 

过程:

于是google :

Type: HWND

A handle to the window whose messages are to be retrieved. The window must belong to the current thread.

简单说GetMessage  只能取当前线程的队列里面的消息。

我现在解析一下为什么2个DLL一个可以正常使用,另外一个不能正常使用,因为一个DLL 是被c# 程序直接加载运行,那么就是主线程中,因为c# 主线程有他自己消息循环,所以这个DLL就不用写了。另外一个DLL 是远程注入,那么单独一个线程,没有消息循环,所以必须自己写消息循环。。

 

结论:

只有现存代码才更好估计开发时间,不然很容易出现问题,导致自己开发时间拉长。

PC微信多开方案二

背景:

以前写了一篇文章有关PC微信多开的文章,那篇文章用的窗口hook 和释放句柄的方案,这种方案会导致全局多开,你只要打开我的程序,那么你点击微信的图标就可以无限多开。但我们开发产品的时候,一般会希望通过我们产品开一个。正好自己有这样子的需求,于是自己就有这篇文章。

思路:

采用新的方案: 远程DLL注入, HOOK CreateMutexW  替换 创建互斥体的名字(原来微信互斥体名字:_WeChat_App_Instance_Identity_Mutex_Name) 加上随机数字,你可以时间戳+随机数字。基本不会重复。

开发遇到问题:

1:  IAT HOOK 和 EAT HOOK的选择 (通过IDA和OD 分析发现直接调用,那么就是IAT HOOK)

2:没有现存IAT HOOK代码 ,GOOGLE  复制代码

3:CreateProcess 直接启动微信,IAT HOOK 发现没有任何效果(加日志,发现微信没有调用我的hook的CreateMutexW , 郁闷好久,思考HOOK时机不对,因为微信启动就会就调用CreateMutexW, 我启动再hook 没有保证在微信调用之前hook,于是CreateProcess 传入参数 直接挂起进程)

4:采用CreateProcess ,发现IAT HOOK挂起失败,快要奔溃了。 最后分析出2个问题,一个IAT HOOK的代码有问题,他hook的模块是GetModuleHandle(0); 他修改是主模块,不是自己想要的模块。于是改成GetModuleHandle(L”WeChatWin”); 感觉就要胜利,点击启动注入,妈蛋还是失败,感觉彻底绝望了。

5:想了好久不明白为什么?然后静下心来,仔细分析我挂起进程应该是WeChatWin都没有加载,所以我只能自己手动LoadLibrary(L”WeChatWin”); 然后hook就可以了。

 

结论:

虽然遇到很多问题,但只要思路是对的,总能找到合适解决方案。(这个方案我排除了窗口钩子,因为钩子导致每个窗口进程都加载DLL,虽然谈不上多么消耗性能,但感觉很怪,可能导致被别的程序提交上传到云端进行分析。。。)。

 

辅助功能开发—内存分配释放问题

背景:

开发辅助功能时候,我们构建call,肯定需要构建参数,有的参数堆上变量,不能用局部变量,因为下层的调用可能会释放变量崩溃。

判断标准:

在需要构建call的地方和返回的地方下断点,比对调用参数和调用之后是否有变化,如果值被失败修改空,或者明显已经用于别的数据用途,那么说明这块的内容被释放了,那么被释放肯定是堆上变量。(其实一般通过内地地址来看是不是栈也能知道是不是堆上的,但你不能知道是否需要手动释放,只能比对内存)。 如果实在不放心,先malloc ,你在call调用释放,如果释放不奔溃,那么就说明call需要手动释放内存,否则就不需要。因为malloc的地址,释放2次基本都会崩溃

作用:

防止内存泄露,如果这个call频繁调用,那么很快就内存堆积起来,留一个隐患在那里。

 

wetool产品分析

背景:

这个产品一年之前就开始关注了,这是一款微信辅助类工具,这家公司貌似做微信公众号数据分析类,貌似做挺大。开始的这个产品是完全免费,后面开发企业版本。开始的时候,官网只是一个IP(http://139.196.14.94/wetool/index.html),貌似现在还能访问。当初挺好奇他的盈利模式,貌似没有收费功能,只能靠打赏。我记得是通过百度搜索 “ 微信机器人” 找到这款产品, 记得一直都有做百度竞价,现在已经推出企业版本。

推广:

  1. 百度竞价
  2. 免费传播,吸引种子用户,然后用户自我传播
  3. 其他暂无发现

盈利模式:

  1. 引流:他们主营公众号上面,积累他自己流量。
  2. 打赏:应该不多
  3. 企业版本:砍掉一些功能,变成收费,然后启动云端服务,提供更全面的服务。

技术原理:

界面:QT

微信功能:PC hook, 针对 不同PC版本开发对应dll,方便管理和开发。

产品优势:

客服系统做挺好,企业版本貌似有云端整合,界面比一般的机器人做的漂亮,企业功能增强,付费点慢慢变多。

缺点:

  1. 防破解貌似没有怎么做,导致容易出现破解版本。
  2. 企业版本功能不过多,也没有细分行业。
  3. 产品细分不够,这个需要长时间打磨,公司也不一定会花那么多时间在这个上面,收益不一定大。
  4. 产品目前还只是工具层面。

 

有时间在补充一下,挺喜欢这个产品的。

teamviwer 远程写代码 替代品

背景:
自己有几台电脑,有的时候一个项目在另外一个电脑(或者另外一台电脑配置好一些),就需要远程写代码,以前一直用teamviewer,但最近都出现弹出商用,本来想购买发现实在太贵,自己用的又不是那么多。

替代方案:
用国产远程控制向日葵,我自己买了永久,大概花费3000的样子,买的精英版本,送了一个开机棒(只能连接有线才可以,唤醒),速度基本不卡顿。写代码还是非常流畅,传送文件也比较方便。免费的速度貌似不错,我担心和别人共享网络,所以购买收费版本。不想担心不稳定

自己动手方案:
这个最近用了一下Frp 内网穿透工具,其实就是数据转发,但还是需要自己一台外网服务器,家用宽带一般不会给你分配独立IP,所以自己买一个便宜的服务器,速度就看外网服务器与你家里延迟,本质跟向日葵差不多的。
自己配置转发一下3389端口就可以了,但一般非技术人员可能不会配置,觉得太麻烦,还不与用免费或者收费