本文作者:HAI_

0×00 前言

不知所以然,请看

Android逆向-Android基础逆向(1)

Android逆向-Android基础逆向(2)

Android逆向-Android基础逆向(2-2)

Android逆向-Android基础逆向(2-3补充篇)

Android逆向-Android基础逆向(3)

Android逆向-Android基础逆向(4)

Android逆向-Android基础逆向(4-2)

Android逆向-Android基础逆向(5)

以及java系列:

Android逆向-java代码基础(1)

Android逆向-java代码基础(2)

Android逆向-java代码基础(3)

Android逆向-java代码基础(4)

Android逆向-java代码基础(5)

Android逆向-java代码基础(6)

Android逆向-java代码基础(7)

Android逆向-java代码基础(8)

内容or问题

1.如何写一个登录界面? √
2.逆向分析登录逻辑 √
3.如何暴力绕过一个登录界面? √
4.如何巧妙登录 √
5..如何加广告√
6.如何去广告
7.实例分析

时间

2018年2月4日13:10:42

目的

1.复习登录界面的书写
2.暴力练习
3.获取练习
4.smali代码熟练
5.给自己的app加广告
6.二次打包加广告实战
7.如何去广告

0×01 Android 编程—登录界面

说明

这个是学编程的时候必须要学的,这次我们就不接数据库来操作。也没有注册界面,直接就是一个简单的登录界面。
demo还是按照之前的改。恩,反正我会,我就要偷懒。

1.更改布局

首先一个用户名的框框。

然后一个登录密码的框框。

然后还是一个登录按钮

预览一下我们的界面

好丑,做一个简单的调整,整体代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.hanlei.first_demo.MainActivity">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/name"
        android:hint="请输入用户名"
    />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/password"
        android:hint="请输入密码"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bt"
        android:text="Login"/>
</LinearLayout>

2.绑定控件

恩,为了像一个登录界面,我把name也改了。

所以重新绑定。

3.逻辑书写

  login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (name.getText().toString().equals("zhuzhu")&&Integer.parseInt(ps.getText().toString())==520)
                {
                    startActivity(new Intent(MainActivity.this,Main2Activity.class));
                }
            }
        });

这里涉及到一个知识点。
java String 类型如何转换为int类型。
简单的来说:

Integer.parseInt();

就可以转换了
这里突然想到万一不输入数字怎么办。恩,去改下规范。

 <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/password"
        android:inputType="number"
        android:hint="请输入密码"
        />

这里加了一行只允许输入数字。

测试

0×02 反编译分析

分析嘛,很多次了。老规矩

1. Android Killer

2.找到主要函数

我们找到逻辑判断的地方$1

