そう書いてからラップアップの静的および動的解析アームをデバッグするために学んで逆Anroid

そう書いてからラップアップの静的および動的解析アームをデバッグするために学んで逆Anroid

I.はじめに

最近、兄弟は腕はまだ感じて見る(ちょうど研究の前にトスする時に波を締結し、動的コンパイルが腕を分析し、数日間の周りの第七宿題フィドルでAndroidの逆の逆を、学ぶために、このチュートリアルに従うことを学ぶことを教えてくれました象形文字違いはありません...)、非常にシンプルな根拠に関連したもので、偉大な神は、時間を無駄にしないでください!


第二に、ツールを使用します

  • AndroidのスタジオV3.3
  • IDA V7.0
  • AndroidKiller
  • ApkToolBoxのv1.6.4

第三に、準備などのapkファイルを使用する必要

そのAndroidアプリケーションやファイルを作成する方法については、超詳細なオンラインチュートリアルの多くは、ここにそのファイルを書き込むプロセスについてのみ簡単に手の込んだことはありません。
1、使用される新しいJavaクラスSystem.loadLibrary("so_name");ので、ファイルをロードするために、ネイティブ層の関数を作成し、私は2つの整数パラメータ、ここでは名前の追加作成し、ネイティブ関数の整数値を返す
Javaクラスを作成します。
と、端末のAndroidメーカー2を使用javac java_name.javaだけで追加されたクラスにコンパイルするためのコマンドを
Javaファイルをコンパイルします
生成する.hファイルを生成されたコマンドのフォーマットは、javaディレクトリにジャンプし、3をjavah -jni Android项目包名.类名
生成された.hファイル
新しいJNIフォルダの下のメインフォルダに、4、その後、以下のjavaフォルダ内の最後のステップは良いの.hを生成ちょうど新しい良いJNIフォルダにファイルをコピーし、(私は2つのだけの整数の合計を実現するために、ここではよりシンプルだし、結果を返します)、以下の対応する論理関数のコードを記述し、その後の空のファイルutil.cを作成します(ありませんこのファイルはエラープラス...)になります
新しいJNIフォルダ
機能ロジックコードを書きます
5、適切なコンフィギュレーション・ファイルbuild.gradleに加え、srcディレクトリCMakeLists.txtにファイル作成した
NDKの設定を追加します。
[コード]

 ndk{
            moduleName "myjni"
        }
        externalNativeBuild{
            cmake {
                cppFlags ""
                abiFilters "arm64-v8a","armeabi-v7a","x86","x86_64"
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

[CMakeListsファイルの内容]

\# Sets the minimum version of CMake required to build the native
\# library. You should either keep the default value or only pass a
\# value of 3.4.0 or lower.

cmake_minimum_required(VERSION 3.4.1)

\# Creates and names a library, sets it as either STATIC
\# or SHARED, and provides the relative paths to its source code.
\# You can define multiple libraries, and CMake builds it for you.
\# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.AndroidStudio开始支持Cmake了,ndk感觉挺费劲的,这个是不是好玩点,,这里是要生成的库的文件名 libtest.so
             \#这里是liuxin
             myjni  \#so文件名字
             \# Sets the library as a shared library.
             SHARED

             \# Provides a relative path to your source file(s).
             \# Associated headers in the same location as their source
             \# file are automatically included.对应的C文件的目录位置
             src/main/jni/main.c)

\# Searches for a specified prebuilt library and stores the path as a
\# variable. Because system libraries are included in the search path by
\# default, you only need to specify the name of the public NDK library
\# you want to add. CMake verifies that the library exists before
\# completing its build.

find_library( \# Sets the name of the path variable.
              log-lib

              \# Specifies the name of the NDK library that
              \# you want CMake to locate.
              log )

\# Specifies libraries CMake should link to your target library. You
\# can link multiple libraries, such as libraries you define in the
\# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.指定依赖库
                      \#这里是liuxin
                       myjni  \#so文件名字

                       \# Links the target library to the log library
                       \# included in the NDK.关联日志记录库文件,在ndk目录中
                       ${log-lib} )

図6に示すように、Build->Rebuild Projectファイルにコンパイルされ、これに格納されたファイル位置build->intermediates->cmake->debug->objディレクトリが、そう主に適切なファイルを選択しJniLibsディレクトリ(ディレクトリが自分を確立する必要がある)、次いでAPKにコンパイル
そうコンパイルされました


四、破解该apk,将结果变为调用该so中该函数时无论参数输入多少,返回结果恒等于0

1、将apk拖进夜神中,观察一波(这里结果为52,参入参数为22和30)
矢上結果
受信パラメータ

2、将该apk拖进AndroidKiller中反编译,在jd中查看java代码(这里就不再分析smali代码了,直接看java),可以看到在关键函数中调用myTest类的add函数,在jd中双击该类跟进,发现加载了so文件,并且定义了native函数int add(int,int),所以经过上面分析要修改返回值需要修改so文件(也可以在smali层直接修改,但这篇文章主要讲so,如果有兴趣的可以去smali层修改)
1
2
3

