做各种乱七八糟实验时的一些小记
gemma4_for_unflatten
之前有想过使用神经网络去学习一些混淆的pattern,然后做成区别于传统规则引擎的去混淆方案
那么有什么混淆比较适合这种方案呢,分析了几种情况
- 双分支间接跳转,规律过于明显,用传统计算方式更好
- 花指令,现在基本sdk都弃用
- 各种花里胡哨的间接跳转,用lr跳的,或者br然后解密地址跳的,模式之间关联过弱,不好学习也不好造数据
- 各种MBA,直接用Z3更好,复杂不透明谓词运算本地模型大概率算错
- 平坦化,形状很多,但通过都是通过状态变量和
dispatch识别控制流,传统方案的弱点在于只能使用规则引擎识别dispatch
于是就发现了平坦化似乎是一个比较好的方向,因为它既有规律,但是规律又没有强到可以用规则引擎通杀
gpu使用的是7900xt 20g,跑了下极限测试,如果选gemma4 12b的话,qlora 4NF大概在44k context下爆显存,所以最后选择就选择了gemma4 12b按照40k任务context长度训练
训练基础设施搭建
pytorch的实现全是gpt做的,没啥好说的,然后实现了一个bn的插件,用来导出函数cfg,大概格式是这样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| arch: aarch64 entry: b0 registers: - id: r0 abi: argument_1 - id: r1 abi: argument_0 - id: r2 abi: temporary - id: r3 abi: temporary - id: r4 abi: temporary data: [] blocks: - id: b0 code: 'sub sp, sp, #0xe0
str r0.x, [sp, #8]
str r1.x, [sp, #0x10]
mov r2.w, #0x370e
movk r2.w, #0x310e, lsl #16
str r2.w, [sp, #0xdc]
b b97' out: - to: b97 kind: jump - id: b1 code: 'ldr r2.x, [sp, #8]
mov r3.x, zero.x
str r3.x, [sp, #0xd0]
mov r3.w, zero.w
str r3.w, [sp, #0xcc]
subs r2.x, r2.x, #6
b.lo b98' out: - to: b98 kind: taken - to: b2 kind: fallthrough
|
然后同样准备了一个yaml的输出schema,用bn插件直接解析整函数的恢复控制流并在workflow中重建cfg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| entry: b0 blocks: b0: members: - b0 - b1 condition: b.lo taken: b24 fallthrough: b3 b3: members: - b3 - b4 - b5 condition: b.eq taken: b7 fallthrough: b3 b7: condition: tbz.w:4 taken: b9 fallthrough: b8 b8: jump: b10 b9: fallthrough: b10 b10: members: - b10 - b11 - b12 - b13 - b14 jump: b15 b15: members: - b15 - b16 condition: b.eq taken: b18 fallthrough: b15 b18: members: - b18 - b19 condition: b.lo taken: b18 fallthrough: b21 b21: members: - b21 - b22 condition: b.lo taken: b21 fallthrough: b24 b24: return: true
|
训练样本准备
第一轮样本是准备了十几组加密,哈希算法的函数,还准备大量随机组合的数值变换函数,然后准备了9种纯平坦化的pass,范围大概是单分发器,单层多分发器,多层分发器这几种,最好能交叉出约2000组二进制
从中抽了约300组作为测试集
v0.1
v0.1的训练大概跑了48h,最后发现似乎有答案泄露的情况,因为测试集是和训练集是同源的,测试的正确率大约是75%,但是换了一批没参与训练的源码,同pass,正确率就只剩37%了
v0.2
v0.2在v0.1的基础上添加了更多源码类型,包含了更多循环操作,switch结果,数据结构操作
似乎稍微有效改善了模型能力,采用另一组均未参与v0.1和v0.2训练的源码作为测试集,正确率从28%上升至66%
v0.3
v0.3进行了词表改造,原模型的默认词表大小为262k,包含了多种对任务没有帮助的非英语分词,这里能删掉约33%的embedding,能节省约1gb的显存开销,然后额外将输入输出yaml的固定关键字和大量arm64指令,寄存器切片添加为新embedding,预期相比v0.2能使用更少的token编码相同输入