空道 发表于 2015-5-4 10:54:30

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 *****

Dxer 发表于 2015-5-4 11:14:49

沙发是我的,我来支持空道版主了。有人坐我大腿上么{:soso_e120:}

0xcb 发表于 2015-5-4 11:27:21

本帖最后由 wx_f1Jji177 于 2015-5-4 11:31 编辑

llvm还可以混淆代码吗,研究下, 资源好大呀,其实藤椅坐着也是不错的,{:soso_e141:}

yfw123 发表于 2015-5-4 11:40:43

多谢分享。学习下。

飘云 发表于 2015-5-4 12:26:09

@空道。。放个bin上来看看,混淆成啥样了~

0xcb 发表于 2015-5-4 13:09:47

本帖最后由 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;
}
是复杂的多了,



F8LEFT 发表于 2015-5-4 13:19:10

连android都有llvm混淆了。。。不带这么玩的

King, 发表于 2015-5-4 16:13:24

多出了一些无用东西,不算太麻烦

gujin162 发表于 2015-5-4 21:15:42

手机上的东西,混淆这么多,不怕运行不起来?

white1y 发表于 2015-5-5 10:55:55

估计混淆之后 程序不会运行缓慢 就好,
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: Android NDK 使用llvm 混淆