博客

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是并行调用的话,我不想自己写代码来保证串行,这个应该库来保证,而不用开发者来保证

android脱壳记录

今天需要脱一个APP的壳,网上找了好多资料,发现脱壳这个东西还是比较复杂,如果完全自己弄,需要好多知识点。网上的教程,能不能拖也是看运气了,因为有版本不一样,效果也不一样。

 

参考资料:

https://www.jianshu.com/p/138c9de2c987

注意不要找错目录,开始因为我的不能脱壳,后面发现可以,注意脱壳可能多个dex,其中一个是360 dex,所以自己分析就知道了。通过这一点目前能脱应该是360免费用的加固,所以如果真的怕别人破解还是用收费的。

注意因为加固导致很多的application 被替换,所以注意全局替换,同时注意activity 里面有调用加了的com.stub.app(360的自己app类),所以要去掉,不然导致找不到这个method, 所以脱壳了还要不停的看报错日志,来分析什么情况,然后还要出自身APP的防御,所以破解感觉真是一个体力活。。。。

补充
后面发现Activity的OnCreate代码都被替换到so里面去了,我通过逻辑推测出来大概的逻辑,然后重写那部分逻辑,勉强能够运行达到我的目的,因为一般代码都会封装到函数里面去,所以自己也可以大概猜测出他的行文,一些第三方so的初始化,自己百度一下资料然后下载demo,然后自己去猜测实现就可以了,但不一定百分百可行,毕竟代码不可控制。

android 报毒解决思路

背景:

开发一些android程序如果出现报毒,怎么处理?(或多或少可能接触到)

原理:

通过报毒软件核心思路,无非是抓取特征值和行为分析,但这个android里面基本没有太多行为分析,因为杀毒软件没有具备这样的能力,每个anroid都是沙箱,每个都是隔离所以无法分析其中行为。所以基本都是分析特征值。

 

特征值:

1:AndroidManifest.xml(这个是重点哦)

2:实际代码模块

3:资源文件

处理:

因为APK可以通过代码模块进行加固,那么代码模块和资源文件其实无法获取特征值,那么通过加固就可以解决过掉2,3点,那么AndroidManifest.xml 怎么过呢?因为xml报毒无非就是字符串特征值,杀毒引擎无法提取关键字作为评判的标准,所以我们只要修改server或者activity的名字,达到过滤的规则即可,但记住修改名字不要在原来名字直接加字符,因为他们查找关键字可能只是strstr()而已,那么包含也是报毒的。
所以我一直觉得android杀毒软件其实没有太多作用,现在android 系统自身防止软件后台运行做的很好了,如果一个新的所谓的病毒运行在你的手机,你只要一键清理(每个有给开机启动或者给APP加锁的功能,基本病毒APP就不能运行,所以现在的杀毒软件干的就是清理垃圾和拦截通知等弱鸡功能而已),自己多多练练手就可以了。

资源报毒:

常见就是图片,通过图片Md5修改工具,进行批量的修改即可。

 

自动解决报毒方案思路:

xml动态自己随机名字,后台定时打各种APK,用户下载时候随机下载一个包即可,这样子主要代码要跑起来的话,需要具备一定语法的替换,容易出现替换错误的情况。

WebSocket资料整理

背景:

最近服务器与客户端交互要有任务系统,以前总喜欢用轮询,但这种含有太多的多余的HTPP字段,同时要反复的建立连接,对应性能来说肯定不是最优。如果开始研究websocket,整理一下资料,对于协议没有太多的说,就是规则,按照规则实现而已,我们用别人现在的库开发就可以了,原理了解一下就可以了。websocket对于我最大的好处就是不用自己切包,简单的就直接用json包起来就可以了,根本不用考虑大小字节。

 

整理:

https://zh.wikipedia.org/wiki/WebSocket(维基百科)

 

python库:websockets 里面有client和服务器例子

https://websockets.readthedocs.io/en/stable/intro.html

 

后面再补充,只是为了先占位,以后要多写文章,养成一个好的习惯。

