客户端网页集成工具

解决问题

我们经常需要很多网页工具,比喻JSON解析,或者HTML 压缩等等,我们每次都需要打开浏览器,那么我直接有一个工具可以添加各种网页,方便我们添加,可以自定义大小

需求

  • 自定义添加网页
  • 可以自定义大小
  • 支持快捷键
  • 支持默认排序

技术方案

直接用electron就可以了,配置存取直接写文件都可以,因为简单

android DexClassLoader 加载失败

背景

自己最近想写一个APP,内部实现考虑兼容性问题,我想使用动态加载,一些核心变化的代码从服务器动态加载,这样子就不用每次都要更新APP。

动态加载

DexClassLoader: 我百度一下,基本规则是jar包通过dx处理一下,然后放在手机的sdcard里面,前提一定要给文件读写权限。

问题

我基本按照网上规则写的,但发现加载失败,我的测试手机是小米10 android 10,总是提示原始dex找不到。但文件确实存在,而且文件权限给了而且文件确实存在。

过程

  • 直接用跑模拟器 android 6 的版本上,确实可以跑起来,这说明肯定是android版本的问题,也可能跟miui的版本加强权限管理。
  • 大概解压的dex必须放在APP 自己目录,不能给外部路径,这样子为了安全问题,确实,如果dex被改成外部,就可以有权限访问内部数据。毕竟注入到代码里面去了。
  • 那么我猜测可能是加载jar路径可能也要放在APP内部,果然可以了。我放在asserts目录
  • 我猜测原因,磁盘的文件无法写入APP内部目录,因为我之前也试过/sdcard/复制到APP内部,但加载也会失败了。

node js 调用dll 方案

最近准备用node js 写一个项目,所以需要对方案进行调研,项目会用到c的dll,通过网上查资料发现基本2种方案:1:ffi 2:addon

ffi 方案

这个方案我经过一天测试,发现这个方案不行,我建议直接放弃,第一个问题安装ffi 编译不通过,通过大量资料查询因为他不支持node 12 ,我通过使用别人ffi-napi 解决这个问题,然后遇到字符串问题,以前的接口默认是wchar_t * ,发现无论使用ref-wchar_t-napi 都无法使用宽直接,后面实在没有办法,我直接转换dll的接口改成utf-8进行传递,来解决字符串问题。最恐怖我发现ffi这个方案内存泄漏实在恐怖了,我防止是我自己API的问题,我直接调用系统的API,发现如果调用很频繁会导致内存泄漏,这点我完全无法接受,因为我的程序需要长期后台运行,那么内存问题是一个恐怖的问题

ffi测试代码

k = ffi.Library("Kernel32", {
  'OutputDebugStringA': ['void', ['string']],
});


var sleep = require('sleep');
for(var i = 0 ; i < 10000; i++){
  var r = k.OutputDebugStringA('' + i);
  r = null;
}

//等待100秒,观察内存是否释放,时间可以设置更长
sleep.sleep(100);

我自己观察内存一直私有内存一直增加,循环跑完也没有回收,那么说明ffi 有内存泄漏

addon

这个用起来挺简单,本质在windows就是一个DLL,通过工具生成一个动态库工程,然后直接按照例子写代码就可以了,也方便自己写代码,这里面有几种,我目前建议采用napi这种,这种就是没有v8版本,导致编译的问题,上面ffi编译的问题就是这个原因。

使用过程:

  • 百度一个addon教程
  • 找到nodejs 官方例子,直接按照例子写就可以 https://github.com/nodejs/node-addon-examples
  • 直接跑就可以(node32 才能加载win32 dll 不然会报错),上一个方案时候就出现加载问题,目前我用node32 12的版本

备注

nodejs 开发代码确实方便很多,但从一个技术方案迁移到另外一个技术方案,成本还真不少。ffi 内存泄漏,这个就不用考虑,ffi本质也是addon技术实现,这种中间件,但网上貌似都没有遇到这个问题一样,我直接测试好几个例子都会内存泄漏。ffi可以不用自己开发一个dll来做桥梁,addon需要自己单独写一个新的dll来调用原来的dll。

PE加载器,DLL内存加载器

背景

我最近研究了DLL内存加载,网上找了好久代码,基本的原理差不多,自己稍微总结一下。

逻辑

  • 内存读取PE,按照PE格式进行加载(任何一本介绍PE的书籍都可以看有关知识)
  • 修复重定位表(这点非常重要,我开始不明白他怎么修复定位表)
  • 修复定位表
  • 其他细节(tls回调,修改PEB)
  • 调用入口启动

疑惑

1:怎么执行代码?

我们创建内存,然后复制PE到内存中,然后直接调用,但一些变量地址或者函数地址是以va(虚拟地址)直接访问,这些地址固定死的,但加载内存时候,基本不可能是原来的基地址,那么这些地址就是错误地址。那么这些地址要被修改,所以正常加载DLL或者EXE(正常启动EXE基本地址不会变化),如果模块的基地址变化都需要修改地址不然会崩溃。那重定位表记录原来硬编码的地址,我们遍历所有地址修复就修改掉。

2;兼容性

因为毕竟是我们人工模拟加载,那么可能缺失很多环境,导致异常。程序异常退出,这种只能通过OD动态调试分析,然后结合进程,线程有关知识来进行分析。最快就拿别人开源代码跑,因为这种都是经验,如果对这块没有研究,突然去研究感觉有点懵。

