lamda 7.80__tar.gz → 7.90__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {lamda-7.80 → lamda-7.90}/PKG-INFO +1 -1
- lamda-7.90/README.md +43 -0
- {lamda-7.80 → lamda-7.90}/lamda/__init__.py +1 -1
- {lamda-7.80 → lamda-7.90}/lamda/client.py +100 -7
- {lamda-7.80 → lamda-7.90}/lamda/rpc/application.proto +1 -0
- {lamda-7.80 → lamda-7.90}/lamda.egg-info/PKG-INFO +1 -1
- lamda-7.80/README.md +0 -52
- {lamda-7.80 → lamda-7.90}/lamda/bcast.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/const.py +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/exceptions.py +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/any.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/api.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/compiler/plugin.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/descriptor.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/duration.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/empty.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/field_mask.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/source_context.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/struct.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/timestamp.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/type.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/google/protobuf/wrappers.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/debug.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/file.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/policy.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/proxy.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/services.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/settings.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/shell.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/status.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/storage.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/types.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/uiautomator.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/util.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/rpc/wifi.proto +0 -0
- {lamda-7.80 → lamda-7.90}/lamda/types.py +0 -0
- {lamda-7.80 → lamda-7.90}/lamda.egg-info/SOURCES.txt +0 -0
- {lamda-7.80 → lamda-7.90}/lamda.egg-info/dependency_links.txt +0 -0
- {lamda-7.80 → lamda-7.90}/lamda.egg-info/not-zip-safe +0 -0
- {lamda-7.80 → lamda-7.90}/lamda.egg-info/requires.txt +0 -0
- {lamda-7.80 → lamda-7.90}/lamda.egg-info/top_level.txt +0 -0
- {lamda-7.80 → lamda-7.90}/setup.cfg +0 -0
- {lamda-7.80 → lamda-7.90}/setup.py +0 -0
lamda-7.90/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
<p align="center">
|
2
|
+
<img src="image/logo.svg" alt="LAMDA" width="345">
|
3
|
+
</p>
|
4
|
+
|
5
|
+
<p align="center">安卓 RPA 机器人框架,下一代移动端数据自动化机器人</p>
|
6
|
+
|
7
|
+
<p align="center">
|
8
|
+
<img src="https://img.shields.io/badge/python-3.6+-blue.svg?logo=python&labelColor=yellow" />
|
9
|
+
<img src="https://img.shields.io/badge/android-6.0+-blue.svg?logo=android&labelColor=white" />
|
10
|
+
<img src="https://img.shields.io/badge/root%20require-red.svg?logo=android&labelColor=black" />
|
11
|
+
<img src="https://img.shields.io/github/downloads/rev1si0n/lamda/total" />
|
12
|
+
<img src="https://img.shields.io/github/v/release/rev1si0n/lamda" />
|
13
|
+
</p>
|
14
|
+
|
15
|
+
<p align="center"><a href="https://device-farm.com/doc/index.html">使用文档</a> | <a href="https://t.me/lamda_dev">TELEGRAM</a> | <a href="https://lamda.run/join/qq">QQ 群组</a> | <a href="https://github.com/rev1si0n/lamda/blob/HEAD/CHANGELOG.txt">更新历史</a></p>
|
16
|
+
|
17
|
+
智能机的崛起,传统网页端的普及度也开始显著减弱,数据与应用正加速向移动端转移。越来越多的人选择通过智能手机和平板等移动设备来获取信息和服务。随着移动设备的普及,用户享受到更便捷访问体验,传统的网页内容模式面临重新审视。与此同时,数据采集的技术也亟需适应这一趋势。过去,许多数据采集工具专注于网页内容,在移动端环境中,尤其是在移动端封闭的黑盒中,现今的常规采集技术也面临着新的挑战。LAMDA 的诞生,为这一切创造了可能。
|
18
|
+
|
19
|
+
LAMDA 是**安卓领域的集大成者**,设计为减少**安全分析**及**应用测试**或**自动化**工作的时间和琐碎问题,经过超 500 台设备的生产环境考验,稳定应用于多个大型系统,包括自动化取证,云平台,数据采集,合规分析等,具备商业级软件的质量和稳定性,仅需 root 权限即可正常运行。具备 ARM/X86 全架构,安卓 6.0-14 的广泛兼容性,支持 **模拟器**、**真机**、**云手机**、 **WSA**(Windows Subsystem for Android™️)、**RK开发板** (所有 ARM 架构)以及 **Redroid** 等大多数运行安卓系统的设备。为**移动端 RPA 数据采集**提供稳定的解决方案,以**编程化**的**接口**替代大量手动操作,**易部署**,没有那些复杂花哨不跨平台的安装流程,你所需要的能力他大概率能做到并且做的更好。他并不是一个单一功能的框架,他是集 Appium、uiautomator **自动化**的超集同时具备**逆向**领域如 **Hook** **抓包** **证书安装** **组网** **API跟踪** **手机自控** 等等各种能力的框架。当然,LAMDA 可以做到的远不止于此,你可以阅读使用文档尽情探索他的所有能力。
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
<h3><p align="center">丰富的设备编程接口</p></h3>
|
24
|
+
|
25
|
+
<p align="center">提供多达 160 条编程 API 接口,让你可以对安卓设备进行无微不至的管理和操作,提供了包括命令执行,系统设置,系统状态,应用相关,自动化相关,代理以及文件等十几个大类的接口。同时提供了封装完整的 Python 库让你可以快速上手使用。</p>
|
26
|
+
|
27
|
+
<h3><p align="center">简洁易用的远程桌面</p></h3>
|
28
|
+
|
29
|
+
<p align="center">
|
30
|
+
<img src="image/demo.gif" alt="动图演示" width="95%">
|
31
|
+
</p>
|
32
|
+
|
33
|
+
<h3><p align="center">一键中间人流量分析及更多其他功能</p></h3>
|
34
|
+
|
35
|
+
支持常规以及国际APP流量分析,DNS流量分析,得益于 [mitmproxy flow hook](https://docs.mitmproxy.org/stable/api/events.html),你可以对任何请求做到最大限度的掌控,mitmproxy 功能足够丰富,你可以使用 Python 脚本实时修改或者捕获应用的请求,也可以通过其 `Export` 选项导出特定请求的 `curl` 命令或者 `HTTPie` 命令,分析重放、拦截修改、功能组合足以替代你用过的任何此类商业/非商业软件。如果你仍不清楚 mitmproxy 是什么以及其具有的能力,请务必先查找相关文档,因为 LAMDA 将会使用 mitmproxy 为你展现应用请求。
|
36
|
+
|
37
|
+
<p align="center">
|
38
|
+
<img src="image/mitm.gif" alt="动图演示" width="95%">
|
39
|
+
</p>
|
40
|
+
|
41
|
+
<p align="center">
|
42
|
+
当然,LAMDA 提供的能力不止于这些,由于篇幅较长将不在此罗列,他是你强有力的设备控制及管理工具,如果你感兴趣,请转到 使用文档。
|
43
|
+
</p>
|
@@ -57,6 +57,8 @@ logger.addHandler(handler)
|
|
57
57
|
|
58
58
|
sys.path.append(joinpath(dirname(__file__)))
|
59
59
|
sys.path.append(joinpath(dirname(__file__), "rpc"))
|
60
|
+
# use native resolver to support mDNS
|
61
|
+
os.environ["GRPC_DNS_RESOLVER"] = "native"
|
60
62
|
|
61
63
|
protos, services = grpc.protos_and_services("services.proto")
|
62
64
|
__all__ = [
|
@@ -179,6 +181,8 @@ def contain(a, b):
|
|
179
181
|
b.right <= a.right])
|
180
182
|
|
181
183
|
def equal(a, b):
|
184
|
+
if not isinstance(b, protos.Bound):
|
185
|
+
return False
|
182
186
|
return all([b.top == a.top,
|
183
187
|
b.left == a.left,
|
184
188
|
b.bottom == a.bottom,
|
@@ -194,6 +198,8 @@ Corner = protos.Corner
|
|
194
198
|
Direction = protos.Direction
|
195
199
|
GproxyType = protos.GproxyType
|
196
200
|
GrantType = protos.GrantType
|
201
|
+
ScriptRuntime = protos.ScriptRuntime
|
202
|
+
DataEncode = protos.DataEncode
|
197
203
|
|
198
204
|
Group = protos.Group
|
199
205
|
Key = protos.Key
|
@@ -256,8 +262,6 @@ TouchSequence.appendUp = touchSequenceAppendUp
|
|
256
262
|
TouchSequence.__getitem__ = touchSequenceIndexer
|
257
263
|
TouchSequence.__iter__ = touchSequenceIter
|
258
264
|
|
259
|
-
DataEncode = protos.DataEncode
|
260
|
-
ScriptRuntime = protos.ScriptRuntime
|
261
265
|
HookRpcRequest = protos.HookRpcRequest
|
262
266
|
HookRpcResponse = protos.HookRpcResponse
|
263
267
|
|
@@ -385,13 +389,14 @@ class GrpcRemoteExceptionInterceptor(ClientInterceptor):
|
|
385
389
|
|
386
390
|
|
387
391
|
class ObjectUiAutomatorOpStub:
|
388
|
-
def __init__(self,
|
392
|
+
def __init__(self, caller, selector):
|
389
393
|
"""
|
390
394
|
UiAutomator 子接口,用来模拟出实例的意味
|
391
395
|
"""
|
392
396
|
self._selector = selector
|
393
397
|
self.selector = Selector(**selector)
|
394
|
-
self.stub = stub
|
398
|
+
self.stub = caller.stub
|
399
|
+
self.caller = caller
|
395
400
|
def __str__(self):
|
396
401
|
selector = ", ".join(["{}={}".format(k, v) \
|
397
402
|
for k, v in self._selector.items()])
|
@@ -403,7 +408,7 @@ class ObjectUiAutomatorOpStub:
|
|
403
408
|
s.setdefault("childOrSiblingSelector", [])
|
404
409
|
s["childOrSiblingSelector"].append(selector)
|
405
410
|
s["childOrSibling"].append(name)
|
406
|
-
return self.__class__(self.
|
411
|
+
return self.__class__(self.caller, s)
|
407
412
|
def child(self, **selector):
|
408
413
|
"""
|
409
414
|
匹配选择器里面的子节点
|
@@ -494,6 +499,72 @@ class ObjectUiAutomatorOpStub:
|
|
494
499
|
req = protos.SelectorOnlyRequest(selector=self.selector)
|
495
500
|
r = self.stub.selectorObjInfoOfAllInstances(req)
|
496
501
|
return r.objects
|
502
|
+
def all_instances(self):
|
503
|
+
"""
|
504
|
+
获取选择器选中的所有元素控件
|
505
|
+
"""
|
506
|
+
return list(self)
|
507
|
+
def _new_object(self, **kwargs):
|
508
|
+
selector = copy.deepcopy(self._selector)
|
509
|
+
selector.update(**kwargs)
|
510
|
+
instance = self.caller(**selector)
|
511
|
+
return instance
|
512
|
+
def text(self, txt):
|
513
|
+
return self._new_object(text=txt)
|
514
|
+
def resourceId(self, name):
|
515
|
+
return self._new_object(resourceId=name)
|
516
|
+
def description(self, desc):
|
517
|
+
return self._new_object(description=desc)
|
518
|
+
def packageName(self, name):
|
519
|
+
return self._new_object(packageName=name)
|
520
|
+
def className(self, name):
|
521
|
+
return self._new_object(className=name)
|
522
|
+
def textContains(self, needle):
|
523
|
+
return self._new_object(textContains=needle)
|
524
|
+
def descriptionContains(self, needle):
|
525
|
+
return self._new_object(descriptionContains=needle)
|
526
|
+
def textStartsWith(self, needle):
|
527
|
+
return self._new_object(textStartsWith=needle)
|
528
|
+
def descriptionStartsWith(self, needle):
|
529
|
+
return self._new_object(descriptionStartsWith=needle)
|
530
|
+
def textMatches(self, match):
|
531
|
+
return self._new_object(textMatches=match)
|
532
|
+
def descriptionMatches(self, match):
|
533
|
+
return self._new_object(descriptionMatches=match)
|
534
|
+
def resourceIdMatches(self, match):
|
535
|
+
return self._new_object(resourceIdMatches=match)
|
536
|
+
def packageNameMatches(self, match):
|
537
|
+
return self._new_object(packageNameMatches=match)
|
538
|
+
def classNameMatches(self, match):
|
539
|
+
return self._new_object(classNameMatches=match)
|
540
|
+
def checkable(self, value):
|
541
|
+
return self._new_object(checkable=value)
|
542
|
+
def clickable(self, value):
|
543
|
+
return self._new_object(clickable=value)
|
544
|
+
def focusable(self, value):
|
545
|
+
return self._new_object(focusable=value)
|
546
|
+
def scrollable(self, value):
|
547
|
+
return self._new_object(scrollable=value)
|
548
|
+
def longClickable(self, value):
|
549
|
+
return self._new_object(longClickable=value)
|
550
|
+
def enabled(self, value):
|
551
|
+
return self._new_object(enabled=value)
|
552
|
+
def checked(self, value):
|
553
|
+
return self._new_object(checked=value)
|
554
|
+
def focused(self, value):
|
555
|
+
return self._new_object(focused=value)
|
556
|
+
def selected(self, value):
|
557
|
+
return self._new_object(selected=value)
|
558
|
+
def index(self, idx):
|
559
|
+
return self._new_object(index=idx)
|
560
|
+
def instance(self, idx):
|
561
|
+
return self._new_object(instance=idx)
|
562
|
+
def __iter__(self):
|
563
|
+
"""
|
564
|
+
遍历所有符合选择器条件的元素实例
|
565
|
+
"""
|
566
|
+
yield from [self.instance(i) for i in \
|
567
|
+
range(self.count())]
|
497
568
|
def count(self):
|
498
569
|
"""
|
499
570
|
获取选择器选中控件的数量
|
@@ -962,7 +1033,7 @@ class UiAutomatorStub(BaseServiceStub):
|
|
962
1033
|
r = self.stub.waitForIdle(protos.Integer(value=timeout))
|
963
1034
|
return r.value
|
964
1035
|
def __call__(self, **kwargs):
|
965
|
-
return ObjectUiAutomatorOpStub(self
|
1036
|
+
return ObjectUiAutomatorOpStub(self, kwargs)
|
966
1037
|
|
967
1038
|
|
968
1039
|
class AppScriptRpcInterface(object):
|
@@ -1140,6 +1211,7 @@ class ApplicationOpStub:
|
|
1140
1211
|
def attach_script(self, script, runtime=ScriptRuntime.RUNTIME_QJS,
|
1141
1212
|
emit="",
|
1142
1213
|
encode=DataEncode.DATA_ENCODE_NONE,
|
1214
|
+
spawn=False,
|
1143
1215
|
standup=5):
|
1144
1216
|
"""
|
1145
1217
|
向应用注入持久化 Hook 脚本
|
@@ -1151,6 +1223,7 @@ class ApplicationOpStub:
|
|
1151
1223
|
req.script = script
|
1152
1224
|
req.runtime = runtime
|
1153
1225
|
req.standup = standup
|
1226
|
+
req.spawn = spawn
|
1154
1227
|
req.destination = emit
|
1155
1228
|
req.encode = encode
|
1156
1229
|
r = self.stub.attachScript(req)
|
@@ -2042,6 +2115,14 @@ class Device(object):
|
|
2042
2115
|
session=None):
|
2043
2116
|
self.certificate = certificate
|
2044
2117
|
self.server = "{0}:{1}".format(host, port)
|
2118
|
+
policy = dict()
|
2119
|
+
policy["maxAttempts"] = 5
|
2120
|
+
policy["retryableStatusCodes"] = ["UNAVAILABLE"]
|
2121
|
+
policy["backoffMultiplier"] = 2
|
2122
|
+
policy["initialBackoff"] = "0.5s"
|
2123
|
+
policy["maxBackoff"] = "15s"
|
2124
|
+
config = json.dumps(dict(methodConfig=[{"name": [{}],
|
2125
|
+
"retryPolicy": policy,}]))
|
2045
2126
|
if certificate is not None:
|
2046
2127
|
with open(certificate, "rb") as fd:
|
2047
2128
|
key, crt, ca = self._parse_certdata(fd.read())
|
@@ -2051,10 +2132,14 @@ class Device(object):
|
|
2051
2132
|
self._chan = grpc.secure_channel(self.server, creds,
|
2052
2133
|
options=(("grpc.ssl_target_name_override",
|
2053
2134
|
self._parse_cname(crt)),
|
2135
|
+
("grpc.service_config", config),
|
2054
2136
|
("grpc.enable_http_proxy",
|
2055
2137
|
0)))
|
2056
2138
|
else:
|
2057
|
-
self._chan = grpc.insecure_channel(self.server
|
2139
|
+
self._chan = grpc.insecure_channel(self.server,
|
2140
|
+
options=(("grpc.service_config", config),
|
2141
|
+
("grpc.enable_http_proxy", 0))
|
2142
|
+
)
|
2058
2143
|
session = session or uuid.uuid4().hex
|
2059
2144
|
interceptors = [ClientSessionMetadataInterceptor(session),
|
2060
2145
|
GrpcRemoteExceptionInterceptor(),
|
@@ -2068,6 +2153,14 @@ class Device(object):
|
|
2068
2153
|
def frida(self):
|
2069
2154
|
if _frida_dma is None:
|
2070
2155
|
raise ModuleNotFoundError("frida")
|
2156
|
+
try:
|
2157
|
+
device = _frida_dma.get_device_matching(
|
2158
|
+
lambda d: d.name==self.server)
|
2159
|
+
# make a call to check server connectivity
|
2160
|
+
device.query_system_parameters()
|
2161
|
+
return device
|
2162
|
+
except:
|
2163
|
+
""" No-op """
|
2071
2164
|
kwargs = {}
|
2072
2165
|
if self.certificate is not None:
|
2073
2166
|
kwargs["certificate"] = self.certificate
|
lamda-7.80/README.md
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
<p align="center">
|
2
|
-
<img src="image/logo.svg" alt="LAMDA" width="345">
|
3
|
-
</p>
|
4
|
-
|
5
|
-
<p align="center">安卓 RPA 机器人框架,下一代移动端数据自动化机器人</p>
|
6
|
-
|
7
|
-
<p align="center">
|
8
|
-
<img src="https://img.shields.io/badge/python-3.6+-blue.svg?logo=python&labelColor=yellow" />
|
9
|
-
<img src="https://img.shields.io/badge/android-6.0+-blue.svg?logo=android&labelColor=white" />
|
10
|
-
<img src="https://img.shields.io/badge/root%20require-red.svg?logo=android&labelColor=black" />
|
11
|
-
<img src="https://img.shields.io/github/downloads/rev1si0n/lamda/total" />
|
12
|
-
<img src="https://img.shields.io/github/v/release/rev1si0n/lamda" />
|
13
|
-
</p>
|
14
|
-
|
15
|
-
<p align="center"><a href="https://device-farm.com/doc/index.html">使用文档</a> | <a href="https://t.me/lamda_dev">TELEGRAM</a> | <a href="https://lamda.run/join/qq">QQ 群组</a> | <a href="https://github.com/rev1si0n/lamda/blob/HEAD/CHANGELOG.txt">更新历史</a></p>
|
16
|
-
|
17
|
-
智能机的崛起,传统网页端的普及度也开始显著减弱,数据与应用正加速向移动端转移。越来越多的人选择通过智能手机和平板等移动设备来获取信息和服务。随着移动设备的普及,用户享受到更便捷、更即时的访问体验,传统的网页内容消费模式面临重新审视。与此同时,数据采集的技术也亟需适应这一趋势。过去,许多数据采集工具专注于网页内容,但在移动端环境中,尤其是在移动端封闭的黑盒中,现今的常规采集技术也面临着新的挑战。LAMDA 的诞生,为这一切创造了可能。
|
18
|
-
|
19
|
-
LAMDA 是一个**安卓领域的集大成者**,设计为减少**安全分析**及**应用测试**工作的时间和琐碎问题,为**移动端RPA数据采集**提供稳定的解决方案,以**编程化**的**接口**替代大量手动操作,**易部署**,没有那些复杂花哨不跨平台的安装流程,你所需要的能力他大概率能做到并且做的更好。他并不是一个单一功能的框架,他是集 Appium、uiautomator **自动化**的超集同时具备**逆向**领域如 **Hook** **抓包** **证书安装** **组网** **API跟踪** **手机自控** 等等各种能力的框架。为了让你大概了解它的用处:你是否会在手机上安装各类代理、插件或者点来点去的设置来完成你的工作?你是否要在异地操作远在千里之外的手机?你是否有编程控制手机的需求?是否还在某些云手机厂商那里购买昂贵的 **IP切换**、**远程ADB调试**、**RPA自动化**甚至连 **logcat 日志** 都要付费的服务?如果有,那么对了,只需一个 LAMDA 即可解决所有问题。并且,他更注重**分布式**,事实上,你可以在一台公网服务器上管理散布在世界各地各种网络环境中的设备。当然,LAMDA 可以做到的远不止于此,你可以阅读使用文档尽情探索他的所有能力。
|
20
|
-
|
21
|
-
<p align="center"><b>长期维护及更新,质量稳定,安全可靠,生产环境可用<br>现稳定应用于多个外部大型系统,包括自动化取证,云平台,数据采集,涉诈应用分析系统等<br>本框架已稳定运行于各种数据生产环境五年以上</b></p>
|
22
|
-
|
23
|
-
<p align="center">
|
24
|
-
<img src="image/wx.png" alt="公众号" width="234">
|
25
|
-
</p>
|
26
|
-
<p align="center"><small>关注公众号查看视频教程以及更多使用方法</small><br><small><a href="https://space.bilibili.com/1964784386/video">B站教程视频同步发布</a></small>
|
27
|
-
</p>
|
28
|
-
|
29
|
-
经过超 500 台设备的稳定生产环境考验,具有**商业级软件**的**质量**和**稳定性**,仅需 root 权限即可正常运行。具备 ARM/X86 全架构,安卓 6.0-14 的广泛兼容性,支持 **模拟器**、**真机**、**云手机**、 **WSA**(Windows Subsystem for Android™️)、**无头开发板** (RK3399、3588 及任何 ARM 架构开发板)以及 **Redroid** 等大多数运行安卓系统的设备。提供大量可编程接口,支持界面布局检视、获取/重放系统中最近的 Activity、唤起应用的 Activity 等功能。除此之外,它支持大文件上传下载,远程桌面,以及UI自动化编程接口,点击、截图、获取界面元素、执行 shell 命令、设备状态、资源读取、系统配置、属性读写、一键中间人等,可通过 SSH 或内置 ADB 登录设备终端。具备 socks5、OpenVPN 代理并可通过接口轻松设置系统证书及中间人,同时支持定时任务、Magisk开机自启动,你可以在任何地方通过网络连接运行着 LAMDA 设备。
|
30
|
-
|
31
|
-
|
32
|
-
<h3><p align="center">丰富的设备编程接口</p></h3>
|
33
|
-
|
34
|
-
<p align="center">LAMDA 提供多达 160 条编程 API 接口,让你可以对安卓设备进行无微不至的管理和操作,提供了包括命令执行,系统设置,系统状态,应用相关,自动化相关,代理以及文件等十几个大类的接口。同时提供了封装完整的 Python 库让你可以快速上手使用。</p>
|
35
|
-
|
36
|
-
<h3><p align="center">简洁易用的远程桌面</p></h3>
|
37
|
-
|
38
|
-
<p align="center">
|
39
|
-
<img src="image/demo.gif" alt="动图演示" width="95%">
|
40
|
-
</p>
|
41
|
-
|
42
|
-
<h3><p align="center">一键中间人流量分析及更多其他功能</p></h3>
|
43
|
-
|
44
|
-
支持常规以及国际APP流量分析,DNS流量分析,得益于 [mitmproxy flow hook](https://docs.mitmproxy.org/stable/api/events.html),你可以对任何请求做到最大限度的掌控,mitmproxy 功能足够丰富,你可以使用 Python 脚本实时修改或者捕获应用的请求,也可以通过其 `Export` 选项导出特定请求的 `curl` 命令或者 `HTTPie` 命令,分析重放、拦截修改、功能组合足以替代你用过的任何此类商业/非商业软件。如果你仍不清楚 mitmproxy 是什么以及其具有的能力,请务必先查找相关文档,因为 LAMDA 将会使用 mitmproxy 为你展现应用请求。
|
45
|
-
|
46
|
-
<p align="center">
|
47
|
-
<img src="image/mitm.gif" alt="动图演示" width="95%">
|
48
|
-
</p>
|
49
|
-
|
50
|
-
<p align="center">
|
51
|
-
当然,LAMDA 提供的能力不止于这些,由于篇幅较长将不在此罗列,他是你强有力的设备控制及管理工具,如果你感兴趣,请转到 使用文档。
|
52
|
-
</p>
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|