luckfollowme arm学习篇 4 - 运行arm
上一章讲解了如何 编译 x86 x86_64 armeabi-v7a arm64-v8a 的架构文件
这章我们就要运行它,并且尝试使用 ida pro 进行 debug
准备 emulator
我们需要准备 emulator (模拟器)
注意模拟器我们要用 arm64 的,这样才能运行我们 arm 文件
arm64 是在 android 5 出来的 也就是 android api 21 的时候开始,所以我们最低选择 android api 21 的
下面是图文教程:
1.create device 创建驱动
</p>
</p>
2.choose a device definition 选择您的手机驱动尺寸
</p>
</p>
3.选择 arm64 镜像 注意最好选 api level 21 的。 因为有的 cpu 不支持高版本的 arm
</p>
</p>
命令行运行 emulator
选择好后 您可以关闭 visual studio 了
再次之前 打开 SDK 的目录 。 找到 Android\Sdk\emulator\emulator.exe 文件
并参考下面的资料:
https://developer.android.google.cn/studio/run/emulator-commandline?hl=zh-cn
然后再在我们的项目的 scripts 目录中编写 emulator-start.bat 脚本
在此之前,先看我们的设备名字
emulator -list-avds
Pixel_4_API_21
然后您创建的脚本中添加如下内容:
C:\Users\hp\AppData\Local\Android\Sdk\emulator\emulator -avd Pixel_4_API_21 -netdelay none -netspeed full
然后通过 vscode 中终端启动它,启动你会发现它一直卡在如图所示的界面。
这种情况是正常的,因为 x86 架构 模拟 arm 是很慢
但是我们不用等到它启动,因为实际上它内置的 系统已经跑起来了
如果你正确配置了 android- studio platform-tools 到 path 环境下,您输入 adb advices 应该可以看到这个设备
adb devices
List of devices attached
emulator-5554 device
您输入 adb shell "ls -l" 应该就能看到里面的目录情况了
PS C:\Users\hp> adb shell "ls -l"
dr-xr-xr-x root root 1970-01-01 00:00 acct
drwxrwx--- system cache 2023-04-22 17:32 cache
lrwxrwxrwx root root 1970-01-01 00:00 charger -> /sbin/healthd
dr-x------ root root 1970-01-01 00:00 config
lrwxrwxrwx root root 1970-01-01 00:00 d -> /sys/kernel/debug
drwxrwx--x system system 1970-01-01 00:01 data
-rw-r--r-- root root 281 1970-01-01 00:00 default.prop
drwxr-xr-x root root 1970-01-01 00:00 dev
lrwxrwxrwx root root 1970-01-01 00:00 etc -> /system/etc
-rw-r--r-- root root 11276 1970-01-01 00:00 file_contexts
-rw-r----- root root 922 1970-01-01 00:00 fstab.goldfish
-rw-r----- root root 850 1970-01-01 00:00 fstab.ranchu
.....
运行我们的项目
修改项目
再次之前我们改进下我们的项目。 之前我们用的 hello.cpp 使用 c++ 标准库 导致生成的内容过大。
这回我们创建个 hello2.cpp 只弄些简单的东西
结构大致如下
practice
-source
hello.cpp
hello2.cpp
CMakeLists.txt
我们将 hello2.cpp 代码改成如下:
#include "stdio.h"
int main()
{
printf("hello world!");
return 0;
}
CMakeLists.txt 中 我们配置个 hello2.cpp 的构建可执行程序
# 使用最小版本号
cmake_minimum_required(VERSION 3.5)
# 我们的项目名称
project(InlineHookPratice)
# 启动支持 asm 汇编
enable_language(ASM)
# 设置 c++ 和 c 的标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_STANDARD 11)
# 查找的include 的位置
include_directories(
./source/
)
# 设置我们要编译的资源 放入 SOURCE_CPP 变量里面
set(hello_source
./source/hello.cpp
)
# hello2 的代码来源
set(hello2_source
./source/hello2.cpp
)
# 将我们要编译的资源 加入可执行文件 InlineHookPratice 里面 到时候编译出来就叫 InlineHookPratice.exe 或者 InlineHookPratice... 根据环境变化
add_executable(hello ${hello_source})
# 将hello2 生成 可执行程序
add_executable(hello2 ${hello2_source})
运行上一章的 ndk_bulder.py 脚本的时候注意下
if __name__ == "__main__":
ndk_path = r"C:\Users\hp\AppData\Local\Android\Sdk\ndk\25.1.8937393".replace('\\',"/")
cmake_path = r"F:\c++\msys2\mingw64\bin\cmake".replace('\\',"/")
print("ndk_path:", ndk_path)
print("cmake_path:", cmake_path)
for abi in abis:
# target_name 改成 hello2
builder = AndroidPlatformBuilder(android_nkd_dir=ndk_path, cmake_dir=cmake_path, arch=abi,target_name="hello2")
builder.build()
运行项目
通过 vscode 打开终端
进入到我们构建的目录: 然后将项目 通过 adb push 到 /data/local/tmp 目录下
cd ..\build\arm64-v8a\ #进入build arm64
adb push .\hello2 /data/local/tmp/ # push hello2 到 模拟器上
adb shell "chmod 755 /data/local/tmp/hello2" # 修改执行权限
adb shell "/data/local/tmp/hello2" # 运行
hello world!
为了方便 我们将它写成 adb_execute_arm64.bat 脚本放在 scripts 目录下
然后我们可以直接在 vscode 终端 执行下面命令就可以完成运行了
.\adb_execute_arm64.bat
Ida Pro 进行 Debug
我们最终是要学习 arm 汇编的 所以使用 ida pro 肯定是少不了的。
后续我尽量讲清楚点。
由于我 ida pro 也不熟悉。 包括 arm64 ,因为我没学多久。
我也不太会找教程,因为我找教程只懂搜 B 站
但是我所见的教程都是着着书读,半天不讲正点,也不实践。 迷迷糊糊看上一篇下一篇就忘了,对于我这种喜欢速成实践才能记住的人属实消化不了。
稍微看着可以的就是要收费的,可俺是个穷光蛋呀。
大多学习也是通过 买的 gpt 账号,一通乱问。感觉它是我的ai导师也不为过。
在此 还是期待正己大佬的视频,从他这里入坑 看别的没味道。
准备 Ida pro
如果您是第一次使用 ida pro 那么就看本次教程
在 吾爱破解论坛上: https://www.52pojie.cn/forum.php?mod=viewthread&tid=1584115&highlight=ida%2Bpro
下载ida pro。
这个包含了很多常用的插件,省去了麻烦
下载完双击 IDA_InitTool.exe 完成环境初始化
准备 android_server64
在 ida/dbgsrv 目录下有着 ida pro 用于 debug 的服务,我们将它放置 /data/local/tmp 目录下 然后运行后 转发端口到电脑上
adb push .\android_server64 /data/local/tmp/ # push 到模拟器
adb shell "chmod 777 /data/local/tmp/android_server64" # 设置执行权限
adb shell '/data/local/tmp/android_server64 & ' # 后台启动
adb shell 'netstat' # 查看端口使用情况
adb forward tcp:23946 tcp:23946 # 将 模拟器端口映射到电脑
调试我们的程序
为了方便我们调试,我们得修改下代码,弄成死循环。
#include "stdio.h"
int main()
{
while (true)
{
//阻塞等待输入
getchar();
printf("hello world!");
}
return 0;
}
然后执行脚本重新编译并运行
cd scripts
python3 ndk_builder.py
.\adb_execute_arm64.bat
接下来打开我们的 ida pro 然后选择 go
进去后选择 Debugger->Attach->Remote ARM Linux/Android debugger
</p>
</p>
我们找到我们得 hello2 程序。然后选择 OK
</p>
</p>
进去后注意右下角,双击我们的模块
</p>
</p>
进去后注意一点,点击 main 方法,如果你是流程图 按 空格 切换下,然后再 hello world 字符串前面按 F2 下个断点
</p>
</p>
接下来按 F9 或者点击上面的 绿三角 △ 运行程序。
运行后,在 vscode 终端 您启动 .\adb_execute_arm64.bat 的地方 按任意键 运行下去
</p>
</p>
接下来您应该就能断下来了。 您可以尝试看下右边的寄存器和状态标志位
然后按 F8 步过 观察变化
后面的章节会分析下 arm64 的指令 以及 寄存器