Android-Xamarin 初级破解

0x0 零

做APK分析的时候难免会遇到一些非原生的开发模式,比如H5、Mono等等,要破解这些开发模式的APK原理其实和破解加了壳的APK一样,无非就是找到它的核心代码(或者前者比后者要简单的多)。这次遇到了一个Xamarin开发的APK,初步了解了一下这个Xamarin,不外乎就是基于 Mono 的一个 APP 开发框架,里面包装了很多Android Framework的API给你用。

0x1 壹

把APK装到手机上跑了跑,了解大致功能。按部就班的把APK脱到反编译工具里。震惊!!


dex反编译

几乎所有的类都如上图所示,有static代码块 + 字符串格式的代码 + Native方法 。 找了一圈发现没啥有用的代码,不过感觉告诉我,要么加壳了,要么是我没遇见过的情况。

0x2 贰

确定了一点,DEX文件里的东西是没什么用的,那么SO文件里呢?无论是加壳还是别的,都会有相应的SO去处理,所以说看一下lib目录下有什么熟悉的文件,能帮组我进一步了解这个APK。


lib目录

lib目录下没有啥libdexhelper.so这些看着就很碍眼的文件,不过有两比较有意思的文件,libmonodroid.so和libmonosgen.so,这两个文件就是Xamarin的引擎文件了。

知道了APK是Xamarin框架之后,就去assemblies目录下找它的核心代码,发现这里很多DLL文件,它们都是由C#源码文件编译而成。反编译这些文件的工具很多,比如ILSpy、.NET Reflector以及dotpeek等(个人比较推荐ILSpy)。


DLL文件

接下来就是去分析反编译代码,可以看到C#的反编译程度已经几乎和源码相同了,很容易分析。寻找你想要修改了的地方(修改IL代码只需要给你的反编译工具加一个插件就好-Reflexil),很多小游戏破解,改改金币、血量什么的都很容易。我这里为了更方便的研究下它通信协议方面的东西,需要让流量走过我的代理服务器,所以说我需要修改它的证书校验的代码。


修改IL

找到校验的地方,然后将返回的false改成true即可,通过reflexil把ldc.i4.0改成ldc.i4.1。接下来就是保存,替换源文件,打包,签名。

0x3 叁

在打包的时候要注意几个方面的问题

第一个问题是打包方式,一般重打包我习惯性的会选择apktool b去重打包,但是这里因为某些bug导致apktool打包不了,后面想了想其他方式,反正只替换DLL文件,而且这个资源又不用aapt去编译,所以我可以选择解压APK文件,然后替换DLL文件,最后在压缩回来就ok了,其实所有添加或删除不需要编译的文件都可以用这种方式,比如assets目录下的资源、编译好的DEX、编译好的SO;

第二个问题是文件压缩问题,当我替换了DLL之后,压缩文件夹时,需要选择某些资源不进行压缩,否者后期运行会报错,针对这个APK,assemblies目录下的所有文件都要选择不压缩;

第三个问题是APK的字节对齐问题,这个问题主要会出现在google store上的应用打包时,我需要通过zipalign工具裁剪一下压缩好了的APK

Android SDK中包含一个"zipalign"的工具,它能够对打包的应用程序进行优化。在你的应用程序上运行zipalign,使得在运行时Android与应用程序间的交互更加有效率。因此,这种方式能够让应用程序和整个系统运行得更快。

这个工具在sdk目录下有,命令是

Android/sdk/build-tools/25.0.0/zipalign -v -p 4 in.apk out.apk


第四个问题是签名,接下来就用sdk里的apksigner工具签名就行了,这里需要一个签名文件,可以在Android Studio里面生成一个,签名命令是:

Android/sdk/build-tools/25.0.0/apksigner sign --ks releasekeystore.jks --out out.apk in.apk

0x04 肆

最后安装到手机,设置系统代理,发现其流量任然没有走到我的代理服务器。为什么呢?明明证书校验是改了的呀。。

猜想那么几种可能,第一种可能是它协议不是http/https,不过分析C#代码,发现里面很多url都是https协议的,break。第二种可能是它流量不走系统代理,通过观察我代理服务器上的流量,确实是没有抓到该APP的流量,但是这个APP能正常运行,continue。

那么为啥不走系统代理呢?第一种可能是它把代理设置成了NO_PROXY,这样就强制让代理失效了。

NO_PROXY

回头去跟C#代码,发现它用的HTTP库是flurl,发现它并没有设置flurl的proxy属性,这样一来,讲道理,它就不会不走代理。继续分析,flurl是由C#实现,作用于.NET程序,所以猜想这个库在设计之初应该不会考虑到Android手机上有系统代理的情况(我也没去深挖Xamarin对代理的处理),所以更不会去主动获取Android上的系统代理。而在Android平台上获取系统代理地址一般是通过这种方式(图中hostKey为“http.proxyHost”,portKey为“http.proxyPort”):

Android6.0获取系统代理地址

那么怎么才能让flurl的proxy去自动配置成Android的系统代理呢?可以通过修改flurl的代码,编译后去替换APK里的flurl.dll文件。当时想到这个办法的时候,我就已经放弃了。几经波折,最后还是用ProxyDroid这个Android上的工具强制让http流量走到了我的代理服务器上。

0x05 伍

回头再看一次,要实现上面那个功能,还有很多方法,比如说HOOK。Mono是一个JIT运行模式,那么我们可以Hook Mono加载DLL文件的地方,去替换特定的DLL(DLL改动比较大时采用),或者通过文件偏移去patch DLL中某个字节(DLL改动小时采用)。

Mono是一个开源的工程,网上也有很多对它的分析。我这里简单的再总结一下一个DLL加载过程中涉及到的一些函数

1.mono_assembly_open 打开DLL文件

2.mono_assembly_load_from_full 将DLL文件加载进内存


mono_assembly_open&&mono_assembly_load_from_full

3.mono_compile_method 编译某个函数


mono_compile_method

4.mono_runtime_invoke 执行函数


mono_runtime_invoke
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 中考完在县城玩了三天,22号,儿子从县城回到乡下,26号,儿子发QQ:给我买个手机,吧!29号:妈,给我买个手机吧...
    伶丽阅读 399评论 9 10
  • 这是我这两天看的书,《百年斯文》,是本口述史研究,就是通过别人口述的方式,进行内容的记录,在基于真实的情况下进行相...
    起风了柏拉图阅读 1,164评论 0 0
  • 如何才能帮到你,我要做到的:1.听亲子沟通栏目 2.看心理学书籍 3.当天检试和总结!4.坚持打扫清洁,整理房间
    相伴而行阅读 100评论 0 0