duangsuse::Echo
http://www.jshaman.com/ #ce 不愧是 #js 魔怔人
#ce 如何进行可达代码的动态分析呢? 🤔
这里我们以子程序和变量为单位,变量是广义的,一切可存储「值」而可有ID的东西。
首先,需要提供一个 root 接口集,对它的函数/变量进行访问代表子程序有效,有效性具有传递性。
为了保证得到的结果是完整的,不会因为执行时序有变更,需要注意「访问到」是一个双向关系,一个变量有访问者的集合,如果它被有效程序访问,整个访问者树都会反向变有效。
过一遍完整程序流程,进行统计:
+ 首先 root API 的子程序和变量(简称为符号)都是有效的
+ 所有用到有效符号的子程序都有效,其 callee 当然也全部有效
+ 不论符号是不是先被认为无效,一旦它被发现和 root API 有关联(比如依赖的变量被依赖 root 的程序写入了),它自动有效化
其实这就是 code coverage (
当然这个算法能分段化,以及能做的后期客制化操作很多
如果要插入利用正反操作(+1-1) root API 的无效代码,可以说是相当刁钻,只能分析到下个手动确定的有效操作,其实际值有没有变化 #reveng 🤔
这里我们以子程序和变量为单位,变量是广义的,一切可存储「值」而可有ID的东西。
首先,需要提供一个 root 接口集,对它的函数/变量进行访问代表子程序有效,有效性具有传递性。
为了保证得到的结果是完整的,不会因为执行时序有变更,需要注意「访问到」是一个双向关系,一个变量有访问者的集合,如果它被有效程序访问,整个访问者树都会反向变有效。
过一遍完整程序流程,进行统计:
+ 首先 root API 的子程序和变量(简称为符号)都是有效的
+ 所有用到有效符号的子程序都有效,其 callee 当然也全部有效
+ 不论符号是不是先被认为无效,一旦它被发现和 root API 有关联(比如依赖的变量被依赖 root 的程序写入了),它自动有效化
其实这就是 code coverage (
当然这个算法能分段化,以及能做的后期客制化操作很多
如果要插入利用正反操作(+1-1) root API 的无效代码,可以说是相当刁钻,只能分析到下个手动确定的有效操作,其实际值有没有变化 #reveng 🤔
#reveng #security #tricks #cplusplus OpenSSL https bypass pin 证书的方法: https://tttttt.me/yscschan/6950
或者
X509_verify_cert()
永远返回 1或者
ctx->app_verify_callback = []() ret true;
Telegram
YSC 的频道
前几天在对一个使用 Qt+OpenSSL 的程序抓 https 包,然而它不使用系统根证书。
一开始去搜索 x64dbg bypass openssl certificate error 但没有搜索到相关内容。
然后就想 OpenSSL 里面应该有个检查 SSL 证书的逻辑,然后进行一个条件跳转。
于是去搜索 openssl ignore certificate error,得知要用 SSL_CTX_set_cert_verify_callback 设置一个永远返回 1 的 callback。
继续搜索…
一开始去搜索 x64dbg bypass openssl certificate error 但没有搜索到相关内容。
然后就想 OpenSSL 里面应该有个检查 SSL 证书的逻辑,然后进行一个条件跳转。
于是去搜索 openssl ignore certificate error,得知要用 SSL_CTX_set_cert_verify_callback 设置一个永远返回 1 的 callback。
继续搜索…
#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 (或汇编) 级进行检查,只断点一类指令都能实现很多干预。
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 (或汇编) 级进行检查,只断点一类指令都能实现很多干预。
https://github.com/Mivik/GetDex/blob/master/app/src/main/cpp/include/getdex.h#L542 噢..原来在这里啊,decode 到art细节,然后
https://github.com/Mivik/GetDex/blob/master/app/src/main/cpp/getdex.cpp#L22 这里拿到代码,填成员结构/CodeItem
是有ExtJNIEnv的自定Thread 缓存,用互斥锁创建size不冲突的dex
access,flock 都不常用啊,看来C程序员真得会看man ioctl.h 🧐 #statement 不要背书
ndk_dlsym 是用来兼容高版安卓的
cydia不知道用没用
https://github.com/Mivik/GetDex/blob/master/app/src/main/kotlin/com/mivik/getdex/GetDex.kt#L63
clsLoader-path-dex元素-fix(内项)
只dump自己类加载器的项 https://github.com/Mivik/GetDex/blob/master/app/src/main/kotlin/com/mivik/getdex/MainHook.kt#L40
会用 Xposed hook 应用 api-framework 上下文创建的 attachBaseContext ,在JNI调用 ART api 转写出dex
https://github.com/Mivik/GetDex/blob/master/app/src/main/kotlin/com/mivik/getdex/MainActivity.kt#L142
果不其然C段弄安卓都会自己写框架..拒绝xml
只是不知道dex是怎么nopped 的,我只听说叫壳(解密加载),难道新虚拟机里类结构必须预定义了?
#reveng 然后是这个 https://github.com/Mivik/Reedle Riru so注入
https://github.com/Mivik/Riru-Il2CppDumper 支持.net基址和Method dump的原版。 Prefer维护的 UnityStudio 也挺好用的
https://github.com/Mivik/GetDex/blob/master/app/src/main/cpp/getdex.cpp#L22 这里拿到代码,填成员结构/CodeItem
是有ExtJNIEnv的自定Thread 缓存,用互斥锁创建size不冲突的dex
access,flock 都不常用啊,看来C程序员真得会看man ioctl.h 🧐 #statement 不要背书
ndk_dlsym 是用来兼容高版安卓的
cydia不知道用没用
https://github.com/Mivik/GetDex/blob/master/app/src/main/kotlin/com/mivik/getdex/GetDex.kt#L63
clsLoader-path-dex元素-fix(内项)
只dump自己类加载器的项 https://github.com/Mivik/GetDex/blob/master/app/src/main/kotlin/com/mivik/getdex/MainHook.kt#L40
会用 Xposed hook 应用 api-framework 上下文创建的 attachBaseContext ,在JNI调用 ART api 转写出dex
https://github.com/Mivik/GetDex/blob/master/app/src/main/kotlin/com/mivik/getdex/MainActivity.kt#L142
果不其然C段弄安卓都会自己写框架..拒绝xml
只是不知道dex是怎么nopped 的,我只听说叫壳(解密加载),难道新虚拟机里类结构必须预定义了?
#reveng 然后是这个 https://github.com/Mivik/Reedle Riru so注入
https://github.com/Mivik/Riru-Il2CppDumper 支持.net基址和Method dump的原版。 Prefer维护的 UnityStudio 也挺好用的
GitHub
GetDex/app/src/main/cpp/include/getdex.h at master · Mivik/GetDex
A powerful tool to dump dex files whose instructions are replaced with nop - Mivik/GetDex
#reveng 👆
用Lua这种语言的沙箱不就行了.. yaml怎么了?怕是不懂schema ,要知道+* 表达式的解析是没有易写统一的方法的,根本就是伪命题,这样无疑是要所有软件配置不可统一编辑!
" conditional logic or description of transformations or something else. Both the logic of what can be expressed and done and the terms and elements of the domain are specific and custom to the program. This is what you see in firewall rules, whether OpenBSD PF...
用Lua这种语言的沙箱不就行了.. yaml怎么了?怕是不懂schema ,要知道+* 表达式的解析是没有易写统一的方法的,根本就是伪命题,这样无疑是要所有软件配置不可统一编辑!
" conditional logic or description of transformations or something else. Both the logic of what can be expressed and done and the terms and elements of the domain are specific and custom to the program. This is what you see in firewall rules, whether OpenBSD PF...
dnaugsuz
从编译原理的角度这句话没说错,但呃其实我也只是好奇 嵌入式hook也就是了解abi的程度 不会学汇编 从软件看,汇编只是机器暴露的算力/io接口,不是微码等内部细节,对数据处理来说goto和int长度这些没意义,CISC里rep movsb这样的也不如strcpy()可移植(我们定义此复用不需要"学"汇编);如果所有函数是 static inline,再 -O3 -nostdlib ,就等于手写汇编( godbolt.org 无结构编程可以用很多hack,比如跳转到半条指令或把.code .rodat…
https://tttttt.me/im_RORIRI/1560 大概我就是这种专业主义……🌚 #ce 关于这个呢我的观点是
汇编器 #assembler 如 gAS,nasm 是支持指令集(ISA)编码的序列化器,输入含伪指令如 .int 0 .long 1。但是汇编也有些套路(比如 call-pushbp栈帧-ret)
汇编本质上和 Lua虚拟机,PyVM,JVM(但-计算栈),LLVM-IR(但-值节点)是一样的,
只是数据可混入代码且指令长不定,也没有规范的for-loop(decl;cond;tail) 、乃至子程序(函数调用)等结构,
所以我在学汇编时并不是掌握intel等会提供的ISA手册,只是被迫理解既有代码的套路。我认为「抽象概况」的汇编足够了,
你可以了解C的元编程(vararg咋弄,报错unwind,cffi)、C++虚方法实现等,没有必要涉及具体的 jmp jz/je jnz jg/jle, cmp, mov [rbp-8],1 ,add sub ror movzx 指令或者 arm 的 b,bl/call,blx 和thumb指令集模式;编译原理乃至编程不是汇编的附庸——Fortran的设计者 John Backus说的,脱离ISA我们仍能汇编🧐。
确实不是所有编程都为使用,但如果想理解汇编,也不该对 x86_64 CDEF调用约定、有无mem2reg 下的汇编全盘接收,实际上编程语言的虚拟机也只是比汇编调用/指令编码更规范、没有统一的objdump ELF format .o/.so地址符号、支持闭包函数据、用常量池而非 .rodata .bss 啥的,而那些加壳器用的花指令(跳转半指令),可在 #reveng 的范畴讨论
如果只是感兴趣,这种思路可以更好的理解汇编,而不是“XX汇编”
汇编器 #assembler 如 gAS,nasm 是支持指令集(ISA)编码的序列化器,输入含伪指令如 .int 0 .long 1。但是汇编也有些套路(比如 call-pushbp栈帧-ret)
汇编本质上和 Lua虚拟机,PyVM,JVM(但-计算栈),LLVM-IR(但-值节点)是一样的,
只是数据可混入代码且指令长不定,也没有规范的for-loop(decl;cond;tail) 、乃至子程序(函数调用)等结构,
所以我在学汇编时并不是掌握intel等会提供的ISA手册,只是被迫理解既有代码的套路。我认为「抽象概况」的汇编足够了,
你可以了解C的元编程(vararg咋弄,报错unwind,cffi)、C++虚方法实现等,没有必要涉及具体的 jmp jz/je jnz jg/jle, cmp, mov [rbp-8],1 ,add sub ror movzx 指令或者 arm 的 b,bl/call,blx 和thumb指令集模式;编译原理乃至编程不是汇编的附庸——Fortran的设计者 John Backus说的,脱离ISA我们仍能汇编🧐。
确实不是所有编程都为使用,但如果想理解汇编,也不该对 x86_64 CDEF调用约定、有无mem2reg 下的汇编全盘接收,实际上编程语言的虚拟机也只是比汇编调用/指令编码更规范、没有统一的objdump ELF format .o/.so地址符号、支持闭包函数据、用常量池而非 .rodata .bss 啥的,而那些加壳器用的花指令(跳转半指令),可在 #reveng 的范畴讨论
如果只是感兴趣,这种思路可以更好的理解汇编,而不是“XX汇编”
Telegram
螺莉莉的黑板报
摘自 : 张医生被批判,背后是专业主义的危机 newslab
什么是专业主义?按照政论杂志《国家事务》(National Affairs)一篇文章的说法,专业主义意味着:在从业者之间形成强大的内部观念,有一套经过一代代总结传承的做事情的最佳方法和专业守则,目的是为了实现一些具体的目标,而不是为了个人的名利或者为了派别的利益。当不确定的情况发生时,一个具备专业主义的人会问自己:“根据我的专业职责,我在这种情况下应该做些什么?”而专业主义一般会给这样的问题提供答案。
专业主义是以本专业的守则为最高准则…
什么是专业主义?按照政论杂志《国家事务》(National Affairs)一篇文章的说法,专业主义意味着:在从业者之间形成强大的内部观念,有一套经过一代代总结传承的做事情的最佳方法和专业守则,目的是为了实现一些具体的目标,而不是为了个人的名利或者为了派别的利益。当不确定的情况发生时,一个具备专业主义的人会问自己:“根据我的专业职责,我在这种情况下应该做些什么?”而专业主义一般会给这样的问题提供答案。
专业主义是以本专业的守则为最高准则…
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交流的科普力是失望的,代码写得🌸时非常开心,一谈到低层抽象都有武德了,就会用个序列化/反编译工具;当初万能汇编器的时代去哪了
导致星巴克崩溃无报错的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交流的科普力是失望的,代码写得🌸时非常开心,一谈到低层抽象都有武德了,就会用个序列化/反编译工具;当初万能汇编器的时代去哪了
duangsuse::Echo
LL 是什么呢,我举道『编译原理(指模式匹配机)』题 (大写代表规则=非终结符) 在分词器即”不需要stack“的N/DFA状态机走完一步action,就拿到1token,喂给解析器;所有喂完没报错,应该就组织出了语法树(没错,不能用调用栈组织AST) tok=[],i=0; st = [S] // S 是根语法. LL(1)匹配 while((it=st.top) !=null) if(it !in G)//终结符 if(t==tok[i++])pop(); //匹配一项 else 回退或error;…
王垠对CS科班编译原理侧重点的质疑是对的(然而并没暖用,就像教育也不只是为培育人才一样;你没法让所有人相信简单是对的
倒不如说是老师举例和对照的方法不好,LL 这样入门级的程序编号化还是比较好教的,可是他们一举例就是很生硬,非常莫名其妙的常量 也不先说目标,上来就“贴代码”、贴做的图(也不简洁、记流水帐),让人很迷糊:
③ T → FT ' FIRST ( T ) = { ( id }
④ T' → *FT ' |ε FIRST ( T' ) = {* ε }
⑤ F → (E)|id FIRST ( F ) = { ( id }
……
以下的内容全都是流水帐,没有任何解释和其他等价形式,学起来非常麻烦
https://zhuanlan.zhihu.com/p/70895051 这个人教的SSA就很好,公共子表达式消除CSE、常量折叠、死代码消除 都是SSA(执行序节点图)的直接优点,他对指令选择的解释”烧水,做菜,切菜 顺序..“一点没有专业人士的架子,对基本块BB x=1; if(q){k=1; a=k+x} else a=c+d; 里前 a 相当于 x+1 和放大SSA BB范围 x=1; if(!q)goto B; k=1;a=k+1; .. 还有范围分析,就说得好实际
”最近在做一个 x86 到 x86 的 jit 编译器…… 中间表示一般有两种形式,树:[+a t1=[+b c] d] 或者展开的序列表示:t1 = b + c; a = t1 + d;
……
当追踪不了的时候只要按照最保守的范围进行优化就能保证程序正确性。同时这也可以用于程序静态分析,比如未初始化变量的分析。
数据流分析可以对各种数据进行分析,比如在变量有别名(比如指针)的时候,纯粹的数值分析就会有问题,因为你并不知道指针会指向哪儿,这个时候就可以对指针所指的目标做数据流分析,继而对对应的数值进行分析。“
他还解释了这里的SSA形状
-相同的名字不出现两遍(无重赋值
-每个节点下面(最多)只有两个节点
-父节点的值直接依赖子节点的值
的原因:具体的说每一行只能有两个输入变量和一个输出变量,也就是 z = x op y,从树表示到结果,我们只要先子节点的遍历整棵树,在每个节点上输出一行对应的操作语句就好了。
在语义阶段结束后程序就变成统一IR组:跳转基本块BB,有入出口、前后项,分析都在基本块
https://zhuanlan.zhihu.com/p/47099755 然后这个 #ce #reveng 反编译原理也非常好。 如果按执行的方式把 if(q) a; else b; 即
推荐 http://zneak.github.io/fcd/2016/11/25/revisiting-regions.html
Dom树是入口到某一BB 的必经点 -及这些的必经点在前 -构成的树 ;最简解O(nm) 是枚举+BFS ,最常是 Iterative(20行 O(nn) )
https://blog.csdn.net/Dong_HFUT/article/details/121375025 列了一大堆实现,L-T支配树构造法本身代码比Dij搜索长3倍, O(logn+M)
两点互有路称强联通,然后还有强联通子集(分量,=SCC),tarjan 法(N+节点数M) 就能求一点的集
https://security.tencent.com/index.php/blog/msg/112] CFG Flatten 是利用运行期switch派发器的方法混淆代码 🤔都是些基于 CFG(控制流图) 的东西,对正常编程而言其实优化分析都是虚的,代码写好才最重要,不过这些还挺有意思的,至少比把程序打散为编号强
高级的科班编译原理除了龙书还有虎书鲸书,但语言的设计不需要懂太多知识,王垠在前也怼过 CFG analysis ,确实这些对编程并不重要,不通用的工具做着还是容易的,但它们也是个领域啊
倒不如说是老师举例和对照的方法不好,LL 这样入门级的程序编号化还是比较好教的,可是他们一举例就是很生硬,非常莫名其妙的常量 也不先说目标,上来就“贴代码”、贴做的图(也不简洁、记流水帐),让人很迷糊:
③ T → FT ' FIRST ( T ) = { ( id }
④ T' → *FT ' |ε FIRST ( T' ) = {* ε }
⑤ F → (E)|id FIRST ( F ) = { ( id }
……
以下的内容全都是流水帐,没有任何解释和其他等价形式,学起来非常麻烦
https://zhuanlan.zhihu.com/p/70895051 这个人教的SSA就很好,公共子表达式消除CSE、常量折叠、死代码消除 都是SSA(执行序节点图)的直接优点,他对指令选择的解释”烧水,做菜,切菜 顺序..“一点没有专业人士的架子,对基本块BB x=1; if(q){k=1; a=k+x} else a=c+d; 里前 a 相当于 x+1 和放大SSA BB范围 x=1; if(!q)goto B; k=1;a=k+1; .. 还有范围分析,就说得好实际
”最近在做一个 x86 到 x86 的 jit 编译器…… 中间表示一般有两种形式,树:[+a t1=[+b c] d] 或者展开的序列表示:t1 = b + c; a = t1 + d;
……
当追踪不了的时候只要按照最保守的范围进行优化就能保证程序正确性。同时这也可以用于程序静态分析,比如未初始化变量的分析。
数据流分析可以对各种数据进行分析,比如在变量有别名(比如指针)的时候,纯粹的数值分析就会有问题,因为你并不知道指针会指向哪儿,这个时候就可以对指针所指的目标做数据流分析,继而对对应的数值进行分析。“
他还解释了这里的SSA形状
-相同的名字不出现两遍(无重赋值
-每个节点下面(最多)只有两个节点
-父节点的值直接依赖子节点的值
的原因:具体的说每一行只能有两个输入变量和一个输出变量,也就是 z = x op y,从树表示到结果,我们只要先子节点的遍历整棵树,在每个节点上输出一行对应的操作语句就好了。
在语义阶段结束后程序就变成统一IR组:跳转基本块BB,有入出口、前后项,分析都在基本块
https://zhuanlan.zhihu.com/p/47099755 然后这个 #ce #reveng 反编译原理也非常好。 如果按执行的方式把 if(q) a; else b; 即
q ?not B; a; ?jmp C; B:b C:
切BB再反编译规约,(符号执行)只能得到q为true 或false 的语法树,较好的方法就是 Node Split ,即对两个枝都继续,匹配出 if 结构再规约出表达式(纯符号执行估计不行.. 嵌套几个if就会爆炸吧(引文 Handling Irreducible Loops),此外 DJ-graph (支配前驱|可能前驱) 的BB切分也比较好推荐 http://zneak.github.io/fcd/2016/11/25/revisiting-regions.html
Dom树是入口到某一BB 的必经点 -及这些的必经点在前 -构成的树 ;最简解O(nm) 是枚举+BFS ,最常是 Iterative(20行 O(nn) )
https://blog.csdn.net/Dong_HFUT/article/details/121375025 列了一大堆实现,L-T支配树构造法本身代码比Dij搜索长3倍, O(logn+M)
两点互有路称强联通,然后还有强联通子集(分量,=SCC),tarjan 法(N+节点数M) 就能求一点的集
https://security.tencent.com/index.php/blog/msg/112] CFG Flatten 是利用运行期switch派发器的方法混淆代码 🤔都是些基于 CFG(控制流图) 的东西,对正常编程而言其实优化分析都是虚的,代码写好才最重要,不过这些还挺有意思的,至少比把程序打散为编号强
高级的科班编译原理除了龙书还有虎书鲸书,但语言的设计不需要懂太多知识,王垠在前也怼过 CFG analysis ,确实这些对编程并不重要,不通用的工具做着还是容易的,但它们也是个领域啊
知乎专栏
编译器优化了什么
[经 @污博士 提醒,我决定把题目改了…]最近在做一个 x86 到 x86 的 jit 编译器,因之前大多接触的是编译器前端知识,所以重新学习了一遍中后端原理,做个整理,也欢迎交流拍砖。 这里不打算涉及具体的工程细节,…
duangsuse::Echo
王垠对CS科班编译原理侧重点的质疑是对的(然而并没暖用,就像教育也不只是为培育人才一样;你没法让所有人相信简单是对的 倒不如说是老师举例和对照的方法不好,LL 这样入门级的程序编号化还是比较好教的,可是他们一举例就是很生硬,非常莫名其妙的常量 也不先说目标,上来就“贴代码”、贴做的图(也不简洁、记流水帐),让人很迷糊: ③ T → FT ' FIRST ( T ) = { ( id } ④ T' → *FT ' |ε FIRST ( T' ) = {* ε } ⑤ F → (E)|id FIRST ( F…
https://zhuanlan.zhihu.com/p/99509681 #reveng #recommended #ce 虚拟机壳都弱爆了,不影响性能的OLLVM多好(那自动重构命名和类全名 的岂不是仍不够强 草..
在纵向70% state= angr汇编符号执行, -3行: 若执行踏入了 相关块addrs, 返回其目标地址,否则忽略此分支(消除无用块. hook地址是块内最后call)
然后会修复真实块间加jmp
把假条件 cmovz(zf?1:2) 改成jz +jmp 后随地址
在纵向70% state= angr汇编符号执行, -3行: 若执行踏入了 相关块addrs, 返回其目标地址,否则忽略此分支(消除无用块. hook地址是块内最后call)
然后会修复真实块间加jmp
把假条件 cmovz(zf?1:2) 改成jz +jmp 后随地址
#Haha 十步口一人……千里不留行
2. #reveng N64 Fast3D 移植到OGL和DX3D
3. #opensource #github 🤔 封禁发行权…… 他是作者,但发行好像是社区问题……看到大佬就用的不在少数
2. #reveng N64 Fast3D 移植到OGL和DX3D
3. #opensource #github 🤔 封禁发行权…… 他是作者,但发行好像是社区问题……看到大佬就用的不在少数
dnaugsuz
sortBy{it.isMale} 就能做 partition 了( 确实 Kotlin 这有点hack,可能是为了内部优化 #Kotlin 有些小瑕疵,比如 listOf(break,return,throw Error()) is List<Nothing> 还有 run apply 是 let also 同类但命名完全不同,本来是 fun()=run{} 的,可官方自己也不用此写法
问题:
其实 Kt 的问题不少,比如 Common 改名 Multiplatform 还有些隐藏关键字(typeof..),型参约束可以用 where,主要是太实验性,1.3 的时候字节码生成还有问题,不支持 j.l.invoke API
甚至一些?类型优化也有bug
但Kt确实是 #java JVM编程现阶段最好的选择,full interop ,完善带extfun OOP (只是Android上默认proguard规则还不够好什么的……
当你第一眼看某大佬的Kt 时着实被 let run constructor init companion 这些搞眼花了…… 一时觉得比Rust不明觉厉 🤪 Kotlin 初期的stdAPI命名 是个问题
>啥叫partition
school.partition(男女)
>不是有groupBy了吗
school.groupBy(领导教师学生)
那么 associate (toMap,还带 By-With介词) 和 all,any,none ("exists"=any,none=allnot) 也很容易忘,尽管相比JS和Scala 这是最好的
谈到Kt冷知识,我想再提 UnsafeVariance https://tttttt.me/dsuse/15959
我能断言指定
其实它本身同时是 in, 但为了写存储的兼容被迫暂作 out 了而已。
然后匿名 object{} (即
#recommend #kotlin #scala #reveng 关于coro底层的代码示例 https://tttttt.me/kotlin_cn/25062
呃,今天才知道 Kotlin 的 Boolean 是 Comparable, true > false 。感觉有点坑啊
其实 Kt 的问题不少,比如 Common 改名 Multiplatform 还有些隐藏关键字(typeof..),型参约束可以用 where,主要是太实验性,1.3 的时候字节码生成还有问题,不支持 j.l.invoke API
甚至一些?类型优化也有bug
但Kt确实是 #java JVM编程现阶段最好的选择,full interop ,完善带extfun OOP (只是Android上默认proguard规则还不够好什么的……
当你第一眼看某大佬的Kt 时着实被 let run constructor init companion 这些搞眼花了…… 一时觉得比Rust不明觉厉 🤪 Kotlin 初期的stdAPI命名 是个问题
>啥叫partition
school.partition(男女)
>不是有groupBy了吗
school.groupBy(领导教师学生)
那么 associate (toMap,还带 By-With介词) 和 all,any,none ("exists"=any,none=allnot) 也很容易忘,尽管相比JS和Scala 这是最好的
谈到Kt冷知识,我想再提 UnsafeVariance https://tttttt.me/dsuse/15959
(items[i] as IO<IN, in @UnsafeVariance T>).show(s, v)这关于
IO<INPUT, T>
的定义,T 是 out 的,不然 Seq<Any>(io1:<String>,io2)
就会报错,如果要把 Reader 和 Writer 写在一起就会出问题,但代码复用偏偏必须写一起我能断言指定
items: List<(IN)->R>
位置[i]
的 show 可以接受(in) T ,因为它本来就是被取并集损失了精度的,于是写了这种代码,其实它本身同时是 in, 但为了写存储的兼容被迫暂作 out 了而已。
然后匿名 object{} (即
new ArrayList(){{add(1)}}
,常量糖..)的IDE特性也很多,不过 inner class 才正常呢……#recommend #kotlin #scala #reveng 关于coro底层的代码示例 https://tttttt.me/kotlin_cn/25062
Telegram
duangsuse::Echo
上逆变 是什么😳
(T as T1) 的转换?如果是类型安全的话就子类型兼容了,为什么要靠强转断言类型安全?
嗯…… 如果你说有类型损失的,需要断言回来(UnsafeVariance),我这有个例子 ,但是代码复用整到这个程度,估计也没谁了🌚(草
items 的是 <out T>, 如果安全的话就把 out 去掉,但那就不能真正做到 Tuple 的复用了。
我能断言指定 items[i] 位置的 func 可以接受 T ,因为它本来就是被取并集损失了精度的,于是写了 (items[i] as Con…
(T as T1) 的转换?如果是类型安全的话就子类型兼容了,为什么要靠强转断言类型安全?
嗯…… 如果你说有类型损失的,需要断言回来(UnsafeVariance),我这有个例子 ,但是代码复用整到这个程度,估计也没谁了🌚(草
items 的是 <out T>, 如果安全的话就把 out 去掉,但那就不能真正做到 Tuple 的复用了。
我能断言指定 items[i] 位置的 func 可以接受 T ,因为它本来就是被取并集损失了精度的,于是写了 (items[i] as Con…
#Java #android #reveng 其实Rhino 等利用了Java代码生成但在android兼容也是用这种临时去dx翻译
https://tttttt.me/Ralphonograph/4393 #go SVC模板
https://tttttt.me/Ralphonograph/4393 #go SVC模板
Telegram
Phonograph
前前后后用 golang 写了十来个后端项目,大小不一;最近把自己在 golang 后端开发中用到的工具链整理了一下,开源了一个模板仓库,欢迎大家使用。
只要你对相关工具链有一些了解,拉下来这个模板后就能快速上手业务逻辑的编写,免除在初始阶段写重复代码的烦恼。模板包含 ORM、HTTP 框架、配置文件管理、日志管理、API 文档生成的解决方案,满足小型后端开发的需求。
https://github.com/RalXYZ/go-svc-tpl
只要你对相关工具链有一些了解,拉下来这个模板后就能快速上手业务逻辑的编写,免除在初始阶段写重复代码的烦恼。模板包含 ORM、HTTP 框架、配置文件管理、日志管理、API 文档生成的解决方案,满足小型后端开发的需求。
https://github.com/RalXYZ/go-svc-tpl
duangsuse::Echo
#ai #code https://jsbin.com/divoxufajo/edit?js,output 可以试玩一下AI编程的质量😒 。全程没4句话,全网找不到类似代码,是 #Bing 从算法原文据位运算知识翻译的。 人家就是复现算法原文,也比工业界写的强。 什么叫 🐮🍺 ,就是大家实现同1个算法,结果AI不仅快,而且简明,而且每一根毛都看得清算法原文 #game AI generate 还能缝合棋盘 puzzle (UX有bug, 请按 Hint 键体验. 这个键也是AI实现的 pong, gpt2
#statement
人能活几十年,计算机界也有70岁, 对技术怎么就这么短视😒。 过几年再看看,会觉得吵的是毫无收获,你新写的东西真的是唯一的吗?世界上甚至有人实用过。也有无数种视角你没做过,这并不能作为什么谈资
自己做CS,科学,搞得跟信教了一样,主动提AI,主动骂狗shit ,你拿什么荔枝?
#ce #reveng #sb https://tttttt.me/Javaer/895034
哦,刚刚想起来 跳转Block 的层级也是可以做混淆的,但这是 #security 领域的东西,一般人只会用加壳脱壳扫内存,这种技术根本没有普及,业界倾向于选择无法软破解的DRM
obfuscator, 比如,把所有 if else 块变成 while() switch(flag) 的格式,就能让反汇编或retdec 很难读懂。 如果用动态分析找到Block的跳转集散点做记录,就可以反混淆
我就想,正向工程,尚没有什么复制不了的业务功能,何况需要ELF文件才能开展的RE呢? 好好写定义式的专业框架、C-FFI 不香吗
觉得低能我当然理解,“安全论坛”base族不过是入门教程,但这只是我涉足领域的10% ,触类旁通罢了
我是从问题创作自己的解法, 而不是知道问题和“正确的”解法、或知道哪类解法该在什么对线里拿来炫耀 ;那是对编程的玷污🙄
用比上不足比下有余的心态看待技术,真的…… 比你强的大老牛一堆, 比你菜的js框架一堆,挣钱嘛,不寒碜
无非你是会冷门领域,然后 #AI 提供的搜索结果能涉足你领域一些“菜鸟技能”,让你要拼命掩饰它是种威胁了。
但那些根本不是“技术”,只是别个领域里前人做过,而你碰巧重做了。对你而言似是其非、表达不出,勉强在test上通过了,故自以很厉害,
但究其原理就那样,前人的正确错误都犯到,连冗杂都不是原创。
AI只是暴露了这苗头,AI只是向你证明了没有信息差时,那些堆砌就根本不是“技术”;你们硬要喷别人蠢。它就是蠢,但未来就是能干死“只有你懂”的伪门槛。 你可以不信,但最好停止狭技居奇,看看pancake的r2利用好了多少“蠢”领域的技术吧? 强如Haskell又有几个pandoc ?
要是所有程序员早设计好
我爱旧知,但我更爱真理
我爱算法,但我更敢组合
连API和DSL都写不好的程序员 在用XX范式里百年未变的概念,写模式匹配->更单调语言 的重构器,自以掌握了所有编程里的变与不变,看透了
#PL 人这天才病,可真得养好再上网吧。天才,就要有自己的话语体系?笑料。
大家都写列表处理,都琢磨图求解图重构,就你
ref: 开头 - 开头1
被骂了code
导致误会的disclaimer
我的反思 - 我导致被骂的观点
人能活几十年,计算机界也有70岁, 对技术怎么就这么短视😒。 过几年再看看,会觉得吵的是毫无收获,你新写的东西真的是唯一的吗?世界上甚至有人实用过。也有无数种视角你没做过,这并不能作为什么谈资
自己做CS,科学,搞得跟信教了一样,主动提AI,主动骂狗shit ,你拿什么荔枝?
#ce #reveng #sb https://tttttt.me/Javaer/895034
哦,刚刚想起来 跳转Block 的层级也是可以做混淆的,但这是 #security 领域的东西,一般人只会用加壳脱壳扫内存,这种技术根本没有普及,业界倾向于选择无法软破解的DRM
obfuscator, 比如,把所有 if else 块变成 while() switch(flag) 的格式,就能让反汇编或retdec 很难读懂。 如果用动态分析找到Block的跳转集散点做记录,就可以反混淆
我就想,正向工程,尚没有什么复制不了的业务功能,何况需要ELF文件才能开展的RE呢? 好好写定义式的专业框架、C-FFI 不香吗
觉得低能我当然理解,“安全论坛”base族不过是入门教程,但这只是我涉足领域的10% ,触类旁通罢了
我是从问题创作自己的解法, 而不是知道问题和“正确的”解法、或知道哪类解法该在什么对线里拿来炫耀 ;那是对编程的玷污🙄
用比上不足比下有余的心态看待技术,真的…… 比你强的大老牛一堆, 比你菜的js框架一堆,挣钱嘛,不寒碜
无非你是会冷门领域,然后 #AI 提供的搜索结果能涉足你领域一些“菜鸟技能”,让你要拼命掩饰它是种威胁了。
但那些根本不是“技术”,只是别个领域里前人做过,而你碰巧重做了。对你而言似是其非、表达不出,勉强在test上通过了,故自以很厉害,
但究其原理就那样,前人的正确错误都犯到,连冗杂都不是原创。
AI只是暴露了这苗头,AI只是向你证明了没有信息差时,那些堆砌就根本不是“技术”;你们硬要喷别人蠢。它就是蠢,但未来就是能干死“只有你懂”的伪门槛。 你可以不信,但最好停止狭技居奇,看看pancake的r2利用好了多少“蠢”领域的技术吧? 强如Haskell又有几个pandoc ?
要是所有程序员早设计好
二进制可视化和RE的IDE插件
等API与脚本化,许多难题甚至都不会出现。编译器。呵呵。我爱旧知,但我更爱真理
我爱算法,但我更敢组合
连API和DSL都写不好的程序员 在用XX范式里百年未变的概念,写模式匹配->更单调语言 的重构器,自以掌握了所有编程里的变与不变,看透了
虚表多态、符号解析、跳转回填、闭包和可暂停化、流控图/Val引用、片段地址和二进制、typing、ptrace/mmap、Locks
等深奥模型,其实连母语 都讲不利索,能称为设计者吗🙄。未知生,焉知死。总结不出自己做了啥学了啥,不是个人肉copilot吗? #PL 人这天才病,可真得养好再上网吧。天才,就要有自己的话语体系?笑料。
大家都写列表处理,都琢磨图求解图重构,就你
NodeGraph<E= CFG_Block>
高人一等,那就永远别做技术交流、别做有工程意义的工具,术语内卷、套路通胀,让这个领域自生自灭吧。ref: 开头 - 开头1
被骂了code
导致误会的disclaimer
Deleted Account:
天天手撮LLVM pass這叫寫不了
我寫編譯器的時候你在幹嘛?
沒意思,天天打稻草人,一句話幾個 非形式謬誤(论证素材虚构/不相干)
(😅原来AST walker+IRBuilder 是啥了不起的技术我的反思 - 我导致被骂的观点
Telegram
Deleted Account in Java 编程语言
我撮pass混淆native code的時候你在哪?
👎3
#android #tool 安卓逆向常见步骤:
使用 APKTool 来反编译 aapt,解出明文xml-资源和dex;重新打包并用 apksigner debug 签名
使用 {JD,jadx}-GUI 来反编译 javac,kotlinc,dx ,观察(混淆函数名的) Java 源代码
尝试 RetDec,Snowman(x86),r2 以反编译 gcc
- #reveng 一般是做不到 dnSpy 那种局部重编译的,只能用来琢磨 frida.re 等函数替换,andbug 等调试断点
- 但手动的 enjarify/dex2jar; smali 能重编译, 就像 hex editors 能修改 C strings 常量
对 UI 了解多少?
UI 的设计需要考虑美观性、易用性、功能性:
- 布局颜色整洁、平衡、一致,图标要易识别。
- 动效流畅、不做作、有趣。
- 指示文字简明、准确、友好等原则。
对 #net TCP 了解多少?
TCP 是传输控制协议,与UDP的乱序丢包不同
- 序列号和确认号来标识和确认数据段。
- 重传机制来处理丢失或者校验失败的数据段。
- 三次握手建立连接,四次挥手断开连接。
- 窗口机制来实现(利他的)流量拥塞控制。
利用 socket 通讯的过程如何?
-
- unix 服务器把它
- 客户端
HTTP/1 在请求响应后就close()掉管道
你还可以用
使用 APKTool 来反编译 aapt,解出明文xml-资源和dex;重新打包并用 apksigner debug 签名
使用 {JD,jadx}-GUI 来反编译 javac,kotlinc,dx ,观察(混淆函数名的) Java 源代码
尝试 RetDec,Snowman(x86),r2 以反编译 gcc
- #reveng 一般是做不到 dnSpy 那种局部重编译的,只能用来琢磨 frida.re 等函数替换,andbug 等调试断点
- 但手动的 enjarify/dex2jar; smali 能重编译, 就像 hex editors 能修改 C strings 常量
对 UI 了解多少?
UI 的设计需要考虑美观性、易用性、功能性:
- 布局颜色整洁、平衡、一致,图标要易识别。
- 动效流畅、不做作、有趣。
- 指示文字简明、准确、友好等原则。
对 #net TCP 了解多少?
TCP 是传输控制协议,与UDP的乱序丢包不同
- 序列号和确认号来标识和确认数据段。
- 重传机制来处理丢失或者校验失败的数据段。
- 三次握手建立连接,四次挥手断开连接。
- 窗口机制来实现(利他的)流量拥塞控制。
利用 socket 通讯的过程如何?
-
socket(AF_INET, SOCK_STRM)
文件 利用了tcp传输层- unix 服务器把它
bind(('0.0.0.0',80)端口)
,开始 s,addr=accept()
新文件- 客户端
connect(dial host,port) 后,用send写入,recv(N)
读取,HTTP/1 在请求响应后就close()掉管道
你还可以用
(AF_BLUETOOTH, , BTPROTO_RFCOMM)
让设备可发现(类似 mDNS); 也可用 bluetooth-agent 1234; 指定配对码GitHub
GitHub - weixinbao/ReverseTool: 逆向工具集合
逆向工具集合. Contribute to weixinbao/ReverseTool development by creating an account on GitHub.
duangsuse::Echo
#py #tool 浏览器缓存 图片 爬虫 python a.py 'x\.com' 200 ~/.cache/chromium/Default/Cache/Cache_Data/* python imgdump.py 'www' 100 `ls --sort time --reverse ~/.cache/chromium/Default/Cache/Cache_Data/*` #code import re,struct, os def ls_cache(urlRegex, kbSizeMin,…
#security #linux #reveng https://mastodon.social/@AndresFreundTec/112180083704606941
https://boehs.org/node/everything-i-know-about-the-xz-backdoor
https://twitter.com/Blankwonder/status/1773921956615877110
发现后门的人还只是一个 pg 社区的开发者
#tool srt 我来示范一下怎么获取全集字幕吧,《国宝特工》
https://pypi.org/project/SpeechRecognition/ 也可以用Azure等云服务
最后,如果能买API Key 的话可以直接用
https://platform.openai.com/docs/api-reference/audio/createTranscription#audio-createtranscription-response_format
#web GPU(类似 waifu4x https://real-cugan.animesales.xyz/) https://huggingface.co/spaces/Xenova/whisper-web
https://huggingface.co/spaces/aadnk/whisper-webui
>#china #ai 代购我不知道,API黄牛倒是不少,但免费的可以薅
据说 Claude.ai 更好,但也封锁了
国区魅力时刻:https://www.bilibili.com/video/BV1ip421U7Qx 大清苏联重现
如果你没有VISA(不能注册Azure的GPT或ASR/TTS),只有微信,可以用 https://openai-hk.com/?i=25623 这个中间商,起步价10块(有更好的推荐请私我.. 😓)
whisper-1 0.006美元/分钟 0.0426人民币 每段限25MB
网页版 https://github.com/openai/whisper/discussions/1018
和离线版是一样的
主要是Whisper的听说性价比在目前能算SOTA吧,而且能顺带充一个GPT4和midj(1个问题3毛钱啊)
可以在 ChatHub.gg (Alt+J) 使用代理商的API,各种 client webui, 本地GLM也都能用
我看了一下,淘宝有卖apikey的(openai不让搜了),gpt3 一口价5块,无需帐号。 也能用Whisper服务 🥰
单靠官方APIkey 只能限权,不能量贩,除了虚拟手机卡注册,这大概是公用号.. ( 我当时也很惊讶gpt4可以直接卖key) 现在gpt3栏大街了,我把sk贴出来:
ssk - v4SRWkhYGKu7EoUeIMJuT3BlbkFJFii1vkU3ZCdO7dyoADrG
我当时也很惊讶gpt4可以直接卖key
https://boehs.org/node/everything-i-know-about-the-xz-backdoor
https://twitter.com/Blankwonder/status/1773921956615877110
发现后门的人还只是一个 pg 社区的开发者
#tool srt 我来示范一下怎么获取全集字幕吧,《国宝特工》
>准备ASR服务+降噪优化
pip install -U openai-whisper demucs
>下载视频全P
yt-dlp -f0 https://www.bilibili.com/video/BV1Rx411j7aw?p={1..52}
>ffmpeg concat all m4a, start seek 110s, to wav 16k
audcat() { for f in `find *.$1|sort -n`; do echo -e "file '$f' \ninpoint $2"; done>ALL.txt; ffmpeg -f concat -safe 0 -i ALL.txt -ac 1 -ar 16000 -sample_fmt s16 -y ALL.wav; }
audcat m4a 110s
>去BGM
#demucs --two-stems vocals ALL.wav; mv separated/*/vocals.wav ALL.wav
#因为配置低就不示范了
>20M一个文件夹(24min一集,建议5集一批), 用同样原理把{1..6}/a.srt 收集回来
find *.m4a|sort -n|pr -aT -10|nl|xargs -L1 ruby -e'puts "mv "+ARGV.rotate.join(" ")'
mkdir {1..6}
for f in `find * -type d`; do cd $f; audcat m4a 110s; cd ..; done
#find -name *.m4a -exec mv {} $PWD \;
>识别生成中文srt
whisper --model base --language Mandarin ALL.wav
>去除回音代表的行
>transform srt file a (using srt.parse), iterate over a[], when a[i] not in a[i-1:i-N], keep it
for i in {1..11};do echo>>a "# $((i*5))前的5集";srt-process -f print --input ep$i.srt >>a; done
import srt,sys
# Set N value for checking against previous N lines
N = 2
_,srt_file=sys.argv
subs = list(srt.parse(open(srt_file)))
noDup=lambda cap,i: cap.content not in [c.content for c in subs[i-N:i] ]
filtered_captions = [cap for i,cap in enumerate(subs) if noDup(cap,i)]
# Save the result to a new SRT file
with open("ep" + srt_file, "w") as f:
f.write(srt.compose(filtered_captions))
https://pypi.org/project/SpeechRecognition/ 也可以用Azure等云服务
最后,如果能买API Key 的话可以直接用
curl https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F file="@/path/to/file/audio.mp3" \
-F "timestamp_granularities[]=segment" \
-F model="whisper-1" \
-F response_format="srt"
https://platform.openai.com/docs/api-reference/audio/createTranscription#audio-createtranscription-response_format
#web GPU(类似 waifu4x https://real-cugan.animesales.xyz/) https://huggingface.co/spaces/Xenova/whisper-web
https://huggingface.co/spaces/aadnk/whisper-webui
>#china #ai 代购我不知道,API黄牛倒是不少,但免费的可以薅
据说 Claude.ai 更好,但也封锁了
国区魅力时刻:https://www.bilibili.com/video/BV1ip421U7Qx 大清苏联重现
如果你没有VISA(不能注册Azure的GPT或ASR/TTS),只有微信,可以用 https://openai-hk.com/?i=25623 这个中间商,起步价10块(有更好的推荐请私我.. 😓)
whisper-1 0.006美元/分钟 0.0426人民币 每段限25MB
curl https://api.openai-hk.com/v1/audio/transcriptions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: multipart/form-data" -F file="@ALL.mp3" -F "timestamp_granularities[]=segment" -F model="whisper-1" -F response_format="srt"
网页版 https://github.com/openai/whisper/discussions/1018
和离线版是一样的
主要是Whisper的听说性价比在目前能算SOTA吧,而且能顺带充一个GPT4和midj(1个问题3毛钱啊)
可以在 ChatHub.gg (Alt+J) 使用代理商的API,各种 client webui, 本地GLM也都能用
我看了一下,淘宝有卖apikey的(openai不让搜了),gpt3 一口价5块,无需帐号。 也能用Whisper服务 🥰
单靠官方APIkey 只能限权,不能量贩,除了虚拟手机卡注册,这大概是公用号.. ( 我当时也很惊讶gpt4可以直接卖key) 现在gpt3栏大街了,我把sk贴出来:
OPENAI_API_KEY= ssk - X6muuhftCItNxCFy6bP7T3BlbkFJlkcCKxV8Js2v3mnoCAtZ
ssk - v4SRWkhYGKu7EoUeIMJuT3BlbkFJFii1vkU3ZCdO7dyoADrG
我当时也很惊讶gpt4可以直接卖key
PyPI
SpeechRecognition
Library for performing speech recognition, with support for several engines and APIs, online and offline.
duangsuse::Echo
— CLI程序服务 getopts; complete 用于获取短参数和提供补齐。少数人用while shift/read;case 来解析 还有一个select in ; do,和py2 print 是异曲同工之败笔,请 ->展示zenity的所有功能,并生成一个简短的MC风格的文字冒险 #!/bin/bash while getopts ":n:s:err" opt; do #?未知 :空 case $opt in n) n=$OPTARG ;; s) s=$OPTARG ;;…
#fuck u cffi, what <cdata>? Is strconv&cdef(errItem=ignore) that hard?
我之前有个dl-preload+ptrace nmhook库,本来可以学 frida.re py魔改二进制的,看来FFI界的烂API又要麻烦我了 😅
Frida is Greasemonkey for native apps
? import frida-tools
sudo frida-trace -i "readdir" telegram-desktop
#ffi.offsetof('struct dirent*','d_name')
log(args[0],Memory.readCString(args[0].add(19)));
变颜色说明参数变了,也只有这些信息量
后来结合
r2 -d $(pidof telegram-desktop)
; 每次选文件时Ctrl+C再 dc; V发现 arg0 处啥都没,但后面是dirent* 的游标
查了一下才知道要通过fd读取,不过好像不是tg在读文件夹……
log(Memory.readU32(args[0]));
readlink /proc/$(pidof telegram-desktop)/fd/*
完全看不到在选的位置
#reveng 只是持久化还是要依靠 Xposed
Java.perform(function() {https://whitebird0.github.io/post/Frida的Python库使用.html#:~:text=值无法交给python继续使用
var Button = Java.use("android.widget.Button");
Button.setOnClickListener.implementation = function(listener) {
listener.onClick.implementation=()=>console.log("Button onClick stopped");
// Call the original onClick method
return this.setOnClickListener(listener);
};
});
https://blog.csdn.net/freeking101/article/details/107489590
btw. 这个作者还用FastAPI暴露函数参数…… 说明 Frida.re 完全是不支持跨语言和ffi的
Whitebird's Home
about
Android逆向学习笔记——使用Python库调用Frida | Whitebird's Home
#reveng #java #net
>一眼盯疹,11年前的这编译器还不如EDSL,不就相当于加个auto x=mat2x2() ,这算什么简化gl
至少我手上需要读取fn.kwarg ,要提取({k=1})=>的默认,你说该不该留源码
jvm/clr那种栈机,高级版gnu dc, 一个jadx/dnspy就还原了,不il2cpp不混淆掉命名,怎么都没必要
py还默认发布pyc呢
duangsuse:
对了,说起来jvm->clr应该可以转化吧,这样就能用对方的反编译器
https://github.com/ikvmnet/ikvm/blob/main/README.md
- Convert bytecode to a .NET assembly to directly access its API in a .NET project
上位虚拟机当然能兼容执行jar了
dnSpy(wine) v6.final Install-Package IKVM
一共200m https://github.com/dnSpy/dnSpy/releases
https://github.com/ikvmnet/ikvm/releases/download/8.8.1/IKVM-8.8.1-image-net8.0-linux-x64.zip
可以配合调试 unity games https://github.com/K0lb3/UnityPy?tab=readme-ov-file#mesh
>一眼盯疹,11年前的这编译器还不如EDSL,不就相当于加个auto x=mat2x2() ,这算什么简化gl
至少我手上需要读取fn.kwarg ,要提取({k=1})=>的默认,你说该不该留源码
jvm/clr那种栈机,高级版gnu dc, 一个jadx/dnspy就还原了,不il2cpp不混淆掉命名,怎么都没必要
py还默认发布pyc呢
duangsuse:
对了,说起来jvm->clr应该可以转化吧,这样就能用对方的反编译器
https://github.com/ikvmnet/ikvm/blob/main/README.md
- Convert bytecode to a .NET assembly to directly access its API in a .NET project
上位虚拟机当然能兼容执行jar了
dnSpy(wine) v6.final Install-Package IKVM
一共200m https://github.com/dnSpy/dnSpy/releases
https://github.com/ikvmnet/ikvm/releases/download/8.8.1/IKVM-8.8.1-image-net8.0-linux-x64.zip
可以配合调试 unity games https://github.com/K0lb3/UnityPy?tab=readme-ov-file#mesh
GitHub
ikvm/README.md at main · ikvmnet/ikvm
A Java Virtual Machine and Bytecode-to-IL Converter for .NET - ikvmnet/ikvm
duangsuse::Echo
#life #statement 🌚终于知道为什么千里冰封、王垠会发疯了 我现在完全不认为他们是精致利己者。 软件工程界抛弃他们,B站无人在意他们, 他们又曾拒绝过哪位求知者呢? 同是沦落人,就不要装得纯粹无私了。 我在这里用触屏“为了分享感悟” “参与头脑风暴”,打的每一个字,查的每一个链接,都是浪费时间。 应该早点返乡拿电脑写点好玩的, 直到有天重演庸俗的『山顶见』。 怎么可能呢?我是说对原理出言不逊,却在应用成功后弯道超车的道理。 如果不是图你的市场大 简单来说,中文圈,尤其是崇尚存在即合理、Talk…
有人可能觉得,我这么杠是想显得自己很牛逼,或者多管闲事 #plt #statement
但如果我为了be nice,放弃对烂代码、生搬硬套的术语、八股文和样板代码的态度
对魔法师、“生产环境就必须复杂”的观念做个好好先生,只是帮魔法们去科普而不化简重构的话……
新生程序员怎么发挥他们的创想
凭什么老程序员提出的概念、技术、样板代码,能成为技术栈选型上的错误、带偏最初的设想?
其实,今天的前端dom-url参数转JSON-后端sql或kv
有那么难理解吗,但是要学的仍然一大堆。比如cookie,handle,也就是fd=open(File) 这类RPC对象号吧,这居然能成为一种知识点么? 只要视野放的足够广,许多50行说不明白的“新技术”,都只不过是旧思想糅杂了奇技淫巧 。
我不喜欢这样,这撕裂显然是利好libs API维护者,但对用户们毫无意义。是可以统一、省略,专心为业务服务的复杂性。
我曾被 @程序员鱼皮 和 @drakeet(当然是怪我 #reveng 他的app了) 两个技术人拉黑
都是因为说了类似「后生可畏,有些人的100行代码比七八百行更管用」,今天也一样。
这就是客观存在的事实。比如 VanJs.org 用300行实现reactive,许多人还跟在miniVue后面买课还学不会呢。
用更好理解的: 《算法 in C++》 是否符合我上面说的100行代码(而不是“1万小时定律”)原理呢?
更别说 https://github.com/duangsuse-valid-projects/tkgui 的拿数据打脸了,这在元编程(比各种算法更加通用) 里,简直就是常识。
这并不是nice与否,而是对谁nice
我倾向于对未来nice,因为那才能进步。
并非不择手段,但我下决心要前进
但如果我为了be nice,放弃对烂代码、生搬硬套的术语、八股文和样板代码的态度
对魔法师、“生产环境就必须复杂”的观念做个好好先生,只是帮魔法们去科普而不化简重构的话……
新生程序员怎么发挥他们的创想
凭什么老程序员提出的概念、技术、样板代码,能成为技术栈选型上的错误、带偏最初的设想?
其实,今天的前端dom-url参数转JSON-后端sql或kv
有那么难理解吗,但是要学的仍然一大堆。比如cookie,handle,也就是fd=open(File) 这类RPC对象号吧,这居然能成为一种知识点么? 只要视野放的足够广,许多50行说不明白的“新技术”,都只不过是旧思想糅杂了奇技淫巧 。
我不喜欢这样,这撕裂显然是利好libs API维护者,但对用户们毫无意义。是可以统一、省略,专心为业务服务的复杂性。
我曾被 @程序员鱼皮 和 @drakeet(当然是怪我 #reveng 他的app了) 两个技术人拉黑
都是因为说了类似「后生可畏,有些人的100行代码比七八百行更管用」,今天也一样。
这就是客观存在的事实。比如 VanJs.org 用300行实现reactive,许多人还跟在miniVue后面买课还学不会呢。
用更好理解的: 《算法 in C++》 是否符合我上面说的100行代码(而不是“1万小时定律”)原理呢?
更别说 https://github.com/duangsuse-valid-projects/tkgui 的拿数据打脸了,这在元编程(比各种算法更加通用) 里,简直就是常识。
这并不是nice与否,而是对谁nice
我倾向于对未来nice,因为那才能进步。
并非不择手段,但我下决心要前进
👍1