安卓逆向系列教程 4.2 分析鎖機軟體
作者: 飛龍
這個教程中我們要分析一個鎖機軟體。像這種軟體都比較簡單,完全可以順着入口看下去,但我這裡還是用關鍵點來定位。
首先這個軟體的截圖是這樣,進入這個界面之後,除非退出模拟器,否則沒辦法回到桌面。
上面那個“時空先生”是個按鈕,直接按下會提示“密碼錯了”。我們以這個詞為關鍵詞來搜尋:
發現字元串資源的名稱是
_?m@0x7f040007
。我們到
public.xml
裡面查一下,發現它的序号是
0x7f040007
,轉成十進制是
2130968583
。
<public type="string" name="_?m@0x7f040007" id="0x7f040007" />
然後我們在反編譯的 Java 代碼裡面搜尋這個值:
paramAnonymous2View = (TextView)Floatw.access$L1000002(Floatw.this).findViewById(2131099651);
paramAnonymous2View.setText(Floatw.this.getResources().getString(2130968583));
第一句是加載某個文本框,第二句是擷取字元串并設定文本。
我們再往上看:
@Override
public void onClick(View paramAnonymous2View)
{
int i = Floatw.this.my_password;
if (this.val$etext.getText().toString().equals(String.valueOf(i)))
{
paramAnonymous2View = Floatw.this;
Floatw localFloatw = Floatw.this;
try
{
Class localClass = Class.forName("com.as.xiaoyu.Floatw");
paramAnonymous2View.stopService(new Intent(localFloatw, localClass));
return;
}
catch (ClassNotFoundException paramAnonymous2View)
{
throw new NoClassDefFoundError(paramAnonymous2View.getMessage());
}
}
// 剛才的代碼
// ...
}
如果
val$etext
的内容等于
i
的字元串值,那麼就會關閉服務并退出。我們往下看看便可知道,這個軟體啟動之後就建立了一個服務,服務中擷取了
WindowsManager
,然後加載了一個
LinearLayout
并添加它,來實作鎖屏的效果:
private void createFloatView()
{
this.wmParams = new WindowManager.LayoutParams();
Application localApplication = getApplication();
this.mWindowManager = ((WindowManager)localApplication.getSystemService(Context.WINDOW_SERVICE));
this.wmParams.type = 2010;
this.wmParams.format = 1;
this.wmParams.flags = 1280;
this.wmParams.width = -1;
this.wmParams.height = -1;
this.mFloatLayout = ((LinearLayout)LayoutInflater.from(getApplication()).inflate(2130903041, (ViewGroup)null));
this.mWindowManager.addView(this.mFloatLayout, this.wmParams);
this.mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0, 0), View.MeasureSpec.makeMeasureSpec(0, 0));
}
也就是說,如果使服務關閉,那就解除了鎖屏。
我們檢視
onClick
的第一行,發現
i
是
my_password
,然後再找找
my_password
:
int my_password = this.number * 2 + 1;
int number = (int)((Math.random() + 1) * 100000);
發現了這兩句,知道了它的值是
number
乘二再加一。但是
number
是什麼呢?我們再找找
number
Object localObject = (TextView)Floatw.access$L1000002(Floatw.this).findViewById(2131099650);
String str = Floatw.this.getResources().getString(2130968582);
((TextView)localObject).setText(str + String.valueOf(Floatw.this.number));
這些代碼加載了一個文本框和字元串,然後将字元串與
number
拼接再顯示出來。這個字元串,我們以相同方式尋找,是
此機ID:
,那麼
number
就應該是後面的數字。我這裡是
108316
,那麼密碼就應該是
216633
下面有一句代碼:
localObject = (EditText)Floatw.access$L1000002(Floatw.this).findViewById(2131099649);
2131099649
的十六進制為
0x7f060001
,經查找可知它是個輸入框:
<EditText android:textColor="#ff000000" android:id="@id/_?m@0x7f060001" android:background="#ffffffff" android:layout_width="200.0dip" android:layout_height="4.0dip" android:layout_marginEnd="200.0dip" />
這裡反編譯出了一些問題,沒見到
val$etext
的直接指派,不過它應該就是這個編輯框。接下來的任務就是找到它。其實也不難,我們可以看到這個編輯框的高度很小,但是還有寬度,我們在按鈕左下方的大緻位置上點一點,它就出來了。
我們把編輯框的内容全部删除,然後輸入
216633
,再次點選這個按鈕。
解鎖成功。現在我們可以按下傳回鍵來退出了。