.class Lcom/example/hanlei/first_demo/MainActivity$1;
.super Ljava/lang/Object;
.source "MainActivity.java" # interfaces
.implements Landroid/view/View$OnClickListener; # annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
    value = Lcom/example/hanlei/first_demo/MainActivity;->onCreate(Landroid/os/Bundle V .end annotation .annotation system Ldalvik/annotation/InnerClass;
    accessFlags = 0x0
    name = null
.end annotation # instance fields
.field final synthetic this$0:Lcom/example/hanlei/first_demo/MainActivity; # direct methods
.method constructor <init>(Lcom/example/hanlei/first_demo/MainActivity V     .locals 0
    .param p1, "this$0"    # Lcom/example/hanlei/first_demo/MainActivity;     .prologue
    .line 24
    iput-object p1, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     invoke-direct {p0}, Ljava/lang/Object;-><init>()V     return-void
.end method # virtual methods
.method public onClick(Landroid/view/View V     .locals 4
    .param p1, "v"    # Landroid/view/View;     .prologue
    .line 27
    iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     # getter for: Lcom/example/hanlei/first_demo/MainActivity;->name:Landroid/widget/EditText;
    invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity Landroid/widget/EditText
;     move-result-object v0     invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;     move-result-object v0     invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;     move-result-object v0     const-string v1, "zhuzhu"     invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object Z     move-result v0     if-eqz v0, :cond_0     iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     # getter for: Lcom/example/hanlei/first_demo/MainActivity;->ps:Landroid/widget/EditText;
    invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity Landroid/widget/EditText
;     move-result-object v0     invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;     move-result-object v0     invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;     move-result-object v0     invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String I     move-result v0     const/16 v1, 0x208     if-ne v0, v1, :cond_0     .line 29
    iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     new-instance v1, Landroid/content/Intent;     iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     const-class v3, Lcom/example/hanlei/first_demo/Main2Activity;     invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class V     invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent V     .line 31
    :cond_0
    return-void
.end method

3.重点逻辑部分

重点逻辑就是如何判断登录的部分

if-eqz v0, :cond_0

    iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;

    # getter for: Lcom/example/hanlei/first_demo/MainActivity;->ps:Landroid/widget/EditText;
    invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity Landroid/widget/EditText
;     move-result-object v0     invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;     move-result-object v0     invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;     move-result-object v0     invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String I     move-result v0     const/16 v1, 0x208     if-ne v0, v1, :cond_0     .line 29
    iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     new-instance v1, Landroid/content/Intent;     iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     const-class v3, Lcom/example/hanlei/first_demo/Main2Activity;     invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class V     invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent V

我们看到了两个if语言
整个逻辑就是先进行一个判断,然后进行另外一个判断。就是满足第一个if语句,然后满足第二个if语句才到结束。
这些smali代码就是我们之前分析过很多次的语句,没有什么难的地方,都很简单的。

0×03 暴力美学

我们来尝试破解。

方法 1

思路

既然有if语句进行判断,那我把if语句删了。编程现在这个样子:

invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity  Landroid/widget/EditText
;     move-result-object v0     invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;     move-result-object v0     invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;     move-result-object v0     const-string v1, "zhuzhu"     invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object Z     move-result v0     这里删除if语句     iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     # getter for: Lcom/example/hanlei/first_demo/MainActivity;->ps:Landroid/widget/EditText;
    invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity Landroid/widget/EditText
;     move-result-object v0     invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;     move-result-object v0     invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;     move-result-object v0     invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String I     move-result v0     const/16 v1, 0x208     这里删除if语句     .line 29
    iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     new-instance v1, Landroid/content/Intent;     iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     const-class v3, Lcom/example/hanlei/first_demo/Main2Activity;     invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class V     invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent V     .line 31
    :cond_0
    return-void

然后保存进行反编译。

安装测试

方法 2

思路

不删除if语句,但是我更改if语句的逻辑。比如本来是相等才可以,我改成不相等就继续运行。

具体操作

第一个判断语句是:

  if-eqz v0, :cond_0

if-eqz的含义就是 如果是0,就跳转到 cond_0

现在我们修改成:

if-nez v0,:cond_0

if-nez的含义是,如果不是0,就跳转到cond_0

第二个判断语句是:

if-ne v0, v1, :cond_0

if-ne的含义就是如果v0!=v1就跳转。
现在我们改成:

if-eq v0, v1, :cond_0

if-eq的含义就是如果相等再进行跳转。

测试

测试成功,不想录图片了。

方法3

思路

既然最后一定要走的是第二个判断里的内容,那么我们使用goto语句直接进去不就好了。

首先设置一个 cond_1
然后goto :cond_1

.method public onClick(Landroid/view/View  V

    .locals 4
    .param p1, "v"    # Landroid/view/View;     .prologue
    .line 27     goto :cond_1
    iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     # getter for: Lcom/example/hanlei/first_demo/MainActivity;->name:Landroid/widget/EditText;
    invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity Landroid/widget/EditText
;     move-result-object v0     invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;     move-result-object v0     invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;     move-result-object v0     const-string v1, "zhuzhu"     invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object Z     move-result v0     if-eqz v0, :cond_0     iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     # getter for: Lcom/example/hanlei/first_demo/MainActivity;->ps:Landroid/widget/EditText;
    invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity Landroid/widget/EditText
;     move-result-object v0     invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;     move-result-object v0     invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;     move-result-object v0     invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String I     move-result v0     const/16 v1, 0x208     if-ne v0, v1, :cond_0     :cond_1
    .line 29
    iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     new-instance v1, Landroid/content/Intent;     iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;     const-class v3, Lcom/example/hanlei/first_demo/Main2Activity;     invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class V     invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent V     .line 31
    :cond_0
    return-void
.end method

测试结果

测试成功。

结束语

可能还有很多种绕过的方法,这里就不一一展示了。

0×04 优雅的登录

思路

既然是登录,那么必然就要有一个对比的存在,我只要知道是用什么去对比的,我把需要对比的东西进行输出,方便我们查看是不是更好呢。

代码分析

  const-string v1, "zhuzhu"

    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v0

    if-eqz v0, :cond_0

这里很明显,用v0和v1进行比较,如果是就返回1,如果不是就返回0

     const/16 v1, 0x208

    if-ne v0, v1, :cond_0

定义一个v1寄存器,然后用v0和v1比较看是否一致如果一致就继续向下运行。

0×208就是16进制形式,进行转换,就知道了我们密码是多少了,之后在登录输出即可。当然这个是可有看到的密码,如果接入了数据库就会变成不可见的密码,到时候就可以进行动态调试来对密码进行一个输出了。

0×05 如何植入广告

什么是广告?

大神说过一句话叫做,和游戏无关的都是广告,我们普遍说的广告就是,一些恩,很烦人的东西。

植入广告的目的是什么?

植入广告的目的主要是
(1) 做推广
(2)能赚到钱

植入广告原理分析

用一个载体去承载广告,然后显示出来。使用的技术用静态布局,或者使用动态加载等方式。还是来看一下如果植入广告的具体操作吧。

市面上的广告

有米广告

有米广告,反正我被坑了整整两天,什么都没搞成功,还被折腾的够呛,不过虽然没有搞出什么成果来,但是对有米广告倒是有了一个很深的认识,这个坑人的东西,好气。
最后我只是搞成功了一个这个东西。

爬坑

先来说说,我遇到的坑。希望有人研究的时候可以节约时间。

Error:Execution failed for task ':processDebugManifest'.
> [:YoumiSdk_v7.5.1_2018-01-16:] C:\Users\hanlei\Desktop\ls\YoumiAndroidSdk\demo\normaldemo\build\intermediates\exploded-aar\YoumiSdk_v7.5.1_2018-01-16\AndroidManifest.xml:23:3-29:15: Error: Invalid instruction 'targetApi', valid instructions are : REMOVE,REPLACE,STRICT

看到这个鬼东西了木有,网上搜索都说需要换一个sdk,但是官网只提供最新的sdk,或许是我没找到。
果断换sdk。
而且官方给的demo导入到Android Studio 里用不了,也是这个问题。
解决方案:
Androidmanifest.xml里加这一句,可能有用。

 <uses-sdk tools:overrideLibrary="YoumiSdk_v7.4.0_2017-05-18" />

重新搞

1.新建一个demo

2.加入arr包

3.添加依赖关系

4. 申请ID

5.初始化信息

毫不留情就出问题了。

Error:Execution failed for task ':app:processDebugManifest'.
> [:YoumiSdk_v7.5.1_2018-01-16:] C:\Users\hanlei\Desktop\ls\YoumiAndroidSdk\demo\demo3\app\build\intermediates\exploded-aar\YoumiSdk_v7.5.1_2018-01-16\AndroidManifest.xml:23:3-29:15: Error: Invalid instruction 'targetApi', valid instructions are : REMOVE,REPLACE,STRICT

换个arr版本接着搞。

记得改配置文件

果然换了一个arr包马上就对了,太不友好了。

我们接着初始化。

6.设置渠道号

7.权限配置。

广告嘛,配置权限权限扫描的才可以运行。

    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />  

ps

应该同步做一件事情。
应该在我的小本本上同步做一个记录。

添加v4包

compile 'com.android.support:support-v4:xx.x.x'

这里的v4:xx.x.x一定要和上面的一致,直接看图:

写完一个调用

试一下其他广告类型

一样的返回code 1。好烦哦。提交审核了。
2018年2月6日12:38:11

多盟广告

自己搞吧,我心累

腾讯

谷歌

….

结束语

至少写了4个demo,现在接入sdk,对于我来说真的是太熟悉了。塞翁失马焉知祸福。怎样用也很熟练了。
如果要做到去广告的话,先对Activity进行观察,然后直接看官方文档,然后反着来就行,

0×06 如何二次植入广告

基本一搜索都是一种方法:(可能是有什么黑科技没有公布于世吧)、
http://blog.csdn.net/u011106915/article/details/52184362
还有一个是二次打包有米的。
https://www.cnblogs.com/cooka/p/3593607.html

0×07 结束语

鉴于篇幅,转战Android逆向-Android基础逆向(6-2)

收获:

1.复习登录界面的书写
2.简单的绕过总结
3.简单的分析smali代码
4.爬了两天的广告接入坑,对Android 接入sdk有了很深层次的认识

遗留问题

1.如何去除广告
2.还有之前增加demo按钮逻辑

>>>>>>    带你入坑和逗比表哥们一起聊聊黑客的事儿,他们说高精尖的技术比农药都好玩~

Android逆向系列文章— Android基础逆向(6)的更多相关文章

  1. [原]零基础学习视频解码之android篇系列文章

    截止今天,<零基础学习视频解码系列文章>.<零基础学习在Android进行SDL开发系列文章>以及<零基础学习视频解码之android篇>系列文章基本算是告一段落了 ...

  2. Android学习系列(38)--Android源码下载和编译

    前面多篇文章介绍到如何下载和编译Android或者CM源码,不过一直都是放在<拓展系列>里.随着学习的深入,android源码是非常有参考和学习价值,强烈推荐大家都去下载,编译,学习,所以 ...

  3. Android学习系列(40)--Android主题和样式之系统篇(下)

    11)Widget样式(Widget Style) 特别说明,此处定义大量的系统内置控件的样式,对于重写原生控件的样式具有很大的参考价值. <!-- Widget styles --> & ...

  4. Android学习系列(42)--Android Studio实战技巧

    使用android studio开发项目的一些问题,功能和技巧. 1. 环境 Mac OSX 10.9.5 + Android Studio 0.8.9 2. gradle项目加载超慢 这是因为gra ...

  5. Android学习系列(39)--Android主题和样式之系统篇(上)

    [基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计 ...

  6. Android调试系列—使用android studio调试smali代码

    1.工具介绍 使用工具 android killer:用于反编译apk包,得到smali代码 android studio:调试smali代码工具,或者使用idea,android studio就是在 ...

  7. 【转】Android学习系列(39)--Android主题和样式之系统篇(上)

    [基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计 ...

  8. [Android Studio系列(五)] Android Studio手动配置Gradle的方法

    1 问题 (1) android sutdio第一次打开一个工程巨慢怎么办? (2) 手动配置Gradle Home为什么总是无效? (3) 明明已经下载了Gradle,配置了gradle home, ...

  9. Android学习系列(41)--Android Studio简单使用

    1. 环境 UBUNTU 14.04 + Android Studio 0.8.2 2. 安装jdk openjdk-7是一个很好的选择: sudo apt-get update sudo apt-g ...

随机推荐

  1. linux信号处理总结

    本文主要讲解常见信号的处理方式. Sighup:终端关闭时,发送给此会话的所有进程组.Setsid成功后不再属于该会话,收不到该消息. Sigterm:  kill process_id时产生. Si ...

  2. Vue.js 生命周期的应用

    生命周期示意图 值得注意的几个钩子函数 activated 类型:Function 详细: keep-alive 组件激活时调用. 该钩子在服务器端渲染期间不被调用. 参考: 构建组件 - keep- ...

  3. 匹配数字、字母和?%&=-_这几个符号的正则表达式

    /^[\w\?%&=\-_]+$/ 说明:(1) \w 代表 0-9a-zA-Z 即数字.字母 (2) \?%&=\-_ 匹配?%&=-_,而正则中?代表0个或1个,因为是特殊 ...

  4. 3、基本的Get和Post访问(含代理请求)

    Get方式访问 HttpClient hc = new DefaultHttpClient(); HttpUriRequest request = new HttpGet("http://w ...

  5. easyjweb ejs 2014.2.25

    一 .简单 easyjweb 项目 1. 创建一个web 项目 , 将easyjweb-corejar 包 和required 包下的所有jar 包拷到项目下. 2.写一个 action  .. pa ...

  6. java bulid path 和 WEB-INF/lib 下jar 包区别

    用Java Build Path导入包和把包复制到lib下是有区别的,它俩其实不会冲突,也没有什么关系的, Java Build Path是我们编译需要的包, 导入到lib下是程序运行时需要的包 ,  ...

  7. C语言基础第二次作业

    PTA第一次作业 题目7-1  统计学生成绩 1.实验代码 #include<stdio.h> int main(void){ ,B=,C=,D=,E=,f; scanf("%d ...

  8. csdn的一次回答问题

    #coding:utf8 import tushare as ts import pandas as pd import numpy as np import pymysql,datetime imp ...

  9. hive 学习之异常篇

    一.刚装上hive在执行hive启动的过程中出现 [hadoop@localhost hive-0.6.0]$ hive Invalid maximum heap size: -Xmx4096m Th ...

  10. momery

    reg [7:0] moma [255:0] ;//定义一个位宽为8,浓度为什么256的memory. parameter wordsize = 8; parameter memsize = 256; ...