一、HelloWorld
打开Android Studio,创建项目:
新建成功后:
在新创建的MainActivaty.java文件中,内容如下:
package com.example.helloworld;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
可以看到这里创建了Activaty,是可以被AndroidManifest.xml用来注册的。而在java问家中,又指定了内容显示到res下layout文件夹中的activity_main.xml中,即一个框架文件中。
运行一下:
这里,我们创建一个框架文件,实践一下:
然后新创建一个类,来对应它:
package com.example.helloworld;
import android.app.Activity;
import android.os.Bundle;
public class helloworld extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.helloword);
}
}
并在AndroidManifest.xml中进行注册:
<activity android:name=".helloworld"/>
在主函数中,添加按钮来调用新窗口:
package com.example.test;
import android.content.Intent;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
startActivity(new Intent(MainActivity.this,helloworld.class));
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
在新建的helloworld.xml中添加一个edittext和一个button,在java文件中写对应的函数:
package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public class helloworld extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.helloworld);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EditText editText = (EditText)findViewById(R.id.edittest);
editText.setText("I Love U , ZTZ");
}
});
}
}
运行后,在主界面,点击按钮,进入自己创建的界面,再点击生成的按钮:
此时,可以获得编译好的apk文件:
二、这个杀手不太冷,初步逆向
使用AndroidKiller来逆向apk文件:
查看新建的helloworld类:
如图,一个smali文件对应一个class文件,具体的文件结构,这里不做赘述。
那么 smali语法中与java的对应如何呢:
java | smali |
boolean | Z |
char | C |
byte | B |
short | S |
int | I |
float | G |
long | J |
double | D |
object | Ljava/lang/Object; |
int[] | [I |
object[][] | [[Ljava/lang/Object; |
.class public Lcom/example/test/helloworld;
.super Landroid/app/Activity;
.source "helloworld.java"
# direct methods
.method public constructor <init>()V
.locals 0
.line 11
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.line 14
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 15
const v0, 0x7f0b002e
invoke-virtual {p0, v0}, Lcom/example/test/helloworld;->setContentView(I)V
.line 16
const v0, 0x7f080049
invoke-virtual {p0, v0}, Lcom/example/test/helloworld;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/Button;
.line 17
.local v0, "button":Landroid/widget/Button;
new-instance v1, Lcom/example/test/helloworld$1;
invoke-direct {v1, p0}, Lcom/example/test/helloworld$1;-><init>(Lcom/example/test/helloworld;)V
invoke-virtual {v0, v1}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V
.line 24
return-void
.end method