-
-
[原创]以往讲的都是如何去除花指令,这次用最简单的例子如何在代码中使用花指令
-
发表于:
2024-5-13 09:49
3657
-
[原创]以往讲的都是如何去除花指令,这次用最简单的例子如何在代码中使用花指令
我是一名从事反欺诈&风控&设备指纹相关的工作,最近对花指令进行了学习与思考。
什么是花指令
花指令是一些无用的指令代码,它插入到正的源码中,不会对源码产生影响,但是对反编译工具会产生影响,如ida,一块花指令就可以让ida反编译失败,而正常的商用会添加上成千上百次的花指令,对逆向人员是个极大的挑战
我们常常想逆向看看竞争对手的一些技术手段,而花指令会成为第一个坎,很多人第一关都过不去,后面的更不用看了。
这篇文章是让一些技术小白学会使用花指令来保护自己的so代码。文章附件会加上项目源码以供参考。
我看过之前前辈写的花指令相关的文章,很多都比较复杂高端,让入门小白望而却之,啥都别说,先看效果截图。
没添加花指令的效果
1 2 3 4 5 6 7 8 9 | extern "C" JNIEXPORT jstring JNICALL
Java_com_example_huazhilingout_MainActivity_stringFromJNI(
JNIEnv * env,
jobject / * this * / ) {
std::string hello = "Hello from C++1" ;
std::string hello1 = "Hello from C++2" ;
std::string hello2 = "Hello from C++3" ;
return env - >NewStringUTF(hello.c_str());
}
|
ida中的展示
添加了花指令的效果
原理篇
网上看过很多花指令的案例我就不一一列举,而最主流,最难搞的花指令就是这种br x8跳转的花指令,所以今天重点介绍这种
static attribute((always_inline)) void Junk_code_012() {
#ifdef aarch64
int arr[]={0x1,0x14,0x4,0x03,0x1,0x032,0x18};
register long x7 asm("x7") = (long) arr;
asm volatile(
"mov x8,#0x1\n"
"mov x10,#0x2\n"
"ldr w10,[x7,#24]\n"
// 这里的点是关键,代表当前pc
"adr x9, .\n"
"mov x7, #03\n"
"add x9, x9, x10\n"
"mul x8, x9, x8\n"
"adr x9,.\n"
"br x8\n":"=r"(x7):"0"(x7):"memory", "cc"
);
#endif
}
这里的花指令代码,采用c跟汇编融合变成,目的是想传入个数组给汇编代码,这就是目前各大厂采用的查表式的花指令,即x8的br跳转,需要从内存表中动态查询要跳转到哪个位置。
我们在需要花指令混淆的方法源码中,加上Junk_code_012()的花指令代码调用即可。
那问题来了,对于成败上千的花指令添加要怎么做呢? 无非是写个脚本,在编译前源码阶段用脚本对每行源码插入花指令方法的调用。
上面的花指令方法可以有很多变种,你可以硬编码写多个花指令方法出来,动态的选择要采用哪个进行插入,这样可以增加逆向难度。
具体操作
1 要添加花指令首先项目中的cmakelist要加上汇编的支持enable_language(ASM)
2 需要花指令混淆的代码中添加Junk_code_012()方法的调用,可以添加多行
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)