智能手机入门级移动跟踪器应用程序






4.20/5 (4投票s)
注册一个参考手机号码,并在 SIM 卡更改时收到参考消息。
引言
本文只是为了保护我的智能手机而进行的一次小小的努力 :)。移动追踪器应用程序的设计不仅是为了跟踪您的设备,而且是为了让最终开发者了解 TAPI、电话/短信 API、注册表读写、P/Invoke、IMSI 和 IMEI 等...
关注点
- 注册表
第一个选项是使用注册表在设备启动过程中启动进程。用于启动应用程序的注册表项是 HKEY_LOCAL_MACHINE\Init,但主要缺点是启动过程中的依赖链。进程启动后需要向操作系统发出信号,表明进程已启动(使用
SignalStarted
API),以便其他依赖进程也能启动。在这里,我将它作为最后一个进程启动。例如,您有两个需要在启动时启动的应用程序,并且第二个应用程序依赖于第一个应用程序(所有应用程序都依赖于 Windows Shell)。
Shell Launch50 : explorer.exe Depend50: 32 00 Application 1 Launch90 : appli1.exe Depend90: 32 00 (Shell dependency) Application 2 Launch100 : appli2.exe Depend100: 32 00 5A 00 (Shell dependency and application 1 dependency)
在应用程序 1 中,当您需要时,第二个应用程序将自动启动。您只需在
WinMain
入口点的命令行中调用SignalStarted
并指定其序列标识符字符串(转换为DWORD
)。然后,将启动应用程序 2。如果另一个应用程序依赖于此,您将再次调用SignalStared
。如果在应用程序 1 中没有调用SignalStarted
,则依赖于其启动的应用程序 2 将永远不会运行。LaunchXX 数字用于指定启动顺序,但您需要使用 Depend 值来指定系统必须在 LaunchXX 应用程序运行之前运行的应用程序。例如:Depend90= 32 00 3C 00 表示它依赖于 Launch50(十六进制为 32)和 Launch60(十六进制为 3C)。
- 持久注册表
基于 RAM 的注册表将其数据存储在对象存储中,而对象存储位于随机访问内存 (RAM) 中。只要 RAM 保持供电(即使设备关闭),数据就会持久存在,但如果 RAM 没有供电,数据就会丢失。一直为注册表供电并不总是可取的。因此,基于 RAM 的注册表包含一些通过写入其他存储介质来持久化数据的机制。当调用
RegFlushKey
API 时,操作系统会一系列调用WriteRegistryToOEM
将整个注册表传递给 OEM,OEM 将数据存储在持久介质上。然后,系统启动时,操作系统会进行另一系列调用ReadRegistryFromOEM
来从 OEM 存储数据的任何位置接收数据。为了解决这些机制的性能问题和实现困难,Windows CE .NET 4.0 版本包含了一种新型注册表,称为基于 Hive 的注册表。基于 Hive 的注册表将其所有数据维护在可以存储在任何文件系统和任何介质上的文件中。因此,您无需执行额外的工作即可在基于 Hive 的注册表中持久化数据。由于 Windows CE .NET 提供基于 RAM 的注册表作为可选组件,因此本文所述的持久化机制仍然支持基于 RAM 的注册表。然而,基于 Hive 的注册表提供了一种更高效且无需 OEM 进行任何代码开发的持久化机制。
- 为了检索 IMSI 和 IMEI,我们必须处理电信 API 和 P/Invoke。
附带的示例代码,请查看以获取更多详细信息。
- 要通过注册表启动应用程序需要 Windows 文件夹的路径,因此我为 Mobiletracker.exe 创建了一个快捷方式文件(Mobiletracker.lnk),在安装过程中我将其复制到 Windows 文件夹。
使用代码
如果您查看注册表项 HKEY_LOCAL_MACHINE\Init,您将看到 depend 和 launch 的各种值,以及一个 BootVars 键。在这里,我创建了一个名为 Userinfo 的新键,并在该键下创建了子键 "Ownerinfo" 来存储参考手机号码。IMEI、IMSI 号码以编码格式存储以供将来参考。IMSI 号码是您将运行应用程序的 SIM 卡的号码。我们将值存储为多字符串格式,该格式是由两个空字符分隔的空终止字符串数组。以下是代码片段
string DeviceInfo = struct_ui.Mobile_IMEI + "\0\0" + struct_ui.Mobile_IMSI +
"\0\0" + struct_ui.RefMobileno1 + "\0\0" + struct_ui.RefMobileno2 + "\0\0";
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
Byte[] val = encoding.GetBytes(DeviceInfo);
UIntPtr handletonewkey = UIntPtr.Zero;
int retkeyval = RegCreateKeyEx((UIntPtr)RegRoot.HKEY_LOCAL_MACHINE,
"init\\UserInfo", 0, String.Empty, 0, 0, 0,
ref handle, ref handletonewkey);
if (retkeyval != 0)
{
MessageBox.Show("Cant Create UserInfo Key");
}
int ret1 = RegOpenKeyEx((UIntPtr)RegRoot.HKEY_LOCAL_MACHINE, "init\\UserInfo",
0, KeyAccess.SetValue, ref handle);
int ret2 = RegSetValueEx(handle, "OwnerInfo", 0,
(uint)RegistryValueKind.MultiString, val, (uint)val.Length);
现在,在下面的代码片段中,我们在注册表中注册应用程序,以便在重新启动时,它能够启动并运行类似的 EXE。在 launch 值中,您必须提供 EXE 的路径。这里,我提供了链接文件的路径,该文件内部启动了相同的程序。
int ret3 = RegOpenKeyEx((UIntPtr)RegRoot.HKEY_LOCAL_MACHINE,
"init", 0, KeyAccess.SetValue, ref handle);
byte[] userval = new byte[2];
userval[0] = 50;
userval[1] = 0;
int ret4 = RegSetValueEx(handle, "Depend101", 0,
(uint)RegistryValueKind.Binary, userval,
(uint)userval.Length);
IntPtr iptr = Marshal.StringToBSTR("MobileTracker.lnk");
string unicodestring = Marshal.PtrToStringUni(iptr);
Encoding en = Encoding.Unicode;
byte[] barray = en.GetBytes(unicodestring);
int ret5 = RegSetValueEx(handle, "Launch101", 0,
(uint)RegistryValueKind.String, barray, (uint)barray.Length);
在这里,您需要调用 RegFlushKey
来永久存储注册表。
int ret6 = RegFlushKey(handle);
改进
我相信还有很多改进空间,但这里列出了一些主要的改进点
- 用户应能在注册后启动相同的应用程序。
- 禁用应用程序的功能。