【Tech-so】So文件静态分析Step by Step(一) --------入门,利用IDA pro查看代码

         之前搞腾了两个月的Cocos-Lua , 主要是把java的代码导出去给于Lua项目组调用,过程那个叫苦呀,其实到最后才发现,那是一个很简单的原理。


因为之前提及过,Lua与Java的互调要使用中间层C/C++来衔接,所以过程中也接触了一版的C/C++的代码,也了解了一下其静态库与动态库的链接。


由于中间层主要是使用NDK来编写,编写是没有问题的,毕竟无论是Eclipse还是Android studio中还是支持NDK,与C代码编写的,但是对于调试,


就显得尤其的麻烦了。虽然在Android的ADT22版本之后,Eclipse可以通过NDK debug=1来设置调试NDK打包出来的so文件,但是对于并不是保存在Android


工程中的C/C++文件如何去调式呢?而Vs2013却又不支持Android。所以当时的调试如何主要就通过log日记输出了。Vs调试C/C++的接口,Eclipse调试NDK本身


的代码,所以只能希望NDK再去调用其他C/C++的时候一定不能报错了,否则排查起来十分麻烦。例如:上一遍中说到使用lua_tostring的时候,字符串指针会


错乱一样,我只能从Log来判断究竟是其他的C/C++代码问题,还是NDK层的C/C++代码问题。


鉴于此,我们必须要有能力进行so代码的调试,这种调试是一种动态调试,在app运行过程中插入断点,进行一步一步看堆栈,看内存地址的调试模式。


在进行so代码调试之前,我们必须先学会静态分析so。意思就是,在调试前,我们应该先弄明白so里面的内容写的是什么。~~~~


     1.先准备好一堆破解工具先,就好似撬锁的话,也需要一把好的锤子和螺丝刀,说得好像我有偷东西的经验的一样。

               1.1   IDA pro  6.6   其实6.5版本我也有,6.6是一个绿色版本,密码是:um6q

               1.2  vs2013 2013用来干嘛?其实在调试so的过程中,确实没有多大用处,但用来写C/C++的时候,

                                                       确实很好用,而且和Eclipse不是一个等次,密码:9kop ,需要注册码。

               1.3 NDK         用来生成so

               1.4 cygwin     用来生成so


     2. 一本辅导书。我选择了旧版的Android软件安全与逆向分析(完整版

              这本说好处是,让你先了解了Android应用的整体架构,如何运行,如何通过我们代码转换为用户可操作的指令。

              而且还带有动态调试机器指令的教程,不过由于版本旧,很多方法和说明都旧了,所以可以看的是其中的原理,了解为主,真正要研究的话,

              还是根据我们目前常用的系统版本入手。


   准备好这些东西之后,我们就立即进行so的分析了吗?一开始我是这样认为了,通过NDK,把一个本地getNumber()的方法编译成so,


然后把这个so,直接拖到IDA Pro中,然后通过虚拟机的指令集来分析代码,但结果往往令人失望的,

因为你会发现一些陌生的东西:

   以下是一个native方法:getNumber()

    

      这些LDR ,TST 指令是什么鬼??不是应该是Dalvik虚拟机的指令吗?

   

     然后我就在我工程中的java层写了个if的方法:

	TextView num = (TextView)findViewById(R.id.num);
		
		num.setText(""+NativeSoTest.getNumber(20));
		
		
		if(NativeSoTest.getNumber(20)==100){
			
			
			Toast.makeText(this, "Yes cpp", 1000).show();
			
			
		}

   

    然后再生成Apk,把apk用rar的形式解压出来获取到classes.dex文件。

    把这个classes.dex 拖到IDA pro中,然后利用Alt+T的快捷键,搜索字符串“Yes cpp”。

    结果:

   

   

   红框中可以看出,java层的代码,是已经被转换为Dalivk的虚拟机指令集代码了。也就是说,C/C++所生成的代码是与一般的虚拟机指令集代码不一样的。

  

   Oh,MyGod,难道C/C++又存在了另一套指令集?


   等等,这个IDA pro所呈现出来的代码,是怎么样的?为何是这样排列的?前面的数字是内存地址还是什么?中间的英文是指令集和什么?后面的说明又是怎么看?

   

   所以要进行so的分析,首先应该先弄懂IDA pro。下班了,明天就来看看这个IDA pro展示了什么代码给我们~!


  


  


   

             



猜你喜欢

转载自blog.csdn.net/A_AsinCEO/article/details/50008755