小程序逆向分析 (一)

一、目标

李老板:奋飞呀,最近耍小程序的比较多,而且貌似js好耍一点?要不咱们也试试?

奋飞: 你是老板,你说了算喽。

第一次搞小程序,得找个软柿子捏,就找个以前分析过的某段子App的小程序吧。

  • 反编译
  • 静态分析
  • 动态调试

二、步骤

春天在哪里?

app下载回来就是apk包,那么小程序在哪里?

小程序是一个以 wxapkg 为后缀的文件,在android手机的 /data/data/com.tencent.mm/MicroMsg/用户id/appbrand/pkg/ 里面找, 例如在我的测试手机里面就在

/data/data/com.tencent.mm/MicroMsg/9099d679ace11f72569bd530813a28ff/appbrand/pkg 

这个目录下面。可是下面一堆数字命令的文件,哪个才是我们要找的某段子App的小程序呢?

两个办法:
. 把所有的小程序都删除,就留一个,那这个文件就是了。
. 把某段子App的小程序删除,然后再重装一下。 看文件日期,最新的就是了。

反编译

wxapkg文件肯定没法直接分析的了,我敢打赌它一定可以反编译出js文件。

https://github.com/ezshine/wxapkg-convertor

从releases里面下载他编译好的wxapkg-convertor可执行程序。

把wxapkg文件拖到 wxapkg-convertor 的界面里面可以反编译出js源码出来。

main.png

我们先试试 分析一下这个 websign 的来历

首先搜索一下 websign 字符串

./3AAE21D3932643BF5CC849D4DA8F8236.js:3:    if (!e) return console.error("websign arguments error"), "";
./3AAE21D3932643BF5CC849D4DA8F8236.js:6:    return n.length < 20 ? (console.error("websign length error"), "") : "v2-".concat(o("".concat(e).concat(o(n))));
./3AAE21D3932643BF5CC849D4DA8F8236.js:98:                        url: "".concat(n, "/account/nonce?websign=").concat(i(c)),
./3AAE21D3932643BF5CC849D4DA8F8236.js:124:                    url: "".concat(n, "/account/auth?websign=").concat(i(u)),
./3AAE21D3932643BF5CC849D4DA8F8236.js:178:                var ff = "".concat(n).concat(s).concat(e, "?websign=").concat(i(d));
./3AAE21D3932643BF5CC849D4DA8F8236.js:180:                    url: "".concat(n).concat(s).concat(e, "?websign=").concat(i(d)),

很幸运,看上去就在这个js里面的 i(d) 函数里。

动态调试

既然反编译出来了js源码,能否动态调试下,这样分析起来更方便了?

答案是可以的,下载 微信开发者工具,把刚才反编译的工程导入进来。

ide.png

记得在 设置->项目设置 中把 “不校检合法域名...” 这一项勾上。

这样代码貌似可以跑起来, 我们在 i 函数下个断点,发下它可以进来了。

分析一下

我们调试的时候发现它并没有生成websign,t.h_m为空,导致后面没有生成,这个难不倒我们,从抓包结果里面找一个 h_m的值,写死一下,就顺利跑出结果了。

 var e = t.h_m;
// 修改成
 var e = 257167182;  // t.h_m; 

从js代码里看,i函数里面最后调用了o(n), 而

o = require("E5CA98B6932643BF83ACF0B13A9F8236.js").md5

这么明显的md5,我们来试试,在i函数里面加一个代码

var t1Use = o("123456");

首先在Mac下我们算下结果

ffNewMac:Downloads fenfei$ md5 -s 123456
MD5 ("123456") = e10adc3949ba59abbe56e057f20f883e

然后再调试下这个工程,看看t1Use的值

rc.png

确认过眼神,就是MD5。

三、总结

搞个新玩意的时候,先找个软柿子捏,不要一下就想放个大卫星。

能反编译,然后再动态调试,那么曙光就在眼前。

这个样本运气好,肉眼就可以看出是md5,复杂的js算法,可以考虑 PyExecJS、js2py or Node.js 来跑。

ffshow.png

所有的故事都会有结局,只有生活跟你没完。

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

推荐阅读更多精彩内容