duangsuse::Echo
583 subscribers
4.12K photos
118 videos
579 files
6.13K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
#dev #Android #backend 刚才看到 Pink 酱的一篇文章《如何在Android FC(Force Close)之前抢救下》,正好也照应了我在 pygame 实践里对 message loop 的认知,给总结下:

Android程序默认:
void main(String... args) {
Looper.prepare();
initMessageQueue();
Looper.loop();
throw new RuntimeException("fatal");
}

可以设置捕获器:
Thread.setDefaultUncaughtExceptionHandler(new _Handler { void uncaughtException(Thread t, Throwable e) {}; });
在里面可以选择重启: ctx.startActivity(new Intent(ctx, _Activity.class).addFlags(Intent.NEW_TASK,Intent.CLEAR_TASK));
也可以用 Cockroach 式:
Thread.defaultUncaughtExceptionHandler = { t, e ->
logError(e)
while (true) {
try { restartActivity() }
catch (Exception e1) { logError(e1) }
}
}
fun logError(e: Exception) = Log.e("APP", "uncaught exception: ", e)

我还有一个基于之前观察,关于 Android 线程/执行资源调度的疑惑:
+ 在 onClickListener 里,不能做一些View树的变更,说明 handler 应该在 Main 线程外执行
+ 可是有时候 onClick 里的 HTTP.get 逻辑能阻塞住主线程导致 ANR
如果是主线程负责所有绘制,嗯这个的确没问题

出现问题的环境不一样,二者分别是在 Beanshell 解释器、Androlua 里执行(我也没有用纯Java做阻塞操作的经历,但有一次的确是在 onClick handler 里阻塞了重绘)
所以 onClick 到底由谁来 run 啊
struct,json,yaml,pickle,marshal 等序列化便利库我都用过,无非就是流 dump/load 和便利性 dumps/loads #Python #backend #bin

对于二进制读写的数值读写、字节序解释我也清楚的很, Kotlin Dokuss 和 SomeAxml(挂名) 项目都包含了基本二进制流和读写抽象

