virus.html.evilhtml.gen 360,360官网脱壳分析-2017-04-04

本帖最后由 欧阳锋锋 于 2017-4-5 00:00 编辑

网上已经有很多360的脱壳教程了,看了好多后就想自己动手调试下。感谢各位大神无私分享的文章,本菜才能顺利过掉反调。本人是初涉逆向,

水平有限,秉着学习的目的,发帖分享自己的逆向学习过程,肯定会有些错误或分析不正确的地方,欢迎大牛指正,赐教,本菜鸟不胜感激。只是可以dump出

dex,还无法进行还原、安装运行。onCreate函数被动态注册为native,可以在so中找到注册的地址,可以结合静态和动态调试,有时间的话会继续研究下去。

第一过反调试

主要在JNI_Onload函数的case 29,case33上下断点

1、  第一处反调试,应用调试的特性参考文档http://www.evil0x.com/posts/26301.html

55fd2b2273b5a8b4531f72773c469d6e.gif

1.png (25.76 KB, 下载次数: 50)

2017-4-4 23:09 上传

2、映射linker

55fd2b2273b5a8b4531f72773c469d6e.gif

2.png (17.54 KB, 下载次数: 48)

2017-4-4 23:10 上传

3、查看并修改符号rtld_db_dlactivity的值

0x2B= open("/system/bin/linker");第一处反调试

length= lseek(0x2B,0,SEEK_END);

lseek(0x2B,0,SEEK_SET);

mmap(NULL,0,1,2,0x2B,0)

在程序头表中查找第一个PT_LOAD段的p_vaddr

找到PT_DYNAMIC段 = r3 =0x0000FED4

r1= 基址+0x0000FED4

在动态段查找DT_STRTAB偏移为0x00000258 ,计算内存偏移

DT_SYMTAB偏移为0x00000168 ,计算内存偏移

找到符号rtld_db_dlactivity :基址+Elf32_Sym->st_value

55fd2b2273b5a8b4531f72773c469d6e.gif

3.png (1.49 KB, 下载次数: 50)

2017-4-4 23:11 上传

查看0x400E3BF8内存地址的指令

55fd2b2273b5a8b4531f72773c469d6e.gif

4.png (13.93 KB, 下载次数: 49)

2017-4-4 23:12 上传

将DE 10修改为nop指令 C0 46===>过掉第一处反调试 4、

第二处反调,此处LR的值为strtol,将其返回值修改为0,过掉第二处反调。

0x2E= open("/proc/self/status");                           ;

strstr(read(),"TracePid");

strtol();

close(fd)

55fd2b2273b5a8b4531f72773c469d6e.gif

5.png (30.42 KB, 下载次数: 49)

2017-4-4 23:13 上传

55fd2b2273b5a8b4531f72773c469d6e.gif

6.png (60.98 KB, 下载次数: 48)

2017-4-4 23:14 上传

5、第三处反调    fd =open("/proc/net/tcp");第三处反调试

read();

strstr(xxx,"00000000:5D84");0x5D8A=23946

调试的时候可以不用远程端口号,或者修改内存中的值过掉反调试

55fd2b2273b5a8b4531f72773c469d6e.gif

7.png (12.2 KB, 下载次数: 48)

2017-4-4 23:15 上传

6、第四处反调

1)、文件监控线程, nop掉

将736E0DE8地址nop,过掉文件监控线程

pthread_create ===>sub_4B50 //第四处反调试

{

inotify_init

inotify_add_watch

select

}

55fd2b2273b5a8b4531f72773c469d6e.gif

9.png (19.94 KB, 下载次数: 49)

2017-4-4 23:16 上传

2)、文件监控线程,nop掉

55fd2b2273b5a8b4531f72773c469d6e.gif

10.png (30.46 KB, 下载次数: 49)

2017-4-4 23:16 上传

3)、文件监控线程,nop掉

55fd2b2273b5a8b4531f72773c469d6e.gif

12.png (16.54 KB, 下载次数: 49)

2017-4-4 23:18 上传

4)、文件监控线程,nop掉

