脱壳系列—— 揭开so section加密的美丽外衣

2018-04-09 16:04:41 315safe

i春秋作家:HAI_

0x00 前言

对so的加密,https://bbs.pediy.com/thread-191649.htm大神的帖子里已经很详细的说明了。当然加密不是我们研究的重点,如何搞掉这个so的加密才是我们的要事。

或许你想看看这里

HAI_使用手册

java开发之旅

Android开发之旅

0x01 so静态分析

1.未加密之前的so

image.png

2.加密之后的so

我们使用ida打开的时候,ida进行了报错提示。

image.png

可能在平时很多时候都会发现so是被加密了的,ida就会报这个错误,我们忽略这个,然后进入。

image.png

这个就是我们加密过后的内容。

3.结论

so文件进行加密之后效果很明显,无法在加密之后的so得出有用信息。也相当于是对so进行了加壳,再详细一点就是加密壳。

而我们最主要做的就是脱掉这个加密壳。


image.png

0x02 动态脱壳

又到了我们最好玩的脱壳环节了。

利用一个最原理就是,不管你加密成什么样子,在内存中,你总是要还原的,不还原系统怎么运行。

所以我们需要进行一个动态脱壳。

连接手机,开启服务,attach

su

cd data/local/tmp

./zhu -p23333

adb forward tcp:23333 tcp:23333

//可能会用到
adb shell am start -D -n com.example.shelldemo/.MainActivity

adb forward tcp:8700 jdwp:7728

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,part=8700

成功附加。

image.png

这个时候程序已经在运行了。

所以我们需要找到demo里的so文件。

image.png

文件偏移是:75A00000
大小是:5000

我们来dump一下。

程序的话还是用之前的程序把。

static main(void){
    auto fp, begin, end, dexbyte;
    //打开或创建一个文件
    fp = fopen("d:\\dump.dex", "wb");
    //dex基址
    begin =  0xF34C6320;    
//dex基址 + dex文件大小
end = begin + 0x00013570;
    for ( dexbyte = begin; dexbyte  end;     dexbyte ++ ){
//按字节将其dump到本地文件中
fputc(Byte(dexbyte), fp);
        }
}

稍稍的更改一下就可以使用了。

好了我们成功dump。


image.png

测试

使用ida打开。

发现ida还是报错。


image.png

image.png

先忽略,进去。

image.png

这个时候发现关键函数已经出来了。

但是我们还是想要追求一下完美。

0x03 修复

我们这里修复使用工具进行。

image.png

然后使用ida进行测试。

image.png

修复成功。