3、使用ida静态分析myjni这个so文件。在AndroidKiller中找到该so文件,右键打开文件路径,然后拖进ida中,在export窗口(提供给外界调用的函数名集合的一个窗口)中找到add函数,双击进入该函数,可以看到汇编指令就这两条ADDS R0, R3, R2
BX LR (因为我的函数功能过于简单所以就2条汇编指令,作为学习只有就不要纠结那么多了),第一条意思很简单就是将r3和r2寄存器的值相加复制给r0寄存器,第二条指令意思是跳转到lr寄存器中所指地址中去执行下面的指令(lr是链路寄存器,用于保存函数返回地址,就是相当于存储了函数返回后下一条指令的地址)

4
5
6
7
腕
4、动态调试。静态其实看着还是挺懵逼的,作为一个arm汇编的初学者,真的是搞不清楚调用函数过程中参数传到那个寄存器中去了,返回值跑哪里去了(暂时只关注这两点),所以那就动态调试so吧(记住一定要用真机调试,反正我用夜神模拟器调试就木有成功过,网上有大佬分析说的是模拟器底层还是x86的汇编,不是arm,所以有各种各样的奇葩错误无法解决)(而且要root)。
(1)、将手机连接好,并进入调试模式,将ida的dbgsrv->android_server拷贝到手机的/data/local/tmp目录下面(打开cmd,输入adb push ida路径/dbgsrv/android_serevr /data/local/tmp拷贝文件至手机),然后输入adb shell进入调试模式下,执行su获取root权限,cd /data/local/tmp进入android_server所在目录下面,chmod 777 android_server赋予android_server文件777(可读可写可执行)权限,./android_server执行android_server文件,最后另外打开一个cmd窗口,执行adb forward tcp:23946 tcp:23946进行端口转发(23946是ida的默认端口,因为木有反调试所以懒得改了)。
20
21
(2)、在手机上点击要调试的app启动,然后打开ida,在弹出的初始界面中,选择go这个选项,直接进入ida,然后选择Debugger->Attach->Remote ARMLinux/Android Debugger选项,在弹出的窗口中点击Debug Options选项,勾选下图所示三个选项(这三个选项名字太长了,麻烦看一下图吧),然后点击ok,在点击ok,弹出选择进程的界面,找到要调试的进程(可以使用serarch搜索进程),点击,然后点击ok,然后ida会附加到要调试的进程,在ida右侧的module哪里显示了所有加载的so文件,可以左键点击然后Ctrl+F搜索so文件(我这里so文件名为libmyJni.so,所以我搜索my就行了),找到对应的so文件后,双击即可弹出so文件对应的函数框(我这里是add函数),然后双击对应的函数,ida会跳转到这个函数中去(我这儿就是跳转到了add函数中)。

22
23
24
25
26
27
29
28
30
3、经过上一步的配置,我们以及成功进入到要调试的函数中了,现在差开始调试了,在ADDS R0, R3, R2处下一个断点(鼠标左键点击这行汇编代码,然后按F2即可下断点),然后按F9运行,在手机上点击按钮,即可看到程序停在了这行代码处,然后按F8单步调试,在右边寄存器处可以看到相关寄存器的16进制值,这里我们可以看到r0寄存器的16进制值为34(10进制为52),可见函数返回结果所用的寄存器为r0,r2寄存器16进制值为16(10进制值为22),对应了我们传进去的第一个参数22,r3寄存器的16进制值为1E(10进制为30),对应了我们传进去的第二个参数30。

31
32
図4は、上記の動的分析の後、我々は、組立工程の機能が実行されて明確に知っている-レジスタR2に渡されたパラメータ値を、レジスタR3に渡された第2のパラメータの値を、加算の戻り値はレジスタR0に生じます。今、私たちは、結果が0に等しい場合、我々は単にR0複合体に0の値を返す必要があります。具体的な考え方はしているADDS R0,R2,R3コードは、この行が変更されたコンパイルMOV R0,#0することができます。今、私たちは見つけるので、IDA開いているファイルをインポートしADDS R0,R2,R3、今私達はちょうど必要な、マシンコードに対応するアセンブリ命令で表示することができる4バイトに変更されます、我々はポップアップウィンドウで、[オプション] - > [一般のIDAのメニューバーをクリックすることができ、対応する修飾されたマシンコードmov R0,#0に対応するマシンコードは、(アセンブラマシンコードを確認する機能に対応し、この工具搬送アームApkToolBoxマシンコードを使用することができる)ことができます。私たちは、対応するマシンコードを修正するパッチを使用するすべての最初の、ラインアセンブリコードを修正するために、マウスの左ボタンをクリックして、我々は、対応するマシンコードを変更するには、ポップアップウィンドウで、メニューバー編集- >パッチプログ>変更バイトをクリックすることができます(あなたがマシンコードに対応する修正が0020である2つのバイトを、修正することができますので、それは、Thumbモードであるため)、その後、入力にメニューバー編集- >パッチプログ>アップルパッチをクリックしてファイルを... に変更を保存します。

37
38
3
33
34
35
5、その後、ファイルコピーして変更しますので、libディレクトリAndroidKiller内のすべてのファイルを置き換え、その後のapkファイルで、その結果、再コンパイルは0として表示された結果を確認するには、ボタンをクリックしてインストール。

36
1


V.結論

関連アクセサリーリンク:リンク:https://pan.baidu.com/s/12a_l4JcuJj4i6nJty0xXXQ抽出コード:LICR。

おすすめ

転載: www.cnblogs.com/aWxvdmVseXc0/p/11564809.html