(1)继承Thread类,重写run函数
创建:
class xx extends Thread{
public void run(){
Thread.sleep(1000) //线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源
}}
开启线程:
对象.start() //启动线程,run函数运行
(2)实现Runnable接口,重写run函数
开启线程:
Thread t = new Thread(对象) //创建线程对象
t.start()
(3)实现Callable接口,重写call函数
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
Callable和Runnable有几点不同:
①Callable规定的方法是call(),而Runnable规定的方法是run().
②Callable的任务执行后可返回值,而Runnable的任务是不能返回值的
③call()方法可抛出异常,而run()方法是不能抛出异常的。
④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等
待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果
这次要破解的软件是这个: http://www.xazhouyi.com/android/soft/bazi.html
首先分析其行为,打开软件:
按照以往的经验,程序有个字段用于维护注册状态,我们可以通过字符串快速定位到它。我们将其载入 AK:
搜索“软件未注册”,在 string.xml 中找到:
然后在 public.xml 中找到,字符串的 ID 是 0x7f060003 。之后搜索这个数字。
我们在 main ,也就是入口的 MyInit 函数中找到了这个数值:
我们猜想 :cond_b 是失败分支,我们往上找:
我们可以得出 ChkNumA/B/C 是三个关键判断。下面的 if-eqz 是关键跳。成功各分支将 m_regFlag 设为 1,说明它是保存注册状态的字段。
我们可以将这三个 if-eqz 都给注释掉,但是我们可以采取另一种方式,在最后一个 if 的下面添加 :goto_100 标签,然后在第一个 if 上面添加 goto :goto_100 。
重新打包、安装软件后,打开软件,我们发现不再d出注册提示了。访问菜单->更多->注册之后,在注册界面中我们可以看到“已注册”。
按使能开关。若用户需要逆向运行程序则处理直接按使能开关即可。逆向exe文件说白了就是把exe文件通过记录格式,然后呢解析出其中的这些资源,包括每一个所出的地址,这样就可以通过汇编语言来读懂可执行文件了。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)