序列化(serialize)的用途一般是以二进制表示某种数据, marshal 和 pickle 虽然都是对象序列化,显然 marshal(封送) 更广义、更内部, C# 里也有这个名词,用于在进程间传递数据对象的深拷贝,也类似 android.os.Parcel
#os #android #backend #huawei 总的来说,可执行格式和渲染上还是有转移和割席的,但是还太少,所以说像酵话
#linux #sysadmin
YuutaW:
(用fbi无chroot在 #Android 上显示了图片)
以及,fbi 也支持 DRM

duangsuse:
我也猜到 fb=framebuffer ,就是不知道有 imageviewer 这程序……

drm 又是什么缩写

YuutaW:
Direct Rendering Manager
/dev/dri
/sys/class/drm

请妥善使用 drm-info 工具

duangsuse:
噢,我也知道,和 Digital Restriction Management 误会了。

YuutaW:
确实容易误会
和那个东西没一点关系
就是一个 Kernel 的新的(Relatively)显示栈

duangsuse:
所以经常不容易区别 nvidia-drm 到底是干什么的(

YuutaW:
我是 chroot 的啊

duangsuse:
🌚我还以为你是 Termux 之类的,所以专门强调无需chroot

YuutaW:
chroot 只是使用了 Arch 的一些 Userspace和库,dev 还是 bind 过去的。
理论上静态链接一个应该也不用 chroot ,但是太难了,简单起见。

DRM的参考文献: #cg #cplusplus #backend

https://events.static.linuxfound.org/sites/events/files/slides/brezillon-drm-kms.pdf
https://jan.newmarch.name/Wayland/DRM/
https://waynewolf.github.io/2012/09/05/libdrm-samples/
https://www.linuxplumbersconf.org/event/2/contributions/229/attachments/53/60/10._DRM_KMS_for_Android_v1.pdf (注:YuutaW 的发言有整理)
👆辟谣!现在没有对$i30屏蔽处理!
#linux #sysadmin #os #backend https://tttttt.me/c/1229493248/21869 (@outvivid)
#java #cs #DontKnow Integer.valueOf 的缓存机制 (即 (Integer)x==x 的左范围)

#functional 妈的,函数式和 SICP 现在自造词还不一样了,应用序 vs. 传值、正则序 vs. 传表达式(或是传惰性?)...

#JS #CSS #PLT HTTP #backend #blog 大佬的面试经历 我终于知道cs是学啥了🤔 杂学

#rust #PLT #tt https://edward40.com/tagless-final-in-rust 呃... 看来Ray说自己很菜是有道理的,是我见得少了,没想到同道这么多🌝

https://9bie.org/index.php/archives/635/ 超星邀请码... 这又一个 pwn #Security

https://cnblogs.com/Dillonh #oi #dalao 是 cnblogs... 上次一个 commajia 大佬也是
#recommended #linux #backend #cplusplus #Python https://tttttt.me/c/1492060815/96087, https://tttttt.me/c/1492060815/95986 Q:这个群是干嘛的?
A:《捕蛇者说》是一档播客节目,可前往官网(pythonhunter.org)或各大播客平台(苹果、小宇宙、Spotify 等)收听。本群是捕蛇者说播客的听众群,讨论技术和非技术的各种话题。

Twitter: @pythonhunter__
发电支持我们:https://afdian.net/@pythonhunter
#cplusplus #linux #backend #sysadmin 🌚 编写自己的 WM (迫真
duangsuse::Echo
https://tttttt.me/vvb2060Channel/416 #Android #Security #aop asm inline hook 当然是任意点都可以,实际上 frida 配 xposed 开发是真好吧🤔 /proc/self 都可以 mount --bind ,但是改动是系统级的。 通常做法就是由框架来实现访问权共享,像 Riru 一样换一个 preload .so 来实现 hook 我觉得应用层开发者尝试对抗系统动态分析是很愚蠢的行为,毕竟你又不是搞安全的,凭 Proguard 组搞出来…
为了避免被认为是在指点江山我就简单 PoC 一下,真的不需要十行代码。 毕竟这个「反破解手段」门槛也太低了,只需改动 .h 文件&重编译,其它都自动兼容了。
而加密 bytecode 的各种方法全都逃不过内存 dump ,因为「原原本本」的程序文件是虚拟机要求的,总是要还原。 hook 一下虚拟机的 load() 即 luaZ_undump() 就都出来了,代码保护唯一有效的是削除命名标识符的本义,或者对程序做些预处理和切分什么的(对这些,基于符号执行的 smalivm 类反混工具也能消除),但是大部分有「产权保护」意识的人 意识不到吧😒

目标只是得出两版 #Lua 指令号直接的对应关系,也就是只需做指令id 数组的读取,得出的对应关系用于 patch 给 chunkspy 等工具。

本来说是可以用 getOpcode(buf, i) 的,忘记数组迭代需要长度的问题了,就用迭代器吧…… 也是惰性计算的😒

首先自编个 lua luac (实质都是 liblua 的命令行工具
curl -O http://www.lua.org/ftp/lua-5.4.2.tar.gz
tar xf lua-* &&cd lua-*/src/
make luac lua

#sysadmin 科普下 lua.org 的 doc 里 curl/tar 的 -R/-z 是 设置文件mtime/gz解压

看看 https://bbs.pediy.com/thread-250618.htm
https://tttttt.me/berd_channel/1647
可以参考

Luac chunk 文件是比较标准带 insn size 的二进制结构, size_t 一般为 4 (int32) 大端字节序,因为只需要读取 opcode 我就做个比较 hack 的操作——hexdump diff 断言指令数组头的偏移量,本来想可以直接取每条指令首字节,没想到这个好像是仅 7 bit ,那就只能 import struct😓
然后指令集也不必写完整的,反正也没有 unluac ,源码手改的,自己验证意思意思够了。

lopnames.h 对虚拟机无意义, lopcodes.c 只是定义指令格式的,所以要改 .h 里的顺序,稍后 grep -r 'ORDER OP' 还会发现必须同时更改 .c 的顺序,而且还得修正 lua.h 的一处 #define 🌚 (不过和 lcode.h 的 OPR_x 以及 ltm.h 没关系,因为 opr 是以 OP_ADD+i 及 TM_ADD+i 的方式两向对应的 )
其实如果不改 ltm.h 而想保证元表事件正常派发,那 OP_ADD 到 OP_NOT 直接的顺序都不能变🌝
不过这里就随便点,反正没用到~

用于乱序的 py 脚本:
同时 shuf .c array 和 .h enum 的索引号,总之就是先搞出 index mapping 再 apply 它两次。 🌚

用于对应的脚本(见下下条):
d[op[i]] = names[op_orig[i]]

胡话:呃,好像是 d[k] = d1[d[k]] ... 不对
其实变的是 k 吧(re-associateBy), d[k1] = d[k] 其中 k1=d1.keyOf(k) ,因为 v 都是复制过来的。

#plt #ce #backend 反破解小指南 🦜
嘛,其实这个还是有强化的方法的。 只需这个有强烈愿望🧐并且敢动 C 虚拟机🌝实现代码的人 对他的每个单个应用 重编译乱 opcode 的私有版 lua
同时更改下 LuaVM 指令格式 bitmask 里操作数的顺序,并且以自有算法加密常量池(必须由虚拟机层来解密,最好是惰性完成的 内部传输性 loadk 只传常量编号不解密),这样对 naive 的破解者就非常棘手了,只能从外部 API 分析某一特性点的实现方法惹🌚

自有版虚拟机的代码文件看起来符合规范(因为你改得少),但是完全无法被通常工具读取,一些虚拟机壳也是出于同样的意图(which 我没在 Android 上见到过,设计这种加壳器需要一定编译原理或状态机的知识 需要预处理 bytecode)

最关键的一点就是孤立自己利用到的技术,让破解者无法使用针对性工具,然后增加破解者自写工具的难度,尽可能用没工具的 native 平台叠加难度。单机程序用惩罚机制来反动态分析?可笑。程序状态是不可信的,稍有常识的坏人完全可以保留某 fork 的整机状态,你检查虚拟机都不行,有的是机会给检测方法 hook 光光;用别人的反破库,也容易被找到针对性反反破工具。😒
其实嘛,越是简单的代码越接近真理,越往程序的根基走,手段越能令破解者头疼。

其实用私有版 luaVM 不暴露指令号对应关系就已经很安全了(当然坏人🌝还是可以用生成 code 看 vm state 的方法甄别指令,虚拟机状态就不是纯二进制领域的人能魔改的了🤪),但最好还是用预处理给 luaV_execute 的 opcode switch 每个 case 加点随机乱代码,防止被源码相似性搜索(这个只需要反汇编字符串匹配 破解者就能完成)。

介于 C 的静态自动分析尚无完整解法,对每个模块都要还原虚拟机指令才能反编译出真实逻辑,就可以说是「无法破解」的软件了🤣
你掌控程序流程,你掌控无物;你掌控程序码解释,你掌控一切。
越是在根基做限制越难破解,但是外部 API 和 memdump 依然没办法对抗,但至少,这样反调试代码就不易被分析了🌚 这些代码能造成巨大的麻烦,让破解者不知从何下手,例如反外部 API 断点和管理加密的常量池,制造 garbage String 来混淆 memdump 。

什么叫做欺骗系统,「系统」这个概念都是针对软件运行时而言的,运行时可以是带trace/hook的实机、虚拟机或者静态分析器,这些都是合法合理的运行时,因为,程序只是数据而已。「我的代码,我的权利、我的私产」?谁能想到那么多啊😅
除非有一天 DRM 会无法被模拟复制破解,不然最实际的方法是把软件做得足够大,然后诉诸法律或己方威权。
#asm #backend #js 🌝👍
duangsuse::Echo
执行时是怎么样的呢? 🤔(当然这里可能不严谨,不过也够了,反正大家很多人连 CDEF 系统栈是怎么维护的都不知道,也算是科普一下) 我们的 caller 叫做 main,它执行如下代码以调用我们的子程序 bd: sub esp, (2*4) <sp> [....] [....] |***** mov ecx, ; buffer ; ecx = (char *) buffer mov [esp+4], "SGVsbG8K" <sp> [....] [*"SGV....] |***** mov [esp]…
#backend #asm 原来yt上也有这么多人在做CS科普
好怀念以前什么都不了解,没有地方拿到「原始资料」的时候啊..
那时候就是靠猜、靠一些中文资料碎片,也不熟悉「内存布局和跳转」的C语言指针模型,更不会把 struct;union; subtype; weak type;trait; 这些放在一个心智模型里去diff

现在看来是走太多弯路,实现了貌似「科班」轻松就懂的、无意义的东西,但在我看来,用x86 写算法明明就是容易搞懂的事,错误在于最简例、可视化和复用的缺失

说起来,频道的 #tag 太多,成了失去归类能力的野草..😓 对我而言「流行编程语言」就像这样吧;为了摆架子,搞丢了问题的本源

又说了奇怪的话了..😶‍🌫️ 知乎上也会被PL人喷是民科
幸而最近有点时间编程, 不知道能整出啥

#dalao #blog #inm 野兽的链表里技!
duangsuse::Echo
> https://tttttt.me/dsuse/1064 https://bellard.org/otcc/otccn.c 是tccboot所用JIT编译的最简版 呃.. 第一次见到 wiki 编辑战 小时候(高中) 很喜欢 #mozilla #Rust ,还写了这个(列表处理)程序 大概就是暗暗觉得……高性能又开源(根正描红的那种,练习时长两年半只为开源语言,太感人了) 后来看的就淡了,因为rust真的很(烧脑?) — 我觉得能和 C FFI 的某种意义上都是系统,比如 py 的嵌入式GPIO libs…
#py #backend https://tttttt.me/NewlearnerChannel/11360
Python 潮流周刊 #10:Twitter 的强敌 Threads 是用 Python 开发的
👉
3、Python 3.12 预览版:支持 Linux 性能分析器 (英)
4、FastDepends:从 FastAPI 中提取的依赖注入框架,异步和同步模式都支持 (英)
5、https://github.com/0xpayne/gpt-migrate :将代码仓从一种框架或语言迁移成其它 (英)
6、使用 Golang 和 Docker gRPC 运行 Python 代码

7、DisCo:通过指示生成现实世界的人类舞蹈 (英)
8、用 Python 实现一门简易的编程语言 (英)
如何用 Python 来实现一门编程语言呢?这是一个系列教程,第一篇中实现了一个非常基础的编程语言,可以执行 print 语句,第二篇则拓展成支持变量和数学表达式

#ai CuPy:将 NumPy 数组调度到 GPU 上运行


#statement Paul: 如何选择你的工作
“不要计划太多,不管学过多少,只要做最有趣和最能拓展选择的事情。我叫这种方法“逆风而行”。这是大多数成功人士的秘诀。”
年轻人有时间的极大优势。应该用它来追求好奇心、创造力和专业知识:学习一些你不需要了解的东西,只是出于好奇,或者试着构建一些酷炫的东西,或者成为某个领域的高手。

年轻人容易受到他人的影响。他们常常觉得自己无足轻重。
“避免虚伪”是一个有用的规则,但怎么积极地实践呢?怎么找到自己的方向呢?如果你不诚实,你怎么能对真理有敏锐的眼光呢?
爱因斯坦就是这样做的。他能看透麦克斯韦方程的奥妙,不只是因为他有新思想,而是因为他更严谨。注意那些不合理或缺失的地方。99%可能是你弄错了,但也别忽略它们。

也许有些工作需要愤世嫉俗和悲观主义,但如果你想做出伟大的工作,乐观主义更有用
我不喜欢“创造过程”这个词。它有点误导人。独创性不是一个过程,而是一种思维方式。
我们用独创性、创造力和想象力来描述这种能力,一种特殊的技能。很多人有很多“技术能力”,但在这方面却很少。
#py 周刊

#ts Mypy: 1.5
Mypy 是 Python 的静态类型检查工具,1.5 版本主要功能有: @overrride 、更灵活的 TypedDict(字面创建的 dataclass) 创建和更新、可显示错误代码的文档、改进了泛型函数的类型推断、__slots__ 的优化、步进 Python 3.12

#ai 整理和预处理pdf文件,让GPT访问
from bot import Retriever, llm_reply

#backend 用 numpy, 线程池 优化数学区间求和函数

- 杀死 ProcessPoolExecutor
Python 自身不适合处理 CPU 密集型任务,文章中项目原本使用进程池来规避 GIL 问题,后使用线程、C++ 扩展,内存使用量减少 50%,CPU 使用量减少约 20%

- 观点: Py 不适合编写100行以上的软件,因为弱类型、重构难和性能


from contextlib import suppress
with suppress(FileNotFoundError):
的妙用

- 上下文管理器
from tenacity import Retrying, stop_after_attempt #AbortSignal
for attempt in Retrying(3):
with attempt
:

骗你的。Java式接口让人难以评价:
for i in Retrying(stop=stop_after_attempt(3)):
with i:
print(f"🧨炸弹{'真的'*i.retry_state.attempt_number} 要炸了!")
try: time.sleep(2) # 按Ctrl+C !
except:pass
else: raise Exception("💥!")

#visualize #plt LibCST: 遍历Python3代码树
btw. 你可以用 %%showast 和 astor 查看算式的树状图和代码形式
- viztracer 提供了 DevTools profile 页

#datas 绘制多个直方图、折线图表
- #tex 对比"星星旗帜"的海龟画图 Python 来学习 PostScript
PostScript 广泛用于打印机、出版和图形设备。文章将可被 convert -page 720x480 flag.ps flag.png 的程序,直译成对接到 matplotlib 的 Python 代码


#java 如何编写简单的C模块,篡改 CPython 解释器的数字
导入一个模块后,如何让 print(8) 会打印出 9?只需要拿到整数对象池,交换两个大整数引用的值
swap( (PyLongObject*)PyLong_FromLong(8)->ob_digit[0] , (9)  )

#os #linux 在 execvp(["python3", “Hello World.py”]) 时,会发生什么?
在 py 文件中写上一句,执行这个文件,幕后都发生了什么呢?文章使用了 readelf 、strace 、ldd 、debugfs 、/proc 、ltrace 、dd 和 stat 等工具,详细解释了脚本被执行的过程。
主要涉及操作系统,GNU libc 相关的内容
推荐阅读


#js htmx: 强化的 form table dialog,交互式界面扩展
<form hx-put="/contact/1" hx-target="this" hx-swap="outerHTML">


#php 🤯 Slack: 我们认真觉得PHP好用
duangsuse::Echo
#dev #android 面试题 🤔 - 技术上提升最大的一个项目,展开介绍 对比业界同种算法流行和不流行实现、重写自己的任何项目,都比从事GPT都能完成的原型要好 - 为什么选择 Flutter,在业务方面学到了什么 Compose界原神的名气真的太大了,居然能用Navbar,Tab等自带组件,居然能调style! - Java 里重载和重写的区别 在编译期vs运行期确定函数,改方法签名vs改子类值 - 什么是线程安全 避免共享变量(不相交),或使用Atomic/独占锁 避免读写异步 - Service…
#dev #android #backend 面试题 🤔
- OSI 七层是哪七层
物理,数据链路: WiFi,BLE,eth,rndis驱动
网络传输: IP4,6 , iptables, socket(TCP) UDP
会话表示 Header cookie,json
App 众多Web3.0论坛,.

- HTTP 在哪一层?有些什么内容?
在L5~L6,负责请求响应和MIME类型,暴露为 调用+回调 +Header环境变量
除了会话,HTTP也能做文件传输和填表

- GET 和 POST 核心差异是什么?
body是否为form等私密数据

- HTTP 状态码有哪些?
{2,3,4,5}xx 各指代: 正常 重定向 请求出错 服务出错

- Java 的基本类型有哪些?拆包解包了解过吗?
值类型8种:BSCIJFDZ, byte8 short,char16 默认int32 long64 f32 默认double64 bool
值在放入List,. 前被装箱为Integer,.
Str不能修改,但相等比较也需要用java.lang. 函数 ,称为引用类型

jadx 可用于反编译,但如果是aapt+dx 会默认混淆函数名的

- Java 的访问修饰符有哪些?类级的 final 作用是什么?
可见性 private protected public 默认internal=包私有
确定性 final abstract default

final class或成员不含(函数)变量,等价于struct,因此不应该生成可供覆写的get/setter

- Java 的基本类是什么?有哪些方法?equals 和 == 有什么区别?重载重写是什么?
所有类型的Base class 是Object{eq,hash,toStr ,wait,notify同步锁 }
== 只比较GC对象的引用,而 (1.equals) 需要先valueOf装箱

重载=编译期0开销查找fun invoke()的重写,静态类型的专利

- Java 的常用类型有哪些?immutable 和 mutable 的 list 差异是什么?LinkedList 和 ArrayList 的差异是什么?
java.util.可变性 是从Kotlin抄的,弱类型assert
一般,只在嵌入式设备用易于增长的链表

- HashMap 了解哪些?规避哈希碰撞的方式有哪些?
类似RegExp 地狱回溯,long hashCode() 作为分组key的相同,也会给DDoS可乘之机
因此,对于用户输入的field,可以将其忽略,只用str,int作为Key

C系语言一般用 BTree,AVL 二分法实现KV查找。 如果是要问带锁的/fastutil的 Map实现,或者getOrPut 等惯用法……

- 项目里用到了 Xposed,它的原理是什么?
作为Xp插件的apk们会被 app_process 随 XposedBridge.jar framework.jar加载
在活动前loadPkg时,利用变量或函数名(转为native),修改其JNI代码指针,使调用前先查找覆盖表

- 了解过哪些设计模式?他们分别是什么?
Adapter,Delegate,Proxy,Observer/ 类型转换或AOP覆写
Factory,Visitor,Chain/跨平台的new()方法, 判断"type"的方法, 事件冒泡

被新语言淘汰的:😅👎
Singleton,Builder-Prototype,Command/ 模拟字典、复制数据、枚举操作
Strategy,Bridge,Facade / 函数字典和import式模块

- 单例模式的实现有哪些?可以手撕一个吗?
JVM上的static 已经支持了RAII。也可以用DCL懒加载
@JVM_volatile var cache
get()=run{ //保证单次执行
if(null==cache) sync(this){ if(null==cache) cache=init()}
return cache
}
#os #wasm #backend https://www.bilibili.com/video/BV1oE421w7Vt
猜猜为什么jvm里没有malloc这种概念,只提供了 byte[N]?

因为C语言允许从随机的整数构造指针, 导致每次读写数据结构都像SQL注入一样不安全,各种能越过内核鉴权

C还没有标准的序列化手段(除了 criu.org 按mmap来封送),一个Rc归还内存被cpp弄出魔法的效果
哪怕send(一个bytes[]) 到tcp都要序列化,而C对此的实现,居然是\0结尾字符串😅

不过呢,C struct是和二进制文件对应最好的,指针紧随数据,免重定向就类似于序列化了,但是C没有利用好这个等价关系,那至少需要sizeof的值

这么弱智的数据模型,所以只能用一些4K page实现虚拟地址了,越界就要中断,约等于内核vma就是虚拟机,哈哈。把一个越界检查和union多型整成了页表映射那么臃肿

WASM的JIT就完全不需要这种概念,app和内核驱动一样安全,线程和协程一样轻量
unikernel.org 还不是能跑起来