总共有四处启动文件监控线程的点。8. 第五处反调360会time()函数,通过比较差值,判断程序是否被调试,简单点,可是在time()函数上下断点,让其返回相同的,固定的值。刚开始调试可能会花

费大量的时间在反调试上面,等熟悉了各个反调试点后,可以进行注入,hook这些函数,从而过掉反调试,会省去大量无畏的时间。至此反调试全部去掉,后边

就没有反调试了,进程开始原始dex的解密加载操作。

第二dex解密、加载

1 、调试过程中,通过查看proc/self/maps中可以看出,反调试全部在libjiagu.so映射的段中,Dex的解密加载在debug_xxx段中,将这款内存整个dump下来,可

以发现为elf文件,Elf头被抹掉,与section相关的信息被修改为无效的或抹掉,防止静态分析,使用ThomasKing大神的so修复工具,ida就能正常打开,

静态分析了。

2、fopen(“/proc/self/maps”);进行匹配查找:

/dev/ashmem/dalvik-classes.dex

apk@classes.dex

.odex

分割出内存基地址,判断头是否为”dey”;

根据pDexHeader->dataSize+pDexHeader->dataSize找到qh开头的内存地址,         0x2DF为数据块的长度,其中存储了,加固app的相关信息,包括,

包名,Application、activity等和自身加载的一些信息。

55fd2b2273b5a8b4531f72773c469d6e.gif

5.png (22.13 KB, 下载次数: 49)

2017-4-4 23:21 上传

解密后的文件

55fd2b2273b5a8b4531f72773c469d6e.gif

6.png (22.13 KB, 下载次数: 49)

2017-4-4 23:22 上传

2、  解密dex数据

55fd2b2273b5a8b4531f72773c469d6e.gif

10.png (19.86 KB, 下载次数: 46)

2017-4-4 23:23 上传

loc_EDF4()

{

BLsub_433E0{0x433FA j_j_tl_mmap -->分配dex空间, 长度 0x3274}

BLX  R12; --> //解密dex数据到前面分配的空间中//偏移0xEE14

{

blxsub_36A88()                          ----------->0x353A4

{

loc_36ADA()

{

sub_365A4()

{

sub_358F0()

{

loc_36156解密操作

}

}

}

}

}

此时的dex头,0x70个字节还是加密的

sub_46F6C()

{

//解密dex头,0x70个字节,

}

55fd2b2273b5a8b4531f72773c469d6e.gif

11.png (58.61 KB, 下载次数: 48)

2017-4-4 23:24 上传

------------------------------------------------至此dex完全解密到内存中-------------------------------------------

接下来自己构建,构建DexFile结构进行系统版本属性的判断

55fd2b2273b5a8b4531f72773c469d6e.gif

12.png (15.1 KB, 下载次数: 48)

2017-4-4 23:24 上传

getSystemContext();

getPackageInfo();

getPackageInfo(包名)

RegisterNatives(DexFile_jcl,);

{

{"getClassNameList","(I)[Ljava/lang/String;",0xD791}RegisterNatives(StubApp2379654022);

{"interface9","()Ljava/lang/String;",0x73921d79},

{"getAppkey","()Ljava/lang/String;",0x73901ad1},

{"mark","()V",,0x739185dd},

{"interface6","(Ljava/lang/String;)Ljava/lang/String;",0x738fde05},

{"interface7","(Landroid/app/Application;Landroid/content/Context;)Z",0x73901e99},

。。。。。。。。。。。。。。

}

RegisterNatives("onCreate","(Landroid/os/Bundle;)V",0x0000BD1D);可见onCreate可定是注册为native函数的,在so的偏移0x0000BD1D处,可以动态调试跟

进去看看

55fd2b2273b5a8b4531f72773c469d6e.gif

13.png (23.25 KB, 下载次数: 47)

2017-4-4 23:25 上传

在so偏移0xA9B8处为解释执行switch 开始的地方,猜测应该是逐条指令进行解释执行的

55fd2b2273b5a8b4531f72773c469d6e.gif

15.png (12.94 KB, 下载次数: 48)

2017-4-4 23:26 上传

附件会上传脱壳过程中用到的app和记录的文档,dump的so和dex,供大家学习,相互交流,共同学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值