某梆企业版加固脱壳及抽代码还原方法

某梆加固企业版还是会调用系统的dvmDexFileOpenPartial 接口,因此可以这里添加hook

51df6008-52cd50__unpackedDex.dmp即是dump出来的dex,拖到jeb里,可以看到这些函数都是空的

汇编显示,大片的指令都为nop,这些指令都被抽掉了,执行之前才会还原。

它hook了dvmResolveClass还动态加解密指令

可以看到,它执行了两次___Decrypt_dvmResolveClass,解密完等原始dvmResolveClass执行完后,还会再把指令清掉。

之前网上有还原娜伽抽代码的教程,是把解密算法还原出来,用算法来解密的,不过___Decrypt_dvmResolveClass函数的流程图如下图所示:

还是挺复杂的,弄出算法的成本相当高。

还是另想办法。第C838行的BLX R3就是在调用原始dvmResolveClass函数,这时指令已经被还原了。那么我们在这个点做hook,把代码还原出来。

  先来看下dvmResolveClass函数的实现

     输入参数有ClassObject* referrer, u4 classIdx,这里的classIdx经过测试,似乎经常飘乎不定,并不可用。需要通过referrer->descriptor得到类名后,再定位到对应的class_data_item
 
 

     dexClsIndex是通过类名计算出来的实际classIdx,patchDexMethod通过referrer将Method里面的指令写到第一步dump出来的dex里的对应位置上。
     

  
       虽然大部分类都的代码都被还原了,但还是存在这样的类:
       

       还有一些类没有被还原出来,因为dvmResolveClass只会还原加载过的类,对于那些没有加载的类,也是无能为力。
    加载的时候会自动调用dvmResolveClass,需要想办法让所有的类都预先加载起来。
 
       可以Hook Dalvik_dalvik_system_DexFile_defineClassNative函数,原始dex加载时,枚举所有的DexClassDef,对所有的class,调用dvmDefineClass进行类加载。
 
   这样会就把之前没有还原到的类给补全。
   
(创建了一个Android逆向分析群,欢迎有兴趣的同学加入,群号码:376745720)


 
时间: 2024-10-25 22:00:03

某梆企业版加固脱壳及抽代码还原方法的相关文章

《代码阅读方法与实践》阅读笔记之二

时间过得真快,一转眼,10天就过去了,感觉上次写阅读笔记的场景仿佛还历历在目.<代码阅读方法与实践>这本书真的很难写笔记,本来我看这本书的名字还以为书里大概写的都是些代码阅读的简易方法,心想着这就好写笔记了,没想到竟然好多都是我们之前学过的东西,这倒让我有点无从下手了.大概像我们这些还没有太多经历的大学生,总是习惯于尽量避免自己的工作量,总是试图找到一些完成事情的捷径吧.总之,尽管我不想承认,但我自己心里很清楚,我就是这种人.下面开始言归正传,说说接下来的几章内容归纳. 这本书在前面已经分析了

Discuz论坛写出的php加密解密处理类(代码+使用方法)

PHP加密解密也是常有的事,最近在弄相关的东西,发现discuz论坛里的PHP加密解密处理类代码,感觉挺不错,在用的时候,要参考Discuz论坛的passport相关函数,后面我会附上使用方法,先把类代码帖上来: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 <?php /*

《代码阅读方法与实践》阅读笔记三

之前已经看完了<代码阅读方法与实践>的前六章,基本上也就是看得比较粗略,没有很精细的阅读,上节课听到老师说的“学术交流会”还是很紧张的,挺害怕被问到问题,结果回答不出来可怎么办啊,不仅丢人,分也送给别人了啊,这可怎么破啊.所以呢,我打算近期再看一遍,不管有没有用,算是给自己加点自信吧. 第七章,讲的是编程规范和约定,主要就是文件的命名及组织.缩进.编排.命名约定.编程实践.过程规范之类的,其实这一章也不用我做过多的介绍,因为大家应该都有听各科老师讲过好几遍了,道理大家都懂,但是大家除了在理论上

多说【最近访客】JS插件通用代码使用方法

多说[最近访客]JS插件通用代码使用方法 多说[最近访客]JS插件可以显示近期访问过你的博客并且已经使用向多说授权过的社交网络账号登录的用户头像,效果如下图所示. 最近访客JS插件的添加步骤如下: 1. 添加多说公用JS代码,每个页面只需添加一次. <!--多说js加载开始,一个页面只需要加载一次 --> <script type="text/javascript"> var duoshuoQuery = {short_name:"您的多说二级域名&q

《代码阅读方法与实践之读书笔记之一》

阅读代码是程序员的基本技能,同时也是软件开发.维护.演进.审查和重用过程中不可或缺的组成部分.<代码阅读方法与实践之读书笔记之一>这本书围绕代码阅读,详细论述了相关的知识与技能.我希望通过仔细阅读并学习本书,可以快速地提高我的代码阅读的技能与技巧,进而从现有的优秀代码.算法.构架.设计中汲取营养,提高自身的开发与设计能力.此次读了此书的前四章,以下是我从中汲取到的宝贵养分: 从第一章<导论>一节中我体会到了我们要养成一个经常花时间阅读别人编写的高品质代码的习惯,因为阅读高品质的代码

Zen Coding: 一种快速编写HTML/CSS代码的方法[Emmet]

译自:[Smashing Magazine](http://www.smashingmagazine.com/2009/11/21/zen-coding-a-new-way-to-write-html-code/)中文:[Zen Coding: 一种快速编写HTML/CSS代码的方法](http://www.qianduan.net/zen-coding-a-new-way-to-write-html-code.html) 请尊重版权,转载请注明来源! - - - - - - 在本文中我们将展示

钩取API之代码修改方法【一】

IAT方式就不去花精力了,加了壳的程序用这方法压根用不上. 就熟悉一下代码修改方法.书上用的是隐藏进程的实例 第一种办法 一,枚举进程,给所有进程加载DLL[用远程线程注入] 二,传入需要隐藏的进程名 三,判断有没有修改过需要钩取的函数,如果还没有修改过就改掉,跳向自己的函数,同时保存好原来的值 四,在自己的替代函数里将原来的值修改回去,并再执行一次,执行完做相关处理 五,在自己的替代函数最后再钩取函数,修改跳转到替代函数 基本逻辑就是这样,像是移花接木啊... DLL代码: #define S

高效编程——C++测试代码运行时间方法

C++测试代码运行时间方法 方法一 最常用的执行时间测试方法,利用clock函数,精确度能达到ms级. 直接看代码吧,这样最直观: #include "stdafx.h" #include <ctime> #include <vector> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ clock_t start,finish; long

oracle 11g 从 dmp 文件中导出 sql 代码 的方法.

impdp sys/password full=y dumpfile=bg.dmp nologfile=y sqlfile=bg_dmp.sql 备注: bg.dmp 是 dmp 文件,   bg_dmp.sql 是导出来的 SQL  代码.   导出的文件和代码都存放在:oracle 安装目录:  app/oracle/admin/ORCL/dpdump 文件夹下面. oracle 11g 从 dmp 文件中导出 sql 代码 的方法.