这些基础命令主要用于在Android设备上使用Frida进行逆向工程,下面是每个命令的解释:
1. `adb shell`:该命令用于通过ADB连接到Android设备的shell终端。
2. `su`:该命令用于获取root权限,这是许多逆向工程任务所必需的。
3. `cd /data/local/tmp`:该命令将当前目录更改为/data/local/tmp目录。通常,在此目录中存储Frida二进制文件和其他文件。
4. `./frida`:该命令用于启动Frida,它是一种动态插桩工具,可用于逆向工程和分析应用程序。
5. `adb forward tcp:27042 tcp:27042`和`adb forward tcp:27043 tcp:27043`:这些命令用于将设备上的TCP端口转发到本地计算机上,以便在使用Frida时进行通信。
```bash
在Frida中,可以使用JavaScript编写钩子脚本来追踪函数调用并修改其行为。下面是一些常用的命令,以在目标设备上运行Frida钩子脚本:
1. 使用Frida客户端连接到目标设备:`frida -U [package name]`
2. 在Frida客户端中加载要注入的应用程序:`process = frida.get_usb_device().attach('[package name]')`
3. 定义要钩取的函数名称和参数数量:`function_name = "exampleFunction"; arg_num = 3;`
4. 定义回调函数,并在其中实现自定义逻辑:```
callback = function() {
console.log("[*] " + function_name + "() called");
};
5. 创建一个钩子对象:`hook = process.hook_function(Module.findExportByName(null, function_name), arg_num, callback);`
6. 运行应用程序并触发要钩取的函数:此时,您应该能够在控制台中看到钩子脚本输出。
# 枚举所有的进程
processes = rdev.enumerate_processes()
for process in processes:
print(process)
# 获取在前台运行的APP
# Application(identifier="com.che168.autotradercloud", name="车智赢+", pid=3539, parameters={})
front_app = rdev.get_frontmost_application()
print(front_app)
使用Python中的frida库来枚举所有进程并获取前台运行的应用程序。
1. `rdev = frida.get_device_manager().enumerate_devices()[-1].attach()`:该命令用于获取当前连接的设备,并通过`attach()`方法将Frida客户端连接到目标设备上。
2. `processes = rdev.enumerate_processes()`:该命令用于列举目标设备上的所有进程,并将其存储在一个列表中。
3. `for process in processes: print(process)`:该命令遍历进程列表并打印每个进程的详细信息,包括进程ID、名称、PID等等。
4. `front_app = rdev.get_frontmost_application()`:该命令用于获取目标设备上正在前台运行的应用程序的详细信息,包括应用程序的名称、包名、进程ID等等。
关于搜索和逆向工程的一些常用技巧和提示:
1. `treeMap.put(xxx)`:当你搜索代码时,如果发现了类似`TreeMap.put()`的方法调用,可以很可能意味着该应用程序正在使用一个映射表来存储敏感信息(如API密钥、访问令牌等)。你可以进一步分析该方法的参数并查找与之相关的其他代码。
2. `sign "sign" &sign= &sign sign=`:这些关键字通常用于标识一个请求中包含一个签名参数,因为许多应用程序在处理API调用时使用签名参数来验证请求的真实性。您可以搜索源代码和注释,以查找与此相关的代码段。
3. 独有信息:您可以搜索某些独特的字符串或数据,例如应用程序名称、版本号等等,以帮助您更轻松地识别应用程序中的特定代码段或数据流。
4. 网址拿后缀搜:如果您知道某个网址或API端点的基本URL,可以尝试使用不同的后缀来搜索其他相关请求。例如,如果您想查找所有与某个应用程序中的“reportClick”请求相关的代码,则可以尝试在搜索引擎中搜索“base_url/reportClick”、“base_url/reportClickData”等。
5. Hook拦截器/TreeMap/StringBuilder定位:这些技术可以帮助您更轻松地识别应用程序中的特定代码段和数据流。例如,如果您怀疑某个方法正在使用一个TreeMap对象存储敏感信息,则可以使用Frida hook该方法并在其中打印该TreeMap对象的内容。
6. 猜:有时候您可能需要依靠直觉和经验来猜测应用程序中的特定代码段或数据流。例如,如果您知道某个应用程序使用了加密技术,但不确定具体使用了哪种加密方式,则可以尝试hook验证并打印调用栈追踪以获取更多信息。
1. https://1024tools.com/hash:该网站提供了许多加密算法的实现,并且支持在线输入文本并输出加密结果。您可以使用它来验证您自己的实现或查看某个应用程序是否在存储敏感信息时使用了适当的加密技术。
2. https://curlconverter.com/:该网站提供了一种将cURL命令转换为其他编程语言(如Python、Java等)的简单方法。这对于重现和测试某些API调用非常有用,因为您可以轻松地将cURL命令转换为您喜欢的编程语言并直接在代码中使用。
Java是Android应用程序开发中最常用的编程语言之一。以下是一些可能有用的技巧:
查找特定类:使用dexdump
命令可以反编译APK文件并列出其中包含的所有类。例如,要查找名称为“MainActivity”的类,您可以运行以下命令:dexdump -f classes.dex | grep MainActivity
解码加密数据:如果应用程序存储了加密数据(如API密钥或访问令牌),则您需要解码它们以进行进一步分析。例如,假设您已经确定某个应用程序使用BASE64编码来存储敏感信息,您可以使用以下代码将其解码:
import android.util.Base64;
public class Decryptor {
public static String decode(String encoded) {
byte[] decodedBytes = Base64.decode(encoded, Base64.DEFAULT);
return new String(decodedBytes);
}
}
Python是一种流行的脚本语言,可用于编写脚本、自动化工具和网络抓包工具。以下是一些可能有用的技巧:
https://example.com/api
发送GET请求:import requests
response = requests.get('https://example.com/api')
print(response.json())
import json
json_str = '{"name": "Alice", "age": 22}'
data = json.loads(json_str)
print(data['name'])
C/C++对于理解底层代码、实现原理和进行漏洞分析非常有用。以下是一些可能有用的技巧:
使用IDA Pro分析二进制文件:IDA Pro是一款流行的反汇编器和静态分析工具,可帮助您理解二进制文件的结构和执行流程。
检测缓冲区溢出漏洞:缓冲区溢出漏洞是最常见的漏洞类型之一。您可以使用C/C++编写测试代码来检测这些漏洞。
#include
void vulnerable_function(char* input) {
char buffer[10];
strcpy(buffer, input);
}
int main() {
char exploit[] = "0123456789012345678901234567890123456789";
vulnerable_function(exploit);
return 0;
}
Frida是一个功能强大的动态插桩工具,可用于在Android和iOS设备上进行逆向工程、安全测试和漏洞利用等方面。以下是一些可能有用的Frida技巧:
Interceptor
对象可以hook任意指定函数,包括应用程序中的Java层和Native层函数。例如,假设您想监视java.net.HttpURLConnection
的connect()
方法并打印它的参数和返回值,可以使用以下代码:
Java.use('java.net.HttpURLConnection').__wrap_connect.implementation = function() {
console.log('[+] HttpURLConnection.connect() called with args: ' + Array.prototype.slice.call(arguments));
var ret = this.__wrap_connect.apply(this, arguments);
console.log('[+] HttpURLConnection.connect() returned: ' + ret);
return ret;
}
console.log()
将调试信息打印到Frida客户端上的控制台。您可以在Frida脚本中添加console.log()
语句来打印调试信息。例如,假设您想查看某个应用程序发送的HTTP请求的头部信息,您可以使用以下代码:
Interceptor.attach(Module.findExportByName('libokhttp3.so', 'interceptRequest'), {
onEnter: function(args) {
console.log('[+] Intercepting OkHttp request');
var request = Java.cast(args[0], Java.use('okhttp3.Request'));
console.log(request.url().toString());
console.log(request.headers().toString());
},
onLeave: function(retval) {}
});
Interceptor
对象可拦截并修改应用程序发出的网络请求。您可以使用该功能抓取API响应、修改API请求的内容等。例如,假设您想拦截应用程序发送的所有HTTP请求并向URL https://example.com/api
发送自定义响应,您可以使用以下代码:
Interceptor.attach(Module.findExportByName('libokhttp3.so', 'interceptRequest'), {
onEnter: function(args) {
console.log('[+] Intercepting OkHttp request');
var request = Java.cast(args[0], Java.use('okhttp3.Request'));
if (request.url().toString().startsWith('https://example.com/api')) {
console.log('[+] Sending custom response...');
args[1].writeUtf8('{ "message": "Hello from Frida!" }');
args[1].close();
this.replace(0);
}
},
onLeave: function(retval) {}
});
Android Studio和Xcode是Android和iOS应用程序开发的官方IDE,可用于构建和调试应用程序。以下是一些可能有用的技巧:
例如,假设您想查看某个Android应用程序中与WebView相关的Java代码。您可以使用Android Studio中的“查找”功能在整个项目中搜索关键字“WebView”,并浏览相关文件以了解其实现方式。
例如,假设您正在开发一个Android应用程序,需要在多个不同的设备上进行测试。您可以使用Android Studio中的模拟器创建多个虚拟设备,并测试应用程序在这些设备上的兼容性。
例如,假设您遇到了一个iOS应用程序崩溃的问题,您可以使用Xcode中的调试器打开应用程序,并设置断点以捕获崩溃时的堆栈跟踪和变量值。
Wireshark和Charles Proxy是流行的网络抓包工具,可用于捕获和分析应用程序中的网络流量。以下是一些可能有用的技巧:
例如,假设您想查看某个Android应用程序中的所有HTTP请求。您可以启动Charles Proxy并配置代理,然后在Android设备上安装Charles的CA证书并启用代理。然后,您可以在Charles中查看所有来自设备的HTTP请求,并将它们保存为PCAP文件供进一步分析。
例如,假设您想查看某个iOS应用程序中的API响应。您可以在Charles Proxy中找到相应的API请求,并查看其响应内容和状态码。如果响应是JSON格式,则可以使用在线JSON解析器将其解码为易于阅读的格式。
例如,假设您想在某个Android应用程序中修改API请求的内容。您可以使用Charles Proxy启用代理,并配置替换规则来修改请求的特定参数。然后,您可以发送修改后的API请求并查看应用程序如何处理它们。