博客

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

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就不能运行,所以现在的杀毒软件干的就是清理垃圾和拦截通知等弱鸡功能而已),自己多多练练手就可以了。

 

自动解决报毒方案思路:

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) 切割