博客

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端口就可以了,但一般非技术人员可能不会配置,觉得太麻烦,还不与用免费或者收费

c# 官方websocket ReceiveAsync 和 SendAsync 调用出现异常的问题总结

背景

最近在使用websocket客户端进行与服务器通信,以前开发一般使用http 轮询的方式实现与服务器任务系统 ,为了方便我就使用c# 自带的websocket,结果导致我花了不必要的时间在解决ReceiveAsync 与 SendAsync 导致的异常问题上面。

 

问题代码

public async void startRecv()
{
if (isLocalTest) return;

while (true)
{
try
{
string showInfo = "StartReceiving:" + Thread.CurrentThread.Name + " ----:" + Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(showInfo);

var array = new byte[4096];
var result = await mClientWebSocket.ReceiveAsync(new ArraySegment<byte>(array), CancellationToken.None);
if (mClientWebSocket.State == WebSocketState.Open)
{
if (result.MessageType == WebSocketMessageType.Text)
{
string msg = Encoding.UTF8.GetString(array, 0, result.Count);
Console.WriteLine("--> {0}", msg);
PacketFacotry.instance.process_packet(msg);
}
}

}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
Console.WriteLine(e.Message);
Console.WriteLine("websocket异常断开了");
//进行重连逻辑
ReConnect();
break;
}
}
}

在websocekt 连接就会调用该函数,那么就会一直接受数据,然后处理对应包,调用对应的逻辑处理,但问题我会在另外一个单独线程做有关的外部数据,一旦触发对应数据就会发送数据到websocket服务器上面,但是如果在高频率出发送数据到websocket就会触发异常 此 WebSocket 实例已存在一个未完成的“SendAsync”调用。可以同时调用 ReceiveAsync 和 SendAsync,但最多同时允许对每个请求执行一项待完成的操作。这个异常真的非常奇怪,感觉是一个很正常的逻辑,我在一个线程接收数据,然后可能在任何线程调用SendAsync,我根本就不应该关心是否完成操作,然后google了半天,基本没有太多有关系,看了很多老外说不能并行调用,意思就是ReceiveAsync 和 SendAsync 只能串行调用,这点要非常不能理解,我虽然其中在我后面通过SendAsync.wait() 来解决问题,但没法百分百保证他们2个是串行,因为有很多别的逻辑插入进来,所以最后换第三方库websocketsharp来解决问题

结论

不要使用c#自带的webscoekt,如果你的websocket是并行调用的话,我不想自己写代码来保证串行,这个应该库来保证,而不用开发者来保证