1.对小绵羊轰炸APP的逆向分析
2.十分钟弄懂最快的APP自动化工具uiautomator2(入门到精通)
3.Android自动化测试框架uiautomator2详解
4.å¦ä½ä½¿ç¨åè°è¯ android UIAutomator
5.在某些版本手机中通过UIAutomatorViewer工具无法获取手机屏幕元素的信息?
6.Android Studio 中使用uiautomatorviewer插件
对小绵羊轰炸APP的逆向分析
偶然的机会,我接触到了一款名为“小绵羊”的轰炸APP。该APP的主要功能是用户可以在编辑框中输入指定的手机号码,然后APP会对该号码进行短信的狂轰滥炸。接下来,我将从开发者的挖掘鸡 源码视角,对这款APP进行深入的逆向分析。
首先,对于这类潜在风险的APP,建议在模拟器上进行安装和分析,这样能够确保分析过程的安全。通过壳分析,我们发现“小绵羊”APP并没有使用加固保护,这大大简化了分析的难度。使用jadx工具,我们揭示了APP的结构,它主要由Java代码、C++代码(SO文件)、资源数据、Lua数据和签名信息构成。Java层的代码使用了proguard插件进行了混淆保护,虽然成本不高,但混淆的效果并不明显。
当我们启动APP,使用uiautomatorviewer工具进行分析后,发现界面主要由一个EditText和三个Button控件组成。界面的obd 源码背景颜色是通过Lua脚本实现的。APP的签名信息使用的是V1方式,这是Android最早期的数字证书签名方式。V1签名适用于Android 7.0系统中引入的V2签名,以及Android 9.0系统中引入的V3签名。当前,大多数APP都采用了V1和V2签名相结合的方式,以确保签名的顺序正确。
在Android的开发过程中,签名是一个必要的步骤,它能够确保APP能够通过系统的验证,并且能够顺利的安装。数字证书遵循的是X.的国际标准,它用于验证身份和公钥信息。在AndroidManifest.xml文件中,包含了APP所需的权限、四大组件的信息以及包相关的配置。APP申请的权限符合Android的安全机制和国内的合规要求,具体的权限包括:访问网络、获取网络信息、WiFi接入、写入外部存储、读写短信、读写系统设置、清除缓存、连接蓝牙、振动、wps 源码读取日志和截图。
APP的功能主要集成在Lua脚本中,包括界面的显示和轰炸功能。Lua是一种动态的脚本语言,需要通过JNI封装,才能在Java环境中使用。用户输入手机号后,APP会执行发送个网络数据包的操作,主要针对各种网站的注册验证码进行轰炸。脚本中还包含了对***的判断,如果网络状态是***,APP会记录时间点并关闭自己。
对于这款APP的破解,只需要清空禁用文件即可。APP所使用的SO文件是通用的网络和socket操作,并没有太多的研究价值。通过分析libsocket.so,我们可以确认APP使用的是LuaSocket 3.0版本,这个版本提供了多种网络协议的访问操作。
总结来说,这款轰炸APP并没有采取任何的保护措施,因此分析起来相对简单。在分析过程中,主要使用的工具包括jadx、charles、ida和uiautomatorviewer。retrofit 源码开发者精心设计了个网站的轰炸功能。然而,对于这种具有攻击性的APP,我们应当保持谨慎的态度,警惕免费功能背后可能隐藏的风险。
十分钟弄懂最快的APP自动化工具uiautomator2(入门到精通)
前言
了解许多使用appium进行应用自动化测试的人会发现,appium运行效率较低、耗时长,而uiautomatorviewer在定位UI元素时需要关闭appium server,同时在低版本的appium上获取toast需要进行额外的配置。而uiautomator2作为uiautomator的升级版,通过封装为Python库,提供了简便的环境搭建、快速的执行速度、便捷的UI元素定位、简单获取toast功能。本篇文章将带你快速掌握uiautomator2,用十分钟时间深入了解。
一、介绍
uiautomator2是Google开发的一款针对Android应用自动化测试的Java库的升级版本,它以Python库的形式提供,简化了开发流程。其主要优点包括环境搭建方便、执行速度快、UI元素定位直观便捷、易于理解,innodb 源码且能够轻松获取toast信息。
二、环境部署
1. 安装adb并配置环境变量,查看版本以确保安装成功。
2. 使用pip安装uiautomator2库,运行命令:pip install -U uiautomator2。
3. 下载并安装atx-agent,确保adb devices能查看到模拟器连接,并通过python-m uiautomator2 init命令安装。
4. 使用pip安装weditor,命令:pip install -U weditor,实现UI元素的可视化查看。
三、编写百度贴吧首页脚本
本节将通过编写百度贴吧首页自动化测试用例,来展示uiautomator2提供的方法和特性。以下步骤将逐步介绍如何使用uiautomator2连接设备、启动app、使用UI元素定位和滑动操作,以及如何编写测试代码。
四、uiautomator2与appium运行速度比较
通过对比使用uiautomator2和appium执行相同用例的运行时间,发现uiautomator2在相同条件下运行时间更短,效率更高。随着用例复杂度的增加,性能优势更为显著。
五、总结
uiautomator2提供了一个功能全面、易于上手的自动化测试工具,通过本文的介绍,你将能够快速掌握uiautomator2的关键功能,提升应用自动化测试的效率。此外,通过加入软件测试学习交流群,你可以与同行交流经验,共同提升测试技能。
请记住,不断学习和实践是提升技能的关键,同时要保持对新技术的好奇心和学习动力。在软件测试的道路上,内外兼修才能让你更加强大。
Android自动化测试框架uiautomator2详解
uiautomator2是一种Android自动化测试框架,它提供了多种操作方法,如点击、长按、输入文本、滑动、拖拽、截屏等,能够模拟用户的各种动作。用户可以通过控件的id或text等属性,定位到控件,从而对控件实施上述操作。
在搭建环境时,首先需要配置python环境变量,将指定的路径添加到系统环境变量中的path中。接着,设置pycharm的编码格式,避免乱码。最后,通过运行特定的代码安装uiautomator2。
若内网无法下载,可以尝试使用手机为PC开启热点。weditor是一种页面信息查看工具,可以查看页面包名、运行的Activity、页面布局、控件等信息。若执行初始化命令失败,可能是端口被其他进程占用,可以通过查看占用该端口的进程并kill掉,或者执行特定命令后再尝试。
用户可以通过坐标控制按钮,但通过坐标不能获取对文本框的控制权。控件通常具有resourceId、text、description、className等属性,用户可以通过这些属性轻松定位到指定控件,实现对控件的控制。
uiautomatorviewer是Android SDK中提供的页面信息查看工具,用户可以通过单击文件进入界面。使用Android Studio下载最新的platform-tools和tools,配置系统环境变量,关闭ATX软件。
在应用uiautomator2框架时,需要导入包。设备连接分为有线连接和无线连接。应用控制包括安装应用、打开应用、关闭应用、关闭所有应用。元素定位可以通过控件的属性进行。元素控制包括单击、双击、长按、文本操作等。手势控制包括滑动、拖拽。系统控制包括按键、旋转、截屏等。此外,还可以通过adb shell input和os.system(command)实现模拟输入。
å¦ä½ä½¿ç¨åè°è¯ android UIAutomator
Googleå¨sdk4.0以åæä¾äºä¸ä¸ªèªå¨å解å³æ¹æ¡uiautomatorï¼
ä¼ç¹ï¼å¯ä»¥è·¨åºç¨äºï¼è¿å¯æ¯äº²ççï¼
缺ç¹ï¼å¿ é¡»sdk4.0以ä¸çæ¬ï¼è¦æ³å®ç°ç好ï¼æ好æå¼åé åï¼java项ç®ç¼è¯ä¸ºjaråéè¦pushå°ææºæè½è¿è¡ï¼ä¹å°±æ¯è¯´å¿ é¡»æå°æ¥å¿æ´åè°è¯ã
AppiumåºäºAndroid InstrumentationFrameworkåUIAutomatorï¼ä¹å°±æ¯è¯´è¿ä¸ªå·¥å ·æ¯å¯ä»¥è·¨åºç¨çã说è¿äºï¼å¥½å§ï¼ä¸ºäºå¸®å¤§å®¶æ´å®¹æç解appiumç使ç¨ï¼æè¿é就讲ä¸ä¸uiautomatorç使ç¨æ¹æ³ã
ä½ åºè¯¥æandroid-sdkå§ï¼å级å°4.0以ä¸ï¼è¿å ¥ç®å½android-sdk\toolsï¼ä½ ä¼çå°ä¸¤ä¸ªæ件ï¼
traceview.bat å uiautomatorviewer.batï¼è¿ä¿©æä»¶è®©ä½ æ³èµ·äºmonkeyrunneräºå§ï¼æ¯çï¼traceview.bat就对åºäºhierarchyviewer.batï¼ç¨æ¥æ¥çç¨åºçuiçé¢çï¼é常ä¹æ¯ä½¿ç¨ç®¡çåæéå¯å¨çã
好äºï¼ç°å¨ç¨eclipseå建ä¸ä¸ªjava projectï¼æ¯çï¼ä½ 没çéï¼æ¯java projectä¸æ¯android projectï¼æ·»å å¼ç¨ï¼
å¨project.propertiesä¸å 容为ï¼
# Project target.
target= android-
è¿éçandroid-éè¦åä¹åçandroid.jaråuiautomator.jarä½ç½®ç¸ä¸è´ã
ç¶åå¢ï¼å代ç å§ï¼å»ºç«ä¸ä¸ªç±»ï¼å¾ï¼å个ç»å¤§å®¶åèï¼
package com.uia.example.my;
import org.apache..android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core. UiSelector ;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TAppWorkAssistV1 extends UiAutomatorTestCase {
public String sLog ;
public File fout = null ;
public FileOutputStream outStream = null ;
public void write2fileï¼String filename,String sDataï¼
{
String sLog= ââ ;
// åå§åæ¥å¿æ件
if ï¼Environment. getExternalStorageState ï¼ï¼ãequalsï¼Environment.MEDIA_MOUNTED ï¼ï¼{
sLog = Environment. getExternalStorageDirectoryï¼ï¼ãgetAbsolutePathï¼ï¼ï¼
try {
fout = new Fileï¼sLog,filenameï¼ï¼
outStream = new FileOutputStreamï¼ fout , true ï¼ï¼ // æ¤å¤ç true æ¯append
sData=sData + â\nâ ;
outStream .writeï¼sData.getBytesï¼ï¼ï¼ï¼
outStream .flushï¼ï¼ï¼
outStream .closeï¼ï¼ï¼
fout = null ;
}
catch ï¼Exception eï¼{
e.printStackTraceï¼ï¼ï¼
}
} else {
System. out .printlnï¼ â 该ææºæ²¡æ SD å¡ â ï¼ï¼
}
}
public void testDemoï¼ï¼ throws UiObjectNotFoundException {
//1. å¯å¨ app
getUiDeviceï¼ï¼ãpressHomeï¼ï¼ï¼
UiObject allAppsButton = new UiObjectï¼ newUiSelectorï¼ï¼ãdescriptionï¼ âAppsâ ï¼ï¼ï¼
allAppsButton.clickAndWaitForNewWindowï¼ï¼ï¼
UiObject appsTab = new UiObjectï¼ new UiSelectorï¼ï¼ãtextï¼ âAppsâ ï¼ï¼ï¼
appsTab.clickï¼ï¼ï¼
UiScrollable appViews = new UiScrollableï¼ newUiSelectorï¼ï¼ãscrollableï¼ true ï¼ï¼ï¼
UiObject settingsApp = appViews.getChildByTextï¼ newUiSelectorï¼ï¼ãclassNameï¼android.widget.TextView. class .getNameï¼ï¼ï¼ï¼ âEfilmâ ï¼ï¼
settingsApp.clickAndWaitForNewWindowï¼ï¼ï¼
//2. è¿å ¥ä¸»çé¢
System. out .printlnï¼ âinto main viewâ ï¼ï¼
System. out .printlnï¼getUiDeviceï¼ï¼ãwaitForWindowUpdateï¼âcom.eshore.efilmâ , ï¼ï¼ï¼
System. out .printlnï¼ âintoed main viewâ ï¼ï¼
UiObject tv1 = new UiObjectï¼ new UiSelectorï¼ï¼ãtextï¼ â å½±é¢ â ï¼ï¼ï¼
tv1.clickï¼ï¼ï¼
//3. ç¹å»å½±é¢
UiObject oyy= new UiObjectï¼ new UiSelectorï¼ï¼ãdescriptionï¼âcinema_rowâ ï¼ï¼ï¼
System. out .printlnï¼ âwait yingyuan come outâ ï¼ï¼
oyy.waitForExistsï¼ï¼ï¼
System. out .printlnï¼ âyingyuan come outâ ï¼ï¼
oyy.clickAndWaitForNewWindowï¼ï¼ï¼
System. out .printlnï¼ âclick yingyuanâ ï¼ï¼
//4. åºæ¬¡
UiObject occ= new UiObjectï¼ new UiSelectorï¼ï¼ãdescriptionï¼âLinearLayoutâ ï¼ï¼ï¼
System. out .printlnï¼ âwait changci come outâ ï¼ï¼
oyy.waitForExistsï¼ï¼ï¼
System. out .printlnï¼ âchangci come outâ ï¼ï¼
occ.clickAndWaitForNewWindowï¼ï¼ï¼
System. out .printlnï¼ âclick changciâ ï¼ï¼
//5. 座ä½
UiObject oseat= new UiObjectï¼ new UiSelectorï¼ï¼ãdescriptionï¼âcinema_shows_list_itemâ ï¼ãindexï¼0ï¼ãchildSelectorï¼ newUiSelectorï¼ï¼ãdescriptionï¼ âLinearLayoutâ ï¼ï¼ï¼ï¼
System. out .printlnï¼ âwait seat come outâ ï¼ï¼
oseat.waitForExistsï¼ï¼ï¼
int h=getUiDeviceï¼ï¼ãgetDisplayHeightï¼ï¼ï¼
int w=getUiDeviceï¼ï¼ãgetDisplayWidthï¼ï¼ï¼
System. out .printlnï¼ âï¼h/2,w/2ï¼=â +h/2+ â,â +w/2ï¼ï¼
getUiDeviceï¼ï¼ãclickï¼h/2,w/2ï¼ï¼
//System.out.printlnï¼âseat count:â+String.valueOfï¼oseat.getChildCountï¼ï¼ï¼ï¼ï¼
//System.out.printlnï¼âseat getText:â+ oseat.getTextï¼ï¼ï¼ï¼
// æªåº§ä½å¾
Process process;
try {
process = Runtime. getRuntime ï¼ï¼ãexecï¼ âscreencap /mnt/sdcard/EfilmFailSnapShot.pngâ ï¼ï¼
try {
process.waitForï¼ï¼ï¼
} catch ï¼InterruptedException eï¼ { // TODO Auto-generated catch block
e.printStackTraceï¼ï¼ï¼
}
} catch ï¼IOException eï¼ {
// TODO Auto-generated catch block
e.printStackTraceï¼ï¼ï¼
}
//takeScreenShotsï¼âEfilmSeatSnapShotâï¼ï¼
}
}
è¿ä¸ªä¾åæ¯é便åçï¼å¯è½ä¸å¤ä¸¥è°¨ã大ä½å°±è¿ä¹ä¸ªæ åµå§ãä¸ä¸æ¥å°±æ¯ç¼è¯æ§è¡äºï¼å æä¸ææºusbæ¥å£ï¼ç¶åæå¼cmdï¼æ§è¡ï¼
æ¾å°SDKIDï¼ä¹å°±æ¯android createä¸ç-tåæ°ï¼
cd C:\ PROGRAM\android-sdk\tools
android list
æ¾å°tåæ°çå¼ä»¥åï¼
cd C:\ PROGRAM\android-sdk\tools
android create uitest-project -n TAppWorkAssistV1 -t -p C:\androidèªå¨å\Tv2.0\TestSetting
cd C:\androidèªå¨å\Tv2.0\TestSetting
ant build
cd C:\androidèªå¨å\Tv2.0\TestSetting\bin
adb push TAppWorkAssistV1.jar /data/local/tmp/
adb shell uiautomator runtest TAppWorkAssistV1.jar -c com.uia.example.my. TAppWorkAssistV1
çäºçï¼å¥½å没æä»ä¹ç¹å«å¼å¾è§£éç
-n TAppWorkAssistV1ï¼ç±»å
-p: 项ç®æå¨ç®å½
Ant build æè¿ä¸ªç±»ç¼è¯æä¸ä¸ªjarå ï¼TAppWorkAssistV1.jar
ç¶åæjarå pushå°ææºä¸ï¼è°ç¨æ§è¡è¿ä¸ªç±»å°±å¯ä»¥äº
大è´æ¯è¿ä¹ä¸ªæ¥éª¤ï¼ä¸è¿æä¸ä¸ªé常éè¦çç»èï¼å°±æ¯å¦æä½ éè¦æ´çå¿ï¼å°±æ好æçé¢å ç´ ï¼æ 论å¨æçè¿æ¯å¸å±æ件ä¸çï¼é½å ä¸content-descriptionå±æ§ï¼å¹¶ä¿è¯å¯ä¸æ§ï¼æ ¹æ®ï¼
UiSelector:descriptionï¼String descï¼
Set the search criteria to match thecontent-description property for a widget.
é£å°±å¯ä»¥ç»ä¸åªä½¿ç¨è¿ä¸ä¸ªå¼ç¨çé¢å ç´ çæ¹æ³å°±è¡äºï¼å°±ä¸ç¨å»æ³æ¹è®¾æ³å©ç¨å ¶å®çå±æ§æ¥å¼ç¨äºã
在某些版本手机中通过UIAutomatorViewer工具无法获取手机屏幕元素的信息?
如果你的工具只能获取到桌面,而进入任何一个APP界面,都无法获取到界面信息时,原因可能是sdk API版本过低,被听其他的瞎说什么手机没root,或者本身不支持之类,都是瞎扯。正确的解决方法是:
1.通过Android Studio或者IDEA下载更高级的API版本,我是把最新的,都下了,这和手机本身是不是android最新版本没关系。
2.升级后你可能会遇到一个adb连接不上手机的问题,这个请参考:
Android Studio 中使用uiautomatorviewer插件
在Android开发过程中,了解应用界面的布局与控件信息至关重要。本文介绍Android Studio中一款名为uiautomatorviewer.bat的插件,帮助开发者直观查看和分析Android设备上的UI组件。
Android Studio作为Google官方推荐的集成开发环境,集成了多种开发工具与资源管理,使开发者能高效地进行代码编写、调试、测试等操作。这款插件正是Android Studio集成的UI自动化工具之一,能帮助开发者在不打开应用的情况下,直接查看和分析设备屏幕上的UI控件。
安装uiautomatorviewer.bat插件相对简单,在Android Studio中打开SDK Manager,选择SDK Tools,并确保安装最新版本。插件安装完成后,可在指定路径下找到uiautomatorviewer.bat文件,双击即可启动。
使用uiautomatorviewer.bat时,屏幕会显示四个功能图标。通过这些图标,开发者可以轻松获取和管理设备上的控件信息。具体操作包括打开本地保存的View树文件、实时获取屏幕的控件层次结构信息、压缩显示控件信息及将控件结构保存为文件。在获取控件信息后,开发者可通过资源-id、类(class)、包(package)等属性,深入了解控件的属性与来源。
总之,uiautomatorviewer.bat插件为Android开发者提供了一种便捷的手段,用于查看和分析设备屏幕上的UI组件,有助于优化界面设计与交互逻辑。更多技术文章可关注“极客之昂”公众号,获取最新信息与交流。