代码

1:一份简单代码

2:一份比较稳定,代码非常漂亮

https://github.com/polycone/pe-loader

可以加载MFC,代码优美,多了PEB修复,TLS回调等,只能启动标准的PE,不支持c#.可以正常启动酷我。酷狗启动不了,网易云音乐可以,QQ可以启动但看进程明显自动创建进程来实现。PC微信可以。整体看稳定系还是非常高,而且如果我们自己用,被启动程序我们也可以改,来适配稳定系。

加载DLL

加载DLL比EXE简单一些,不用修复PEB,我暂时没有测试DLL,但应该差不多。

作用

这个看每个人用途,这个技术和android插件技术类似,android多开就是插件技术,稳定性就要看模拟的程度了,这样子技术需要大量的用户测试反馈来排除一些坑。

备注

1:我本想顺着分析loadlibray,发现对于我非内核开发或者非专门逆向分析来说有点难,这种需要经验分析,有一些书籍有涉及,但比较少。

2:大量这几天查看和阅读大量知道PE加载器的核心知识点。

3:找相关代码 google : pe loader github 就可以找到很多代码。

网址爆红怎么恢复

自己以前买了一个域名,后来各种原因360和qq报红,我后来就没有用那个网址了,直接放在那里,自己想重新拿来用。于是我直接qq和360申请,竟然直接通过了,看来也没有网上说那么难,需要交钱才可以恢复。

网址情况说明

我那个网址放了2年,基本什么内容都没有指,直接申请,内容就是简单正常网站,没有任何违规内容。

inno setup 卸载程序报毒

我从网上下载了一个汉化版本,发现安装包安装后卸载程序会报毒,不知道为什么,于是我直接找到inno setup官网下载重新打包就不会报毒了.

中文包问题

下载官网版本不带中文简体,那么从官网下载语言包,然后放在目录,同时脚本也要指向这个语言包

语言包下载地址(百度网盘;提取码5wcp),因为官网有的时候打不开,你下载直接放在C:\Program Files (x86)\Inno Setup 6\Languages的目录

脚本填写下面即可,上面是我安装目录,你自己对应修改即可

[Languages]
Name: "ChineseSimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl"

vps与云主机的区别

背景

自己一直用阿里云ECS,认为就是一台可以远程的连接的电脑,但后面接触到网站,挂机宝,发现价格区别很大,所以对vps与云主机区别不是很清楚。

区别

VPS: 一台真正电脑虚拟多台电脑,跟我们自己装虚拟机差不多,只是他们更加系统化,可以整体管理。那么其实所有资源都是共享这台的电脑,那么这台真正的物理电脑宕机,那么所有虚拟电脑都挂了,比喻8G的内存,用户买的2G,那么我卖4个,但一般有超卖。所以你购买他们产品都是有剩余个数,别人买了一个坑, 那么就少了一个坑。

云主机:整合各种资源,CPU,硬盘,内存,集成在一起,你可以理解多台电脑,为一群人服务,每个人资源通过前面你购买进行分配。VPS是一对多,云主机是多对多,这样子好处非常方便扩容,而且更加稳定,能更加合理利用资源。基本公司用都是云主机,个人挂软件和博客可能用vps偏多。

总结

上面只是自己肤浅理解,但大概差不多这个意思,vps由于共享IP,IP可能被污染,比喻登录微信,那么可能这个IP挂了很多微信,你登录微信软件,可能就出现异常之类。云主机我们可以单独买IP地址,vps 没有看到这个买IP地址这个说法。vps价格要比云主机价格便宜很多,如果挂软件选择vps,如果希望更加稳定的话,我觉得云主机更好。

小米游戏本fps太低

背景:

在自己小米游戏下载了LOL,结果在玩游戏发现很卡,我发现FPS只有60,然后再也涨不上去。

解决方案:

自己往上google好久,汇总网上方案:

1:一定要插电源玩

2:显卡软件设置设置LOL�0�2高性能

3:电源设置高性能

结果:

我再去测试发现LOL FPS稳定130多,一点都感觉不到卡的情况

原因:

默认是自动选择方案,用的集成显卡导致FPS太低

开发跨语言传递数据方案(c++/c#接口调用)

背景:

我们经常开发会遇到一个语言与另外一个语言进行数据传递,比喻c# 写界面,c++ 写底层,那么业务复杂的话,肯定会进行交互,这样子就会遇到传递数据的问题。

解决方案:

跨语言最好选择统一格式,那么选择字符串传递是最简单的,那么我们能够顺利选择JSON。因为JSON知识字符串的一种格式而已,选择XML也可以。只是XML会稍微浪费空间,感觉没有JSON接近语言。我还记得我第一次去深圳的一家公司,c++写底层,界面用ie控件描述,2个语言就很好的用json传递数据就可以了,这样子公司的所有界面只要前端开发适配一下就可以了,那时候貌似没有直接用js 来写界面的框架。

可能遇到问题:

传递二进制数据,因为JSON是不能支持二进制数据或者unicode一些编码导致数错乱,这个时候我们就需要用到base64进行编码来解决这个问题。

总结:

虽然C++与c#接口调用可以申明去定义,但由于太多细节在里面,如果换一个语言可能就又重新写代码,用Json传递,c++定义接口只要定义普通的wchar 或者char 就可以了,不要涉及到2个语言差异。