刚才听歌的时候发现了一些不错的歌声合成引擎
http://www.sharpkey.net/
http://www.ai-muta.com/
做得不错, 开源与否我大概不清楚(90% 不开源, 且只支持 Windows)
如果好用的话, 这些还没出道的虚拟歌手创建亚种非常适合给 GeekApk 娘配音 😄
http://www.sharpkey.net/
http://www.ai-muta.com/
做得不错, 开源与否我大概不清楚(90% 不开源, 且只支持 Windows)
如果好用的话, 这些还没出道的虚拟歌手创建亚种非常适合给 GeekApk 娘配音 😄
boxstar Sharpkey的开发者
boxstar:不会调教的程序员不是好歌手
rt, 是个人开发
不过我之前看了他发的那个出道曲, 感觉还是不够, 曲子/填词和 pv 都是(没有考虑歌声合成质量)
duangsuse::Echo
Sharpkey 是个人开发缘故更简洁一些, 可能只有一个官方音源和一个编辑器
电音感比较强, 和 V4 比 V4 歌声更自然
不过也有好处
不过也有好处
duangsuse::Echo
工程列表: #reveng 相关 修改 AXMLEditor 修改 AndBug 自己写一 纯 Java AXML ser/deser 库 自己写一款纯 Kotlin 的 JDWP 库 (可能需要一段时间) (无疑的) demangler 反混淆工具 #PL 相关 KtLime, 可能又放到 详细信息可以在 github 上项目页找到 #geekapk GeekApk, 有可能完成最上面两个就会开始
感觉奇怪的是为什么
也一直没有人专门为它开发一个完全的
只有人开发了解析库,甚至
AXML 格式那么详细了也一直没有人专门为它开发一个完全的
Java 序列化/反序列化库只有人开发了解析库,甚至
AXMLEditor 都是通过解析辅助直接修改 bytes 完成的demangler 实际上是为了解决 proguard 对类移动/更名的操作带来的麻烦
现在的 Java/Kotlin 应用会使用各种类库, 这些类库大部分都是开源的, 且受到版本控制 可以随意获取任意时段的代码
(from drakeet.me)
Proguard 有这种功能, 可以将类随意操作 更名/移动, 变更方法的名字, 以此提升逆向工程的工程量
但是有一点是不变的 — 类的
不管 Proguard 怎么混淆都没法改变,
Proguard 可以把下面这个类改成更不容易辨识的格式, 但他们在行为上是等价的:
我们在外面使用这个类库
但是在使用 Proguard 混淆后, 他们会变成这样(使用混淆字典还可以有更骚的操作 XD):
假设你有
这一切都以 Smali AST 为基础操作(不是所有 DEX 都可以 dex2jar, 但几乎 100% 能被 Dalvik 加载的 DEX 都至少经过少量处理后可以 baksmali)
deobfs 完后的代码看起来是这样的:
在软件不同版本重新混淆时保持逆向工程进度也有帮助 (重混淆时即使类没有修改其标识符/位置也会变化 但 demangler 可以检测到行为数据完全相同的类并自动反混淆)
现在的 Java/Kotlin 应用会使用各种类库, 这些类库大部分都是开源的, 且受到版本控制 可以随意获取任意时段的代码
-repackageclasses
-repackageclasses 这条规则配置特别强大,它可以把你的代码以及所使用到的各种第三方库代码统统移动到同一个包下,可能有人知道这条配置,但仅仅知道它还不能发挥它最大的作用,默认情况下,你只要在 rules 文件中写上 -repackageclasses 这一行代码就可以了,它会把上述的代码文件都移动到根包目录下,即在 / 包之下,这样当有人反编译了你的 APK,将会在根包之下看到 成千上万 的类文件并列着,
(from drakeet.me)
Proguard 有这种功能, 可以将类随意操作 更名/移动, 变更方法的名字, 以此提升逆向工程的工程量
但是有一点是不变的 — 类的
超类(递归判断类是否相等), 字段数目, 类型, 初始值, flag, 方法数目, 除了方法名外的标识符, 方法逻辑(同样递归判断变量类型) 等行为数据不管 Proguard 怎么混淆都没法改变,
Proguard 可以把下面这个类改成更不容易辨识的格式, 但他们在行为上是等价的:
package org.example
class Animal {
String name;
Animal(String name) { this.name = name; }
Animal() { this.name = "foo"; }
String getName() { return this.name; }
void setName(String val) { this.name = val; }
}
class Duck extends Animal {
Duck() { super("duck"); }
void quack() { System.out.println("quack!"); }
}
我们在外面使用这个类库
// snip
import org.example.Duck;
public void main(String[] args) {
Duck swissie = new Duck();
swissie.quack(); // quack!
}
但是在使用 Proguard 混淆后, 他们会变成这样(使用混淆字典还可以有更骚的操作 XD):
package wwwwwwwwWwWww
class Qaaaq { // 现在是 LwwwwwwwwWwWww/Qaaaq
String sasa;
Qaaaq(String dsdsdsds) { this.sasa = dsdsdsds; }
Qaaaq() { this.sasa = "foo"; }
String emmmmmm() { return this.sasa; }
void emmm(String val) { this.sasa = val; }
}
class EWsespdcs extends Qaaaq {
EWsespdcs() { super("duck"); }
void Ensure() { System.out.println("quack!"); } // 如果使用了类似「代理方法」来混淆这个语句,那就可以用 simplify 反混淆, demangler 不是做这种事情的
}
// snip
import wwwwwwwwWwWww.EWsespdcs;
public void main(String[] args) {
EWsespdcs swissie = new EWsespdcs();
swissie.Ensure(); // quack!
}
假设你有
Animal 类的源代码, demangler 会帮你锁定被替换标识符/移动位置 的 Animal 类, 并把它移动回去, 更新代码中的引用这一切都以 Smali AST 为基础操作(不是所有 DEX 都可以 dex2jar, 但几乎 100% 能被 Dalvik 加载的 DEX 都至少经过少量处理后可以 baksmali)
deobfs 完后的代码看起来是这样的:
package org.example
class Animal { // 现在是 Lorg/example/Animal
String name;
Animal(String name) { this.name = name; }
Animal() { this.name = "foo"; }
String getName() { return this.name; }
void setName(String val) { this.name = val; }
}
package wwwwwwwwWwWww
class EWsespdcs extends Animal {
EWsespdcs() { super("duck"); }
void Ensure() { System.out.println("quack!"); }
}
// snip
import wwwwwwwwWwWww.EWsespdcs;
public void main(String[] args) {
EWsespdcs swissie = new EWsespdcs();
swissie.Ensure(); // quack!
}
在软件不同版本重新混淆时保持逆向工程进度也有帮助 (重混淆时即使类没有修改其标识符/位置也会变化 但 demangler 可以检测到行为数据完全相同的类并自动反混淆)