(Translated by https://www.hiragana.jp/)
GitHub - mizukiyyds/asm_obfuscator: 非编译时代码混淆,包括代码块拆分、代码乱序、常量加密、代码变异、抹除jcc、局部混淆等,主要提供框架以及思路
Skip to content

编译时代码混淆こんこう包括ほうかつだい码块拆分、だい码乱じょつねりょうみつだい码变异、抹除jcc、局部きょくぶ混淆こんこうとう主要しゅよう提供ていきょうかまち以及おもえ

Notifications You must be signed in to change notification settings

mizukiyyds/asm_obfuscator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

demo crackme 链接:https://www.52pojie.cn/thread-1746849-1-1.htmlだい码是ただ支持しじx32,ぼつ处理じゅう定位ていいややほろあらため一下就可以兼容x64,おもえいち样的,简单说下实现おもえ

1、读取一个可执行文件,判断はんだんPEぶんけん、ELFぶんけんとうとう如用MZ标志PE00标志判断はんだん(PE结构てき识)

2、读取ぶんけんきさき定位ていいいたよう混淆こんこうてきだい码的位置いち(也是PE结构てき识,以先ぶんけん按内そん分布ぶんぷ读取いた缓冲需要じゅよう注意ちゅういてきぶんけん分布ぶんぷないそん分布ぶんぷいち样的,对齐てき大小だいしょういち样)

3、ひっさげ二进制数据后用反汇编工具(这里ようてきcapstone,它提供ていきょうりょう强大きょうだいてき分析ぶんせきこうのうはん汇编

4、しかきさき对汇编代码进ぎょう混淆こんこう具体ぐたいてき混淆こんこう方法ほうほう实现ざい下面かめん叙述じょじゅつ

5、はた混淆こんこうきさきてき汇编だい码用汇编引擎生成せいせい二进制硬编码(这里ようてきkeystone)

6、しんぞういち个节(注意ちゅういこう验节ひょういやゆうあし够空间新ぞう),そん混淆こんこうきさきてきだい码,しかきさきざい混淆こんこう开始てき位置いち以用いち个jmp指令しれいとべ转到しん增加ぞうかてき节里てきだい码,しかきさきはたjmp指令しれいきさきてき原始げんし指令しれい全部ぜんぶ抹除

7、保存ほぞんぶんけん

注意ちゅうい上述じょうじゅつ仅为いち个思こと实上你也以用どう样的方法ほうほううつしいち个vm出来できただ过要复杂てき,另外,とう多段ただんだい码进ぎょうこん淆时,さいこう存在そんざいいち个节さとしか混淆こんこう几处就不够地方ちほうしんぞう节了,ほん目的もくてきだい码还ぼつ实现。

混淆こんこうてき方法ほうほう具体ぐたい实现:

如果你看完了かんりょう以上いじょうおもえ你应该能发现,这就しょうだい混淆こんこう变成りょう纯纯てきくし处理(如果你学过编译原理げんりほん目的もくてきだい码对你来说就しょう辣鸡)

つねりょう混淆こんこう

mov eax, 0x401000 变形为

mov eax, 0x401000 + rand

lea eax, [eax-rand]

上述じょうじゅつそく为一个简单的等价变形,需要じゅよう注意ちゅういてきlea指令しれい并不かいかげ响eflags,如果使用しようsub指令しれい而不lea指令しれい,你需よう保存ほぞんeflags,

mov eax, 0x401000 + rand

pushfd

sub eax, rand

popfd

以处てき指令しれい包括ほうかつただしきり

push たてそくすう

mov よせそんたてそくすう

mov ないそんたてそくすう

局部きょくぶ混淆こんこう

添加てんか无用てきstc,cmc指令しれいとう

いちじょう指令しれい为mov eax,123

你可以在此语ぜん插入そうにゅういちじょう neg eaxとうとう

函数かんすう调用あずかとべ混淆こんこう

call addr变形为

push かえしかい

jmp addr

あるもの

pushかえしかい

push addr

ret

ひとしひとし

ぼうせい态跟踪:

让ida无法判断はんだんうずたか栈、かえしかいてきじょう

如你使用しよう[esp]てき值作为下いちじょう指令しれいてき

push reg mov reg,addr xchg reg, [esp] ret

あるものようjmp eax这样てき指令しれい,ida无法判断はんだんeaxてき值是多少たしょう,也就找不いたしもいちじょう指令しれいざい

だい码块拆分らんじょややほろゆうてん复杂)

さきしょうだい码块按随つくえ长度ぶん

1->2->3->4->5->6

しかきさきずいつくえ顺序

3 1 4 5 6 2

如果じょごうひだり边不とう于右边-1,代表だいひょう这一块代码在乱序后还是连接在一起比如4,5,6这块だい

3 1これ间就需要じゅよう插入そうにゅういち个jmp指令しれい,从3とべ转到4てきjmp

1 4也需よう插入そうにゅういち个1とべ转到2てきjmp

抹除jcc

かり设有如下汇编指令しれい

0x400000: je 0x400010

...... //とべ转不成立せいりつ

0x400010: //とべ成立せいりつ

么可以发现这じょうjcc指令しれいよう么不成立せいりつ,执行いちぎょう0x400005,よう么跳こう0x400010

么可以通过动态计さん算出さんしゅついち个值,这个值只ゆう两种可能かのう,就是这两个地しかきさきようjmp eax,call eax,push ret类的转移过去

0x400005 0x400010 0x400005 0x400010

0 1 1 0

以用乘法じょうほう、and运算类的实现

せい个代码的实现还考虑了以迭だい层,还可以不どう混淆こんこう方法ほうほう间按てい义顺じょ套来套去,さいじょうゆうだい码乱じょよう混淆こんこうどう样的ばん方法ほうほう实际じょう并不很好じょ混淆こんこう,并且如果ふさがにゅう无用すうすえばん还原可能かのうさらこま

About

编译时代码混淆こんこう包括ほうかつだい码块拆分、だい码乱じょつねりょうみつだい码变异、抹除jcc、局部きょくぶ混淆こんこうとう主要しゅよう提供ていきょうかまち以及おもえ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages