炼丹随笔

做各种乱七八糟实验时的一些小记

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编码相同输入

Author

SGSG

Posted on

2026-10-17

Updated on

2026-10-19

Licensed under