Android系统反编译FrameWork层虚拟定位方法
做模拟定位功能时,传统方法通过应用定位服务、位源root权限或框架层的源码hook会面临系统安全限制和权限管理问题。因此,定定位转而探索直接从操作系统层面入手,位源试图修改系统类和函数,源码可信认证系统源码以达到与hook相同的定定位效果。在Android 6.0版本下,位源该方法已经成功应用于三大地图应用和短视频平台中,源码而在Android 7.0版本下,定定位虽然能够干扰三大地图的位源精准定位,但无法像在6.0版本那样模拟自己的源码位置信息。
在操作框架层的定定位10种塔罗牌源码反编译和修改过程中,主要包括如下关键步骤和改动:
1. **屏蔽wifi列表**:除了白名单应用外,位源禁止返回其他应用的源码wifi列表信息,以此削弱基于wifi定位的精准度。
2. **自定义上次连接的wifi网卡地址**:通过修改系统行为,让应用接收到的wifi信息与实际环境不符,以此干扰定位服务。
3. **禁止返回wifi相关信息**:防止应用获取到与真实环境不符的wifi信息,进一步降低定位准确性。
4. **wifi配置信息返回null**:避免应用接收到的wifi配置信息影响其定位算法。
5. **GSM基站信息写入**:引入虚拟的GSM基站信息,混淆定位系统对真实基站的识别。
6. **CDMA基站信息写入**:同样引入CDMA基站信息,wp源码卡密进一步干扰基站定位机制。
7. **GPS修改**:调整GPS信号,包括修改有效卫星数目等,以混淆定位服务对真实GPS信号的依赖。
8. **其他相关类反编译和修改**:对涉及定位功能的其他系统类进行反编译、修改,确保整体定位机制被干扰或误导。
在进行上述改动前,需要先了解Android系统在5.0版本后引入的ART(Android Runtime)技术,以便在system/framework目录中找到对应手机架构的oat文件。根据不同架构(如arm或arm)找到相应的oat文件,并使用oat2dex.jar工具解包,源码包启动用获取包含源代码的dex文件。接着,使用smali工具将dex文件转换为易于修改的smali文件,并在classes2.dex中添加自己的类,用于读取和模拟配置文件中的虚拟信息。通过修改location对象的创建过程,替换其中的关键属性值,如经纬度、时间戳、速度、海拔等,以达到模拟定位的求签公众号源码效果。
在Android 6.0版本下,上述方法成功应用于导航和短视频平台,而在Android 7.0版本下,虽然仍能干扰定位,但模拟定位功能的实现更为复杂。在7.0版本中,谷歌开放了获取GPS底层数据的途径,通过监听OnNmeaMessageListener并最终在GnssStatusListenerTransport类中创建原始数据对象,获取到包含坐标信息和卫星信息的NMEA格式数据。尽管可以修改这些数据,但未能有效实现模拟定位,可能的原因是仅针对wifi和基站信息的干扰不足以完全绕过系统定位逻辑。
通过上述方法的实施,尝试绕过传统定位机制的限制,实现了在特定条件下对定位服务的干扰或误导,展示了直接从操作系统层面修改和干扰定位服务的可能性,为定位服务的安全性和隐私保护提出了新的思考方向。
å¦ä½å©ç¨Androidç¼ç¨å®ç°GPSå®ä½
æ¨å¥½ï¼å¾é«å ´ä¸ºæ¨è§£çãä¸ãåå¤å·¥ä½
éè¦å¦ä¸ä¸ç§è½¯ä»¶ï¼
1. Eclipse
2. Android SDK
3. å¼åAndroidç¨åºçEclipse æ件
为äºå¼å§æ们çå·¥ä½ï¼é¦å è¦å®è£ Eclipseï¼ç¶åä»Googleçç½ç«è·å¾Android SDKï¼å¹¶ä¸å®è£ Eclipseæ件ã
äºãActivityç±»
æ¯ä¸ç§ç§»å¨å¼åç¯å¢é½æèªå·±çåºç±»ãå¦J2MEåºç¨ç¨åºçåºç±»æ¯midletsï¼BREWçåºç±»æ¯appletsï¼èAndroidç¨åºçåºç±»æ¯ Activityãè¿ä¸ªactivity为æ们æä¾äºå¯¹ç§»å¨æä½ç³»ç»çåºæ¬åè½åäºä»¶ç访é®ãè¿ä¸ªç±»å å«äºåºæ¬çæé æ¹æ³ï¼é®çå¤çï¼æèµ·æ¥æ¢å¤åè½ï¼ä»¥ åå ¶ä»åºå±çææ设å¤ç访é®ãå®è´¨ä¸ï¼æ们çåºç¨ç¨åºå°æ¯ä¸ä¸ªActivityç±»çæ©å±ãå¨æ¬æä¸è¯»è å°ä¼éè¿ä¾åå¦ä¹ å°å¦ä½ä½¿ç¨Activityç±»æ¥ç¼ åAndroidç¨åºãä¸é¢æ¯ä¸ä¸ªç®åç继æ¿Activityçä¾åã
public class LocateMe extends Activity{public void onCreate(Bundle params){
super.onCreate(params);
setContentView(R.layout.main);
}
public boolean onKeyDown(int keyCode, KeyEvent event){
return true;
}
}
ä¸ Viewç±»
Viewç±»æ¯Androidçä¸ä¸ªè¶ ç±»ï¼è¿ä¸ªç±»å ä¹å å«äºææçå±å¹ç±»åãä½å®ä»¬ä¹é´æä¸äºä¸åãæ¯ä¸ä¸ªviewé½æä¸ä¸ªç¨äºç»ç»çç»å¸ãè¿ä¸ªç»å¸å¯ä»¥ç¨ æ¥è¿è¡ä»»ææ©å±ãæ¬æ为äºæ¹ä¾¿èµ·è§ï¼åªæ¶åå°äºä¸¤ä¸ªä¸»è¦çViewç±»åï¼å®ä¹ViewåAndroidçXMLå 容Viewãå¨ä¸é¢ç代ç ä¸ï¼ä½¿ç¨çæ¯ âHello Worldâ XML Viewï¼å®æ¯ä»¥é常èªç¶çæ¹å¼å¼å§çã
å¦ææ们æ¥çä¸ä¸æ°çAndroidå·¥ç¨ï¼å°±ä¼åç°ä¸ä¸ªå«main.xmlçæ件ãå¨è¿ä¸ªæ件ä¸ï¼éè¿ä¸ä¸ªç®åçXMLæ件ï¼æè¿°äºä¸ä¸ªå±å¹çå¸å±ãè¿ä¸ª ç®åçxmlæ件çå 容å¦ä¸ï¼
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"
androidrientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerHoriz
android:text="ress the center key to locate yourself"
/>
</RelativeLayout>
ä¸é¢çå 容çåè½çèµ·æ¥é常ææ¾ãè¿ä¸ªç¹æ®æ件å®ä¹äºä¸ä¸ªç¸å ³çå¸å±ï¼è¿å°±æå³çéè¿ä¸ä¸ªå ç´ å°å¦ä¸ä¸ªå ç´ çå ³ç³»ææ¯å®ä»¬ç¶å ç´ çå ³ç³»æ¥æè¿°ã对äºè§å¾æ¥ 说ï¼æä¸äºç¨äºå¸å±çæ¹æ³ï¼ä½æ¯å¨æ¬æä¸åªå ³æ³¨äºä¸è¿°çxmlæ件ã
RealtiveLayoutä¸å å«äºä¸ä¸ªå¡«å æ´ä¸ªå±å¹çææ¬æ¡ï¼ä¹å°±æ¯æ们çLocateMe activityï¼ãè¿ä¸ªLocateMe activityå¨é»è®¤æ åµä¸æ¯å ¨å±çï¼å æ¤ï¼ææ¬æ¡å°ç»§æ¿è¿ä¸ªå±æ§ï¼å¹¶ä¸ææ¬æ¡å°å¨å±å¹çå·¦ä¸è§æ¾ç¤ºãå¦å¤ï¼å¿ 须为è¿ä¸ªXMLæ件设置ä¸ä¸ªå¼ç¨æ°ï¼ä»¥ä¾¿ Androidå¯ä»¥å¨æºä»£ç ä¸æ¾å°å®ãå¨é»è®¤æ åµä¸ï¼è¿äºå¼ç¨æ°è¢«ä¿åå¨R.javaä¸ï¼ä»£ç å¦ä¸ï¼
public final class R{public static final class layout{
public static final int main=0x7f;
}
}
è§å¾ä¹å¯ä»¥è¢«åµå¥ï¼ä½åJ2MEä¸åï¼æ们å¯ä»¥å°å®å¶çè§å¾åAndroidå¢éåå¸çWidgetsä¸èµ·ä½¿ç¨ãå¨J2MEä¸ï¼å¼å人å被迫éæ© GameCanvasåJ2MEåºç¨ç¨åºç»å¸ãè¿å°±æå³çå¦ææ们æ³è¦ä¸ä¸ªå®å¶çææï¼å°±å¿ é¡»å¨GameCanvasä¸éæ°è®¾è®¡æ们ææçwidgetã Androidè¿ä¸ä» ä» æ¯è¿äºï¼è§å¾ç±»åä¹å¯ä»¥æ··å使ç¨ãAndroidè¿å¸¦äºä¸ä¸ª widgetåºï¼è¿ä¸ªç±»åºå æ¬äºæ»å¨æ¡ï¼ææ¬å®ä½ï¼è¿åº¦æ¡ä»¥åå ¶ä»å¾å¤æ§ä»¶ãè¿äºæ åçwidgetå¯ä»¥è¢«éè½½æ被æçæ们çä¹ æ¯å®å¶ãç°å¨è®©æ们æ¥è¿å ¥ æ们çä¾åã
åãAndroidå®ä¾
è¿ä¸ªæ¼ç¤ºåºç¨ç¨åºå°æ¼ç¤ºäºç¨æ·çå½åçç»åº¦å纬度ï¼å¨ææ¬æ¡ä¸æ¾ç¤ºï¼ãonCreateæé æ¹æ³å°åä¸é¢çä¾ååºæ¬ç¸åï¼é¤äºå¨å ¶ä¸å å ¥äºé®çå¤çï¼ç°å¨ 让æ们çä¸ä¸onKeyDownç代ç ã
public boolean onKeyDown(int keyCode, KeyEvent event){if(keyCode != KeyEvent.KEYCODE_DPAD_CENTER || m_bLoading)
{
return true;
}
m_bLoading = true;
getLocation();
return true;
}
ä¸é¢è®©æ们æ¥è§£éä¸ä¸è¿æ®µä»£ç ï¼é¦å ï¼è¿æ®µä»£ç æ£æ¥äºå½å被æä¸çé®ï¼ä½è¿æ²¡æå¼å§å¤çãèæ¯å¨getLocationæ¹æ³ä¸å¤çè¿ä¸åçãç¶åï¼å°è£ è½½ flagæ å¿ä»¥åè°ç¨getLocationæ¹æ³ï¼ä¸é¢æ¯getLocationæ¹æ³ç代ç ã
private void getLocation(){Location loc;
LocationManager locMan;
LocationProvider locPro;
List<LocationProvider> proList;
setContentView(R.layout.laoding);
locMan = (LocationManager) getSystemService(LOCATION_SERVICE);
proList = locMan.getProviders();
locPro = proList.get(0);
loc = locMan.getCurrentLocation(locPro.getName());
Lat = (float)loc.getLatitude();
Lon = (float)loc.getLongitude();
CreateView();
setContentView(customView);
}
å°è¿ä¸ºæ¢ï¼ç¨åºå¼å§åå¾æ´æ趣äºãä½æ¯ä¸å¹¸çæ¯ï¼Googleå ³äºä¹æ¹é¢çææ¡£è¿æ¯æ¯è¾å°äºãå¨ç¨åºçåé声æä¹åï¼æ们éè¦æ¼ç¤ºä¸äºè£ 载信æ¯ã R.layout.loading符åäºå¦ä¸ä¸ªç®åçXMLå¸å±è§å¾ãéè¿ç®åå°è°ç¨setContentViewæ¹æ³å¯ä»¥ä½¿ç¨è½¬è½½ä¿¡æ¯éç»å±å¹ã
读è è¦æ³¨æçæ¯ï¼å¨ç¼è¯æ¶ï¼Androidä¼é¢å å°ææçXMLå¸å±æ°æ®å è£ èµ·æ¥ãå¦ææ们æ³å¨ç¼è¯åååå¸å±å±æ§ï¼æçè§å®ï¼æä»¬å¿ é¡»å¨æºç¨åºä¸åè¿äº äºã
è·å¾LocationManagerçå¯ä¸æ¹æ³æ¯éè¿getSystemService()æ¹æ³çè°ç¨ãéè¿ä½¿ç¨LocationManagerï¼ æ们å¯ä»¥è·å¾ä¸ä¸ªä½ç½®æä¾è çå表ãå¨ä¸ä¸ªçå®çææ设å¤ä¸ï¼è¿ä¸ªå表å å«äºä¸äºGPSæå¡ãå®é ä¸ï¼æ们å¸æéæ©æ´å¼ºå¤§ï¼æ´ç²¾ç¡®ï¼æåä¸å¸¦æå ¶ä»éå æ å¡çGPSãç°å¨ï¼å¨æ¨¡æå¨ä¸æä¾äºä¸ä¸ªç¨äºæµè¯çGPSï¼è¿ä¸ªGPSæ¥èªSan Franciscoãå®å¶çGPSæ件å¯ä»¥å¯ä»¥è¢«ä¸ä¼ ï¼å¹¶è¿è¡æµè¯ãå¦ææ们è¦æµè¯æ´å¤æçåºç¨ï¼æ¥èªSan FranciscoçGPSå¯è½å¹¶ä¸éåã
ç®åæ们å¯ä»¥ä½¿ç¨ä½ç½®ç®¡çå¨åä½ç½®æä¾è è¿è¡getCurrentLocationçè°ç¨ãè¿ä¸ªæ¹æ³è¿åæ¬æºçå½åä½ç½®çä¸ä¸ªå¿«ç §ï¼è¿ä¸ªå¿«ç §å°ä»¥ Location对象形å¼æä¾ãå¨ææ设å¤ä¸ï¼æ们å¯ä»¥è·å¾å½åä½ç½®çç»åº¦å纬度ãç°å¨ï¼ä½¿ç¨è¿ä¸ªèæçææ设å¤ï¼æ们å¯ä»¥è·å¾è¿ä¸ªä¾åç¨åºçæç»ç»æï¼ å»ºç«äºæ¾ç¤ºä¸ä¸ªå®å¶çè§å¾ã
äºã使ç¨å®å¶è§å¾
å¨æç®åççªä½ä¸ï¼ä¸ä¸ªAndroidä¸çè§å¾ä» ä» éè¦éè½½ä¸ä¸ªonDrawæ¹æ³ãå®å¶è§å¾å¯ä»¥æ¯å¤æç3Då®ç°ææ¯é常ç®åçææ¬å½¢å¼ãä¸é¢ç CreateViewæ¹æ³ååºäºä¸é¢çå°çå 容ã
public void CreateView(){customView = new CustomView(this);
}
è¿ä¸ªæ¹æ³ç®åå°è°ç¨äºCustomView对象çæé æ¹æ³ãCustomViewç±»çå®ä¹å¦ä¸ï¼
public class CustomView extends View{LocateMe overlord;
public CustomView(LocateMe pCtx){
super(pCtx);
overlord = pCtx;
}
public void onDraw(Canvas cvs){
Paint p = new Paint();
String sLat = "Latitude: " + overlord.getLat();
String sLon = "Longitude: " + overlord.getLon();
cvs.drawText(sLat , , , p);
cvs.drawText(sLon, , , p);
}
}
è¿ä¸ªå®å¶çAndroidè§å¾è·å¾äºç»åº¦åè¿åº¦çæµè¯æ°æ®ï¼å¹¶å°è¿äºæ°æ®æ¾ç¤ºå¨å±å¹ä¸ãè¿è¦æ±ä¸ä¸ªæåLocateMeçæéï¼Activityç±»æ¯æ´ 个åºç¨ç¨åºçæ ¸å¿ãå®ç两个æ¹æ³æ¯æé æ¹æ³åonDrawæ¹æ³ãè¿ä¸ªæé æ¹æ³è°ç¨äºè¶ ç±»çæé æ¹æ³ä»¥åå¼èµ·äºActivityæéçä¸æãonDrawæ¹ æ³å°å»ºç«ä¸ä¸ªæ°çPaint对象ï¼è¿ä¸ªå¯¹è±¡å°è£ äºé¢è²ãéæ度以åå ¶ä»ç主é¢ä¿¡æ¯ï¼ï¼è¿ä¸ªå¯¹è±¡å°ä¼è®¿é®é¢è²ä¸»é¢ãå¨æ¬ç¨åºä¸ï¼å®è£ äºç¨äºæ¾ç¤ºçå符串ï¼å¹¶ 使ç¨ç»å¸æéå°å®ä»¬ç»å°å±å¹ä¸ãè¿ä¸ªåæ们äºè§£çJ2ME游æçç»å¸çèµ·æ¥é常类似ã
å ãAndroidå±æ
ä»çº¯ç²¹çå¼åè§ç¹çï¼Androidæ¯ä¸ä¸ªé常强大çSDKãå®ä½¿ç¨åºäºXMLçå¸å±åå®å¶è§å¾èåäºèµ·æ¥ã并å¯ä»¥ä½¿ç¨æ»å¨æ¡ãå°å¾ä»¥åå ¶ä»çç»ä»¶ãæ以 çè¿ä¸åé½å¯ä»¥è¢«éè½½ï¼æç±å¼å人åæ¥å®å¶ãä½å®ææä¾çææ¡£é常ç²ç³ãå¨ææ¡£ä¸å¹¶æ²¡æ象SMSçææ¯ï¼ä½æ¯ä»æ´ä½ä¸æ¥çAndroid SDKï¼è¿æ¯é常æå¸æçãä¹é常符åGoogleæ¿è¯ºçâFirst LookâSDKãç°å¨æ们è¦åçå°±æ¯çå¾ Googleåå¸ç¬¬ä¸ä¸ªåºäºAndroidçææºï¼å¹¶ä½¿ç¨å®ã
å¦è¥æ»¡æï¼è¯·ç¹å»å³ä¾§ãé纳çæ¡ãï¼å¦è¥è¿æé®é¢ï¼è¯·ç¹å»ã追é®ã
å¸ææçåç对æ¨ææ帮å©ï¼æé纳ï¼
~ O(â©_â©)O~
如何更改安卓手机GPS位置? - 知乎
修改安卓手机GPS位置的方法多种多样,包括Xposed隐藏、使用MockLocation、或者直接修改源码。每种方式各有优势与劣势。Xposed隐藏虽然简便但容易被察觉,MockLocation易于识别,而修改源码则费时且局限性较强。为了深入探索GPS定位机制,我们选择阅读并修改Android系统源码。
修改GPS的关键在于切断硬件模块与系统框架之间的通讯,通过模仿硬件向框架发送位置信息。这一过程主要通过GnssCallback实现。GnssCallback在GPS信息变化后通知上层应用,例如位置、状态或精度变化。在系统框架中,GPS硬件模块在获取新位置时会调用java函数reportLocation。
为了彻底切断HAL层与框架的通讯,我们需修改GnssLocationProvider.cpp文件。在框架层面,我们添加了一个公共函数至LocationManager.java,以进一步控制GPS行为。之后,完成ROM的编译,并在APK中利用这些自定义功能。
市面上存在许多修改GPS位置的软件,但它们通常不完全满足特定需求。对于有定制需求的用户,深入理解原理并自主修改源码是更理想的选择。作为拥有十年逆向技术经验的专家,如果你对技术有疑问或需求,欢迎随时咨询交流。
此外,为了增加代码的实用性,我们提供了一个模拟胰岛素泵的类InsulinPump。该类模拟了胰岛素泵的运行机制,包括电量、血糖值、注射胰岛素量等参数的管理。通过类的方法run、getInsulinQuantity、setInsulinQuantity、getBattery、setBattery、getBloodSugar、setBloodSugar和adjust,可以实现胰岛素量的调整与管理,为特殊需求提供解决方案。
2024-12-24 01:26
2024-12-24 00:34
2024-12-24 00:16
2024-12-23 23:32
2024-12-23 22:46