服务器处理客户端上换行切割兼容性问题

背景:

用户可以上传文本,里面含有多条数据,每行一条数据。服务器解析数据然后处理数据。

问题;

windows 上传文件正常,mac电脑上传出现切割错误。

原因:

换行在windows 和 linux 和 mac 不统一

windows :\r\n  linux :\n   mac: 系统9之前是 \r  后面是\n

  同事说直接用

PHP  explode(EOL, XXXX) 进行对windows 用户上传切割会出现空格,所以改用explode(“\r\n”, xxxxx),这样子在windows 上传的用户确实没有问题,但mac 的是\n 那么就不会切割。我自己百度一下网上说处理换行要用explode(EOL, XXXX),如果你只是在自己电脑上测试,肯定没有问题,因为EOL对应是你自己电脑的换行,所以就没有问题。但我们放到服务器上面我们就要处理各种用户了。

解决方案:(前提是你的服务器是linux 以\n ,别的同理解决)

1: 如果含有\n 直接就把 \r 替换””.

2:如果不\n那么说明就是mac 9 以前的系统的用户,直接把\r 换成\n。

3:然后按照 explode(“\n”, xxxxx) 切割

 

 

闪电盒子产品分析

我很早之前就想有关互联网的产品,分析他们产品的怎么运作,怎么吸引用户,怎么盈利,技术核心点等等,但总因为各种事情停下来去写,这点确实还改正,如果每天抽取一点时间去学习新的东西,应该进步很大,以前不喜欢写博客,现在稍微好了一点,主要自己小时候语文太差了。

闪电盒子:

一个可以双开的软件,作者是以前droidplugin(android)开源的作者,这个产品核心技术也是droidplugin框架,后面就没有更新维护,不过核心代码分享出来也是非常不错了,当初也花了一段时间去学习。市面上双开软件很多,连无限多开都有,所以这点并不是该成品的优势。他们以红包方式,使用它的软件,企图用户只有他们系统的软件,尽可能不用系统的APP,这样子就可以长期霸占用户使用时间,然后通过流量变现,前期大量渠道推广。目前里面各种棋牌和交友类的广告,通过插入到新闻页面引流和程序启动APP。

用户人群:开始因为我被他们产品点子惊呆了,感觉他们希望在系统上再做一个系统,后面慢慢发现,他们只是通过红包去留住的用户的一个变种(跟做任务领取红包的升级版,你使用APP也是得红包),这样子导致他们用户群里是一些贪小便宜的一些用户,那么群体没有那么大,虽然他们说可以省电,但感觉这个点没有太大作用,因为现在的系统省电已经的足够好,我还提出过,要他们做一个vxp(一个可以在非ROOT使用 XPOSED 插件的功能,xposed 有很多微信和QQ的插件),那么可以对很多APP做很大的定制,这样子就是完成系统里面做子系统的意义,那么用户群里大了很多,你们要知道。微信的一键转发一年能卖多少钱(貌似几个亿)。。

流量:渠道花钱推广, 用户裂变(邀请好友,得奖励)。

变现:广告

有点:用一样的产品,但可以领取红包,留住用户。

缺点:产品竞争力不强,很容易模仿,因为技术大家都有。不能够成为一个平台,赚钱可以,但做大,做强很难,需要更多功能去吸引用户,不光靠红包。而且这套技术在后面android 版本兼容性堪忧,android 已经对这些HOOK技术做反HOOK,在别人平台活着,就看google爸爸心情了。。。

 

tip: 图片就不贴了,懒


最近发现大量这样的产品(多开+xposed技术,这个开源的人weisu,貌似现在也在靠这个创业,毕竟用户量被他做起来),有的是微商在卖,直接结合微信的一键转发在卖,别人也做到月活200W,然后应用商店好多这样的产品好多是免费的(X分身,比翼多开,貌似360也有一个这个版本的多开),他们都靠广告赚钱,也有会员(只能去广告)。但貌似看月活也是很恐怖。。。。