duangsuse::Echo
412 subscribers
3.85K photos
105 videos
574 files
5.15K links
duangsuse技术相干订阅
这是 @duangsuse 与技术有关的发布频道
duangsuse 的另外有 throws 闲杂频道
@dsuset
转载频道 @dsusep
duangsuse 有coding,github,gitlab帐号和bilibili帐号

极小可能会有批评zf的消息 如有不适可以退出

suse的小站:https://piped.stream
ps 另有别名 popf.rip
ʕ•̀ω•́ʔ✧ 🐶🍎🏠生死🐜
(>ω<)岂因祸福避趋之 一鿕
Download Telegram
https://github.com/itorr/q.js

#aop #project #frontend #recommended JS 路由器模式框架
路由... 总之就是和 HTTP 服务框架们为你做的差不多,路由框架允许你动态注册「路径」并且绑定在用户「到达」路径后执行的函数

这个框架可以允许你「以 JavaScript 在本地处理对这个文档里子(路径/fragment)访问」。比如 application.html#!home app.html#comment.01
duangsuse::Echo
可惜没有绘制成图表 plot 好看一些 🤔 r.size #=> 187 一共统计了 187 条消息。 r.sort_by { |it| it['published'] }.first['published'] => 2019-03-24 11:22:00 +0800 第一条消息是 2019-03-24 11:22 发送的 r.sort_by { |it| it['published'] }.last['published'] => 2019-04-05 20:06:00 +0800 最后一条消息是…
😃 那么,简而言之,我觉得有价值的信息:

def get_link(h); "https://t.me/dsuse/#{h['debug']['no'] + 9511 + 20}"; end

+ 一共统计了 187 条消息。

2019-03-24 11:22 - 2019-04-05 20:06,一共两个星期的时间里,本频道 @dsuse

+ 有 #Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签
+ 含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签
+ 链接和 Tag 都有的消息有 17 条,占总消息的 9%

map { |h| [h['body'].size, h] }.sort_by { |it| it.first }.reverse
map { |h| [h['body'].size, h] }.sort_by { |it| it.first }.reverse.first[1]['links'].size

+ 187 条消息里,最长的消息是这条,它有 4475 个字 — 连链接都有 25 条! 🤪
+ 187 条消息里,折行最多的消息是这条,它有 4232 个字和 7 条链接。

sum { |it| it['body'].size } / size
+ duangsuse 的平均字数:359 字 / 消息

sum { |it| it['body'].lines.size } / size
+ duangsuse 的平均行数:11 行 / 消息

find_all { |it| it['header_type'] == 'REPLY' }.size
+ 过去的 187 条消息里,有 70 条都是回复,占总量 37%

find_all { |it| it['header_type'] == 'FORWARDED' }.size
+ 过去的 187 条消息里,有 45 是转发自其他频道或个人的,占总量 24%
当然,这 70 条都是回复本频道消息的。

a.uniq.map { |u| [u, a.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" }
+ 转发者和条数表如下:

IT 那点事 (YuutaW 鱼塔): 10
羽毛的小白板: 10
duangsuse Throws: 6
Rachel 碎碎念 (IFTTT): 5
Rachel 的消息发布站点 (Rachel Miracle.) via @like: 3
YSC 的频道: 2
duangsuse ¯\_(ツ)_/¯ |学渣 | 我爱学习 | ∈ [E²PROM, 范畴论]: 2
Doge: 2
YuutaW 鱼塔: 2
Rachel 碎碎念 (湘江一桥): 2
DogeSpeed广播: 1

😄 @haneko_daily 被转发的次数最多,继续努力!

sort_by { |it| it['hashtags'].size }.reverse
+ 具有最多标签的消息是这条,它有足足 8 条标签!

sort_by { |it| it['links'].size }.reverse.first
+ 具有最多链接的消息是这条,它有 25 条链接!同时也是字数最多的消息!

find_all { |it| it['header_type'] == 'A_PHOTO' }.size
过去 187 条消息里,一共有 29 条广播是单纯的一个照片 🖼
find_all { |it| it['header_type'] == 'A_ALBUM' }.size
过去 187 条消息里,一共有 5 条广播是照片集 📸
find_all { |it| it['header_type'] == 'IS_STICKER' }.size
可爱 🐱 的 duangsuse 在过去 187 条消息里使用了 28 个 sticker 抒发自己的感情,使用的表情这么多:
find_all { |it| it['header_type'] == 'IS_STICKER' }.collect { |it| it['ext'] }.yield_self { |r| r.uniq.map { |u| [u, r.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" } }

😔: 7
😳: 4
😲: 3
😡: 2
😑: 2
🙄: 2
😋: 2
😀: 2
😥: 2
🍹: 1
😐: 1

find_all { |it| it['header_type'] == 'HAS_FILE' }.size
duangsuse 在过去 187 条消息里发了 8 个文件,它们是:
find_all { |it| it['header_type'] == 'HAS_FILE' }.collect { |it| it['ext'] }
["axml.rb", "AndroidManifest.xml", "AndroidManifest.xml", "TextSort.kt", "RandomPicture.kt", "Vibrator.svg", "Vibrator.png", "Vibrator.svg"]

最火的
hashtags 组合:

collect { |it| it['hashtags'] }.yield_self { |r| r.uniq.map { |u| [u, r.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" } }

结果太长,在这里查看

所有 Hashtags:
hs = s.flatten.find_all { |it| it.is_a? Array }.flatten.map { |s| s.tr(" ", "") }
"#" + hs.uniq.join(' #')

#Android #zhihu #KDE #Low #Haha #life #tech #tencent #WeChat #weibo #share #tools #dev #Markups #Telegram #Hack #aop #Huawei #通知 #Freedom #sysadmin #GitHub #travis #CI #Sysadmin #Linux #Coolapk #Web #frontend #HTML #China #school #Microsoft #Life #VisualStudio #-} #OOP #web #geekapk #doge #CS #fix #CSharp #School #blog #recommended #bin #backend #Kotlin #Java #Share #svg #blogPOst #PL #JVM #Moha #code #ALgotithm #DuangsuseSB #GeekApk #SQL #Learn #wiki #Mozilla #ES6 #JavaScript #MoHa #Paper #haha #dotnet #bad #OOP_Delegates #Parallelism #dotNet #Csharp #Windows #performance #Channel #weekly #linux #Ruby #Project

以及他们的消息覆盖个数:
hs.yield_self { |r| r.uniq.map { |u| [u, r.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" } }

太长,这里看

== 非线性查询(当然和算法上那个没有关系啦,就是复杂一点的查询)

// 收集所有单 / 双数索引

ar = []; ar2 = []

i = 0 // 0 2 4 6
while i < self.size; ar << self[i]; i += 2; end
i = 1 // 1 3 5 7
while i < self.size; ar << self[i]; i += 2; end


aa = ar.zip(ar2)

我们将比较相邻两消息之间的关系。

aa.zip(aa.map { |ms| ms.last['published'] - ms.first['published'] }).sort_by { |p| p.last }.reverse

间隔最长的两条消息是这条这条,间隔 44880 秒(12 小时)

b.map { |h| [h.last, h.first.first['body'].size ] }.map { |a| a.last / a.first }.select { |it| not it.nan? and not it.infinite? }.sort.reverse

平均打字速度:7 字 / 秒 🤔

受到解析度(只到分钟)和浮点运算准确度的影响,有很多消息都是在间隔一分钟内发完的,统计结果可能不正确。

好啦,还有什么别的信息,请大家自己来发掘呗( 😝 比如说,我熬夜发过多少消息。
#zhihu 已经受到影响了,真是智障 #web #frontend #aop
#aop #security #recommended #DontKnow #Android 哇,之前早有闻大名的面向侧面编程 #reveng 框架 Frida (frida.re) 竟然这么能干,看来是我大意了,没注意示例😱
https://forum.90sec.com/t/topic/95

“Inject your own scripts into black box processes. Hook any function, spy on crypto APIs or trace private application code, no source code needed. Edit, hit save, and instantly see the results”
方便力,想到以前动态 inspect 执行情况和 Object 的 AndBug debugger ,Frida 的能力更有意思啊,同样能做函数断点
🧐收集各种开放性动态(frida,jdwp,oat_dexdump)、静态(r2,apktool,jad,smalivm)逆向工具,也挺多啊g
https://t.me/vvb2060Channel/416 #Android #Security #aop
asm inline hook 当然是任意点都可以,实际上 frida 配 xposed 开发是真好吧🤔
/proc/self 都可以 mount --bind ,但是改动是系统级的。 通常做法就是由框架来实现访问权共享,像 Riru 一样换一个 preload .so 来实现 hook

我觉得应用层开发者尝试对抗系统动态分析是很愚蠢的行为,毕竟你又不是搞安全的,凭 Proguard 组搞出来的东西你能做到什么地步,你们领域就那个水准,会设计模式和元编程的都凤毛麟角。

现在的 Internet 和 programming 定义都变了,网络人不会用文件共享不会各种基础服务,编程界早就不是以前各种不跨 CPU 的花指令、代码加壳(当然这个对 ART 运行时基本没用了 在 debugger 时代也是 memdump 了事的屑问题)、内嵌虚拟机(那么大的游戏牺牲玩家体验都不能保证不被逆向)。

你要真没武德就去写 C++ 啊,非常完美,全 static inline 并 strip 掉符号就能自动屏蔽掉一大堆魔改。
反正再怎么弄都不是问题的完整解决,加壳本质上还是二进制格式+密码学问题,不是编译原理问题。
对「代码保护」武德比这低的人有的是,譬如私有数据加密算法和 lua 等脚本引擎指令编号重排等,但同样会编程懂二进制和密钥编码的人一眼就能看出来,运行时能 bypass 的东西很多。

理论上最关键的领域还是 CE,可惜编译原理的人最清楚,即便真的做了,自动分析也能搞出来,而且这本身就是很无聊的事情吧。
#reveng #dev 谈点关于 #aop 的吧,虽然因为和运行时 intrinsics (内部构造) 关系大我只能说说而已。
AOP 即面向侧面(aspect)编程,和 apktool&apksign 「改包」以及 八门神器/烧饼的「修改器」不是一个概念,它往往意味着纯运行期的外部代码扩展(偶尔并不是外部代码 如 AspectJ BECL CGLib 式 reflect Proxy 系扩充),常见于幸运破解器类「系统级纂改」
这个东西很有用吗?是挺有用的。比如睡觉这个是不定时间数的动作,但具体地,洗洗睡是头、上床睡是尾,一般 AOP  概念向程序员暴露 op: before&after = 1:1 的 hook API ,实际 res = after(op(...before(args))) ,例如有个 getList() = [1,2,3] 那 after=res.filter{it>1} 就会隐藏部分结果,小米的安全通讯录就是个可定性(意味着编程者的复用性和 persistence 数据持续化)过低的例子。
其实摄像头、GPS位置、电量什么的通通可以篡改,不过正经人从来不会意识到这个层面的可扩充性,即便它们很有用;例如,如果应用用自己内部的相机 readFrame&draw surface 的话,想实现原有「选照片」的功能就得覆盖摄像帧,如果要在只能录音的 app 里上传音频文件(准确的说只是实时发声),必须覆盖听筒回传音块(当然这些也会涉及自动 input)

如果应用了加壳混淆或反逆向复杂化重构 aop 依然有效吗?当然,因为它和 搜索堆栈、锁定地址的「修改器」一样是系统级篡改的方法,至少能影响基础框架 API ,把程序和运行时部分剥离。
C++ 等没有函数起止符号的情况能用吗?部分可以,如果能重建部分符号会好些。

如果混淆器能内联函数可以吗?很多 AOP 框架都不支持修改子程序的「一部分」。其实,aop 针对的『子程序』是指一段有输入输出变量的代码区间,变量可能在堆上或栈上,理论上补齐 code span 和 input/output 的存储位置标记,利用部分反汇编就可以照常 aop,但是没人实现,软件工程界大概就是这样(对「数据操纵的关联化设计」我还是最符 0xd4d/dnSpy 可惜不维护了)。

其实 aop 的用途远远不止插件、用户脚本那么少,就像带条件断点,如果能支持 变量打表、回溯执行、数据可视化、审视调用栈和指令指针 之类的操作,分析上也会变得非常有用呢。如果能针对执行状态区别化 aop ,哪怕只能在 bytecode (或汇编) 级进行检查,只断点一类指令都能实现很多干预。
MAT / IFW 禁用方案分享:
导致星巴克崩溃无报错的S服务
此服务似乎来自梆梆安全加固企业版 com.secneo.apkwrapper.r.S
胡乱分析了一下,这个 S 服务会访问 int com.secneo.apkwrapper.H.o(Context) 静态方法,这个静态本地方法,当本地库返回值小于等于 0 时会直接调用 System.exit(0); 所以也没有错误日志出现。
本地库为 libDexHelper.so / libDexHelper-x86.so

#reveng 🌚为了帮助大佬(如 GetDex)们秀memdump和art插件等 #aop 基本操作啊

>我一直想加固到底有什么用呢?
它不也是防君子不防小人的东西吗?甚至于所有字节码如果想让系统运行的话,那系统一定要可以识别这个字节码。
那如果一个系统本身在加载字节码的地方提取了一份,当搜索已加载代码中的引用,来不停的请求 loadClass 之类,那么加固外壳的解密功能完全不可能拒绝系统的这种请求。最终依然会被探索出被加密代码的解密字节码(


稍微有点 #bin#assembly 常识也不会相信这些吧,难道不是不理解struct才相信二进制和mem不可读?
掌握程序=听天由命,掌握解释=掌控程序 🌚

我对IT交流的科普力是失望的,代码写得🌸时非常开心,一谈到低层抽象都有武德了,就会用个序列化/反编译工具;当初万能汇编器的时代去哪了
#aop duangsuse:
关于算法、图形、数据结构、os调度、 数据集UI的? 🤔
问GPT呗,它解决能力还好

你说的是AOP函数替换吧 ,参数注入应该反射就OK,java级都可以做,JNI更像调用cpp的纯FFI一些 没有黑魔法

你是想用new Proxy(obj, {fun/getters,}) 来替换obj.xx() 吧?
没想到JNI还提供了非final实例方法的覆盖🤯
原来xposed是靠方法转native来劫持调用哎

如果构造器<init> 能劫持,或许能返回个 Proxy? 它可以修改final (哦对,构造器是单参0返的)

Rachel 碎碎念:
Xposed 我也不是很确定,只是看到了一篇 Dalvik 下劫持方法为 native 调用的原理文章提了一下,然后也在 LSPlant 下面有非常经典的 YAHFA,之类的

GPT:
Xposed、Riru 和 Cydia 都是针对 #Android 和 iOS 系统的插件框架,它们可以让开发者在不修改系统源代码的情况下,通过编写插件来修改系统行为
Riru 的原理是通过注入共享库来实现,它可以 Hook 系统的 C 函数,从而实现修改系统行为的目的。Riru 不需要 Root 权限,但它需要在Magisk中安装 Riru Core

Cydia 可以在非越狱iOS上运行,但也有安卓 Cydia Substrate 框架。

Frida 的原理是通过注入 JavaScript 代码来实现 Hook 应用程序的函数,从而实现修改应用程序行为,它易于使用和开发但需要在设备上安装 Frida Server

Magisk 提供了在无需修改系统文件的情况下更改/system或/vendor分区内容的 overlayFS
Forwarded from duangsuse
#aop 对了,能调用 f.invoke() 的语境下是如何篡改或劫持 f 的?

之前不是说(修改class定义)加native 能劫持,那删final 应该做得到?
>用Proxy 实现 po(out, arg->{err.print(arg[0])} ).println("str") 输出两次

#kt #code
import java.lang.reflect.*

inline fun<reified T> po(it:T, crossinline call:Method.(Array<*>)->Any?): T =
Proxy.newProxyInstance( // 创建一个代理对象,实现了PrintStream接口
T::class.java.classLoader, // 类加载器
arrayOf(*T::class.java.interfaces), // 代理接口
InvocationHandler { proxy, method, args ->
call(method, args) ?: method.invoke(it, *args)
}
) as T

po(System.out, { System.err.print(it) }).appendln("str")

但好像编译器有bug,而且 CGLIB,ASM或者Javassist 才能代理类
ByteBuddyAgent.install();
new ByteBuddy()
.redefine(T=Scanner.class) //或再加subclass
.method(ElementMatchers.named("nextLine"))
.intercept(FixedValue.value("Hello World!")/*MethodDelegation.to*/)
//或这样加首尾代码 .visit(Advice.to(GetArgs.class).on(match)
.make().load(T.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()).getLoaded();

class MyAdvice {
@Advice.OnMethodEnter static void onEnter(@Advice.AllArguments Object[] args)