0%

概述

作业:将四选一数据选择器封装成IP,用以实现八选一数据选择器。

具体步骤

将项目封装成IP

打开要封装的项目,然后点击工具栏
Tools-Create and Package New IP-Next
打包当前项目即可(选择完Package your current project后一路Next)
(当然,这里也可以手动选择路径进行打包)
然后会出现Packaging Steps窗口
如果不想修改配置的话,可以直接选择最后一步,Review and Package-Package IP

在其他项目中导入

打开需要调用IP的项目,点击左侧
Flow Navigator-IP Catalog
在空白处右键,Add Repository,选择之前打包的文件夹
(如果之前打包的是项目的话,则对应.srcs文件夹,如D:\source\Vivado\mux_8_1\mux_8_1.srcs)
然后双击导入的IP,导入并生成
导入成功后,在Sources-IP Sources中可以看到IP
其中Instantiation Template即为实例化模板

实例化调用

最简单的方法,把实例化代码复制出来,修改一下实例名称以及参数即可
如:

1
2
3
4
5
6
7
8
9
mux_4_1_0 m2 (
.d1(d5), // input wire [1 : 0] d1
.d2(d6), // input wire [1 : 0] d2
.d3(d7), // input wire [1 : 0] d3
.d4(d8), // input wire [1 : 0] d4
.s1(s1), // input wire s1
.s0(s0), // input wire s0
.out(out2) // output wire [1 : 0] out
);

注意,实例化时,output只能是wire类型,不然语法错误

参考

vivado学习之自定义IP和调用自定义IP的步骤
Unknown Error during synthesis of AXI IPs

概述

从安卓7.0开始,Android更改了对用户安装证书的默认信任行为。应用程序默认只信任系统级别的CA证书。
所以需要hook第三方包的证书校验函数(如JustTrustMe)或者直接导入为系统证书以供抓包

导入方法

1. 导出.der证书文件

从抓包应用中导出即可。

2. 转换为pem格式并重命名

1
2
3
  openssl x509 -inform DER -in cacert.der -out cacert.pem
  openssl x509 -inform PEM -subject_hash_old -in cacert.pem |head -1
  mv cacert.pem <hash>.0

<hash>替换成输出的值

3. 导入至/system/etc/security/cacerts

挂载system为可读写

1
mount -o remount,rw /system

复制到/system/etc/security/cacerts下,并设置权限为644,然后重启
(也可打包成magisk模块刷入)

参考

安卓7.0及以上用户证书导入的问题

概述

使用开发者工具(F12)分析一个网站时发现:
每隔一段时间就会有js代码主动触发调试器断点,妨碍分析。
问之度娘,遂得解法。

解决方法

1. 使用控制台对方法进行nop

有两种情况,一种是直接调用debugger,如:

1
function _$gy(){debugger;}

那么控制台执行以下语句即可:

1
function _$gy(){}

另一种是匿名函数,代码如下:

1
(function() {var a = new Date(); debugger; return new Date() - a > 100;}())

需要查看调用栈,找到调用进行重定义。具体操作为:
双击调用栈中的主调函数,找到函数名,控制台进行nop。

2. 禁用所有断点

这个问题解决起来还是蛮简单的,问题解决只需要一句话:禁止断点。
而对应的操作是在Chrome控制台的Source Tab页点击Deactivate breakpoints按钮或者按下Ctrl + f8。

来自突破前端反调试–阻止页面不断debugger

参考

如何解决出现debugger无法调试
突破前端反调试–阻止页面不断debugger

概述

今天群里有人传了个apk文件,名字叫送给最好的TA。这是一个整人app,安装并打开会播放一段音频,并循环调节媒体音量,维持最大值。从后台划掉/卸载/关机都可以停止该程序。
网传所谓的截图、获取设备信息并上传等行为均不存在。反编译后看到的截图相关代码实际上并没有被调用,只是打包apk时封装进去的类,关键逻辑位于main.lua中。

阅读全文 »

概述

开发一个适配QQ 8.1.3的防撤回插件,并显示撤回通知。

原理

1. 防撤回

设置com.tencent.mobileqq.app.message.QQMessageFacade.a(ArrayList.class, boolean.class)方法的返回值为空即可

1
2
//在beforeHookedMethod中执行
param.setResult(null);

2. 获取必要信息

上一个方法的第一个参数(ArrayList)内容(toString)形如:

1
[RevokeMsgInfo[istroop= 1, shmsgseq= 356, frienduin= 1234568, fromuin= 12345678 msguid= 0, time= 1568796904, senduin= null, longmsgid= 0, longmsgcount=0 longmsgindex=0]

istroop为1时,frienduin是群号,否则为好友qq。

在某个版本后,toString的结果中frienduin被截断,所以解析字符串的方法行不通了。

可以通过反射来获取需要的字段值。

3. 显示撤回提示

这个功能的实现比较复杂,需要获取和生成一些类对象。

首先通过反射获取到QQAppInterface实例(QQMessageFacade的字段)
然后调用QQAppInterface.getCurrentAccountUin方法获取自己的qq
再通过反射将RevokeMsgInfo字段取出,为构造撤回提示做准备。
然后通过MessageRecordFactory构造MessageRecord
然后使用ArrayList将其打包。
最终调用com.tencent.mobileqq.app.message.QQMessageFacade.a(ArrayList.class, int.class)方法来显示撤回提示。

具体可以参考QQ净化的防撤回实现

4. 进行一些操作

过滤

判断是否为自己撤回的信息,如果是则不做处理。

获取群成员名

通过调用ContactUtils的函数来获得。

为什么要适配

因为QQ版本不同,有些类名经过了混淆。
适配的关键在于找出混淆后的类名。
可反编译dex后,根据特征(字符串、函数参数、类结构等)查找smali。

防撤回功能涉及以下两个被混淆的类:

1
2
String MessageRecordFactory = "avay";
String ContactUtils = "azcx";

参考

QQUnrecalled
QQPurify

概述

今天从Chrome迁移到了Microsoft Edge, based on Chromium
期间发现谷歌应用商店居然没有IDM拓展,只有Open With Internet Download Manager
而这个插件需要打native messaging host补丁,补丁不适用于Edge,于是自己研究了一下解决方法

解决方法:

修改配置文件,手动添加授权拓展

具体步骤

定位到注册表计算机\HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\com.microsoft.browsercore
项目值为C:\Program Files\Windows Security\BrowserCore\manifest.json
定位到该文件,修改文件权限后,在allowed_origins中添加:

1
"chrome-extension://epgilldoipfbdlneomlmegekaoonchcj/",

重启Edge即可正常调用IDM
PS: 需要手动修改下拓展设置,配置为本地IDM路径

参考

Open-in Native Client
Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging

注意

Word是可以直接使用LaTeX公式的,本文适用于已经使用LaTeX写好的论文。
方法:插入-公式-插入新公式,然后点击设计,选择LaTeX

概述

LaTeX公式直接复制到word的公式编辑中效果可能不太好,而且不太方便。
这里通过MathML作为中间格式进行转换。

具体步骤

文件转换(建议使用)

文件转换工具pandoc

该工具能把tex文件整体转换为docx文件,执行以下命令(homework自行替换)

1
pandoc homework.tex -o homework.docx

公式转换为MathML

以$\bar{x}$为例:

1
\bar{x}

latex、MathML在线互转

结果为

1
2
3
4
5
6
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
<mover>
<mi>x</mi>
<mo accent="true"></mo>
</mover>
</math>

使用MathJax转换

同样打开texmath demo
右键顶部的公式,Show Math As,选择MathML即可
结果为

1
2
3
4
5
6
7
8
<math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow class="MJX-TeXAtom-ORD">
<mover>
<mi>x</mi>
<mo stretchy="false">&#x00AF;<!-- ¯ --></mo>
</mover>
</mrow>
</math>

在word中以纯文本形式粘贴

enjoy it.

参考

公式图片转latex神器Mathpix以及latex公式与word公式的相互转换

概述

之前都是用VNote编辑LaTeX公式,看到网上有人使用VS Code来编辑,故也来折腾一下。

安装MikTex

MikTex官网下载,安装,然后以管理员身份运行MiKTeX Console(可以在开始菜单中搜索)
PS: 先不安装拓展包,等编译时自然会提示安装

阅读全文 »

概述

如果想要在so加载时就下断点的话,需要以调试模式运行,并使用ddms进行jdb的连接。

准备

一部打开了调试开关(ro.debuggable=1)的手机或可调试的apk, IDA及android_server, 已启动的ddms(启动AndroidSDK\tools\monitor.bat

具体步骤

1. 开启端口转发并启动android_server

1
2
adb forward tcp:12345 tcp:12345
adb shell su -c "/data/as"

这里使用的是修改过的android_server,默认端口为12345

2. 以调试模式启动app

1
adb shell am start -D -n xyz.sysorem.cokey/.CokeyActivity

这时手机会显示Waiting For Debugger

3. 使用IDA附加及下断点

点击确定前先修改Debug options,把Event下前三个Suspend都勾选上,然后连接。
选定要调试的app进程后,在模块列表中找到libart.so,并在目标函数位置下断点
然后点击运行

4. 使用jdb附加,使程序继续运行

1
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

此处的8700即ddms中显示的对应端口
正常情况下就会在libc.so处暂停了

5. dump

在OpenMemory断下时,按shift+F2,运行dump脚本

1
2
3
4
5
6
7
static main(void){
auto fp, dex_addr, end_addr;
fp = fopen("D:\\dump.dex", "wb");
end_addr = r0 + r1;
for ( dex_addr = r0; dex_addr < end_addr; dex_addr ++ )
fputc(Byte(dex_addr), fp);
}

参考

安卓 smali启动就附加调试 的正确步骤