Android NDK 使用llvm 混淆
在逆向分析中 碰到 NDK被 llvm 混淆的软件越来越多了, 所以自己搭建环境编译一些小项目 分析分析环境
Ubuntu 14.04 64bit
先将ndkllvm.tar 解压到 /opt 目录中 命令如下
$ sudo tar -xv -f ndkllvm.tar -C /opt
然后 配置环境变量
$ vim ~/.profile//在文件末尾添加
export LLVM=/opt/android-ndk-r10b
加载环境变量
$ source ~/.profile
然后可进入 llvm_project/hello 目录 通过
$ $LLVM/ndk-build //进行编译项目了
**** Hidden Message *****
沙发是我的,我来支持空道版主了。有人坐我大腿上么{:soso_e120:} 本帖最后由 wx_f1Jji177 于 2015-5-4 11:31 编辑
llvm还可以混淆代码吗,研究下, 资源好大呀,其实藤椅坐着也是不错的,{:soso_e141:}
多谢分享。学习下。 @空道。。放个bin上来看看,混淆成啥样了~ 本帖最后由 wx_f1Jji177 于 2015-5-4 13:12 编辑
飘云 发表于 2015-5-4 12:26
@空道。。放个bin上来看看,混淆成啥样了~
#include <stdio.h>
int main(int argc, char **args)
{
int i = 0;
for(i = 0; i < 10; i++)
{
if(i % 2)
{
printf("ou:%d\n", i);
}
else
{
printf("ji:%d\n", i);
}
}
printf("hello\n");
return 0;
}
ida F5的效果:
int __fastcall main()
{
signed int v0; // r0@1
signed int v1; // r4@1
const char *v2; // r0@7
int v3; // r0@39
char v5; // @0
v0 = 428080492;
v1 = 0;
do
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v0 <= -902473546 )
{
if ( v0 == -1066363283 )
v0 = 1905947092;
}
if ( v0 > -593865293 )
break;
if ( v0 == -902473545 )
{
v2 = "ji:%d\n";
goto LABEL_8;
}
}
if ( v0 > -480917249 )
break;
if ( v0 == -593865292 )
v0 = -1066363283;
}
if ( v0 > -429563627 )
break;
if ( v0 == -480917248 )
v0 = 1980625991;
}
if ( v0 > -288824782 )
break;
if ( v0 == -429563626 )
{
puts("hello");
v0 = 1980625991;
}
}
if ( v0 > 141628117 )
break;
if ( v0 == -288824781 )
v0 = -593865292;
}
if ( v0 > 428080491 )
break;
if ( v0 == 141628118 )
v0 = 893803981;
}
if ( v0 > 778582159 )
break;
if ( v0 == 428080492 )
{
v0 = -480917248;
if ( v1 < 10 )
v0 = 778582160;
}
}
if ( v0 > 893803980 )
break;
if ( v0 == 778582160 )
v0 = 893803981;
}
if ( v0 > 1124738897 )
break;
if ( v0 == 893803981 )
{
v3 = (v1 ^ 0xFFFFFFFE) & v1;
if ( (v1 ^ 0xFFFFFFFE) & v1 )
LOBYTE(v3) = 1;
v5 = v3;
v0 = 1769065312;
}
}
if ( v0 > 1285514747 )
break;
if ( v0 == 1124738898 )
{
v0 = 2110947756;
++v1;
}
}
if ( v0 > 1547117937 )
break;
if ( v0 == 1285514748 )
v0 = -593865292;
}
if ( v0 <= 1705860464 )
break;
if ( v0 > 1769065311 )
{
if ( v0 > 1905947091 )
{
if ( v0 > 1980625990 )
{
switch ( v0 )
{
case 1980625991:
puts("hello");
v0 = 1547117938;
break;
case 2110947756:
v0 = 428080492;
break;
case 2133513828:
v2 = "ou:%d\n";
LABEL_8:
printf(v2, v1);
v0 = -288824781;
break;
}
}
else if ( v0 == 1905947092 )
{
v0 = 1124738898;
}
}
else if ( v0 == 1769065312 )
{
v0 = -902473545;
if ( v5 )
v0 = 2133513828;
}
}
else if ( v0 == 1705860465 )
{
v0 = 1124738898;
++v1;
}
}
}
while ( v0 != 1547117938 );
return 0;
}
是复杂的多了,
连android都有llvm混淆了。。。不带这么玩的 多出了一些无用东西,不算太麻烦 手机上的东西,混淆这么多,不怕运行不起来? 估计混淆之后 程序不会运行缓慢 就好,