我在玩骰子怎么玩有什么样子的道具可以让我要几点就几点的

怎样让微信里的骰子想扔几点就扔几点?
【注意】:本文所述方法不能确保是否还可用,相关文件也已删除!
一天,某个同事问我,如何让微信里的骰子一直扔出六点。他还找了看雪上的某篇帖子,说的是IOS版的微信,需要抄起IDA来分析导入符号表,下断点,杂七杂八一大堆,我肯定搞不定啊。
今天仔细研究了一下,有一个很简单的方法达到同样的目的:因为骰子的六个面在资源里就是六张图片,所以直接把这六张图片全换成六点的图片就可以了。
操作过程:
1. apktool decompile
修改assets\custom_emoji下的文件,六张图全用六点的图替换,然后mianfest.xml里的相应信息也要改掉
3. apktook compile
实验了一下,发给ios和andriod的都是六点。
=============================================================
当然,如果需要每次发都可以修改为自己需要的值,那就必须要直接修改函数,把随机生成的语句改掉。
下面是我操作的一些步骤:
1. apktool decompile
(-d参数有问题,只能直接生成smali文件了),看代码我选择了dex2jar和jd-gui。
2. 添加android.debuggable="true"到配置文件中
3. apktool compile sign(记得加-d参数, debug mode)
4. 把apk安装到虚拟机中,打开android
sdk中的monitor.bat就可以看到com.tencent.mm在列表里了,开始用自己的手机试了好多次,jdwp都没列出,没辙了换虚拟机,速度虽然慢,效果没得说。
5. 打开微信,发个骰子的图片,用DDMS刷新main线程的堆栈(多试几次,查看可疑的栈帧)
&当然如果有java文件,那用netbean下断点最好不过,没有的话,那就别指望这货了,直接看混淆的代码都比它快,我折腾了一个下午,没成,怄气。
6. 这里是我找到的堆栈:
注意看堆栈顶上,操作了数据库,插入了一条数据,下面的onitemclick就是图片按钮的回调函数。
7. 在jd-gui里一帧一帧分析函数,看看有没有可疑的函数,可以看到chatting.hi这个比较可疑:
注意看里面条件判断的这句:
if ((paramc.lu() == c.Me) && (paramc.getType() ==
c.Mq) && (paramc.getContent().length() & 0) &&
(c.aN(Integer.parseInt(paramc.getContent()))))
c.Me的定义为public static int Me = 17;
c.Mq的定义为public static
int Mq = 1;
这两个值在刚才说过的assert\custom_emoji\manifest.xml中有定义:
0x11那就是17了。
type就是指的这里的type 0x1
再继续看下面这个语句:
int i = bg.cM(-1 + localCursor.getCount());
bg.cM函数的定义在com.tencent.mm.platformtools中:
显然是求随机数的,给定一个正整数,返回0到这个正整数间的一个值。
这里这个函数不能改,因为是platformtools里的,属于内部函数库,改了就悲剧了。
=======================================
int i = bg.cM(-1 + localCursor.getCount());
这个语句显然对石头剪子布和骰子都通用,getCount就是得到可选的范围,i最后就是要出的值。
8. 函数的分析到这里告于段落,接下来是修改它:
在smali\com\tencent\mm\ui\chatting\hi.smali中找到:
选中的v1就是i值,只要在这条语句前修改v1值就可以了,比较方便的方法就是插入showdialog了,或者在这里插入一串标记,安装程序后可以直接用八门神器来搜索内存空间。
==================================
更新一下:
弹出对话框暂时选择了Alertdialog,这个类调用时不会阻塞调用,所以需要用到同步机制,
如果选择阻塞的popupwindow需要写layout,麻烦的要死。
看见有博主说可以用Looper做同步,但是微信的chatting线程里已经用了Looper,所以是没法用的,
单线程要达到和界面的同步自旋锁可能是唯一的选择了。
另外:Alertdialog需要用到chatting的context,但是这个在chatting.hi中已经有了,
本来的想法是在chatting的oncreate初始化一个静态变量指向实例,看来不用这么折腾了。
剩下的就是把代码写出来,再把编译出的smali放在另外的类里面调用,基本上很快了。
继续更新:
自旋锁会造成ANR,只能从另外的方面下手了,这次决定直接从对话输入框中得到值,因为view已经打开,所以不需要太复杂的操作:
chatting.hi-&cDI
保存了chatting的instance,而chatting-&azR保存了chatfooter的instance。
直接用静态方法chatfooter.c(azR)就可以得到输入框的instance,至此全部解决。
下面是patch,只要打了patch就可以编译新的文件出来,编译好的就不提供出来了:
===============================
*** hi_old.smali
Tue Jul 23 16:58:33 2013
--- hi.smali
Tue Jul 23 16:53:44 2013
***************
*** 27,33 ****
# virtual methods
.method public final f(Lcom/tencent/mm/modelemoji/c;)V
.parameter
--- 27,33 ----
# virtual methods
.method public final f(Lcom/tencent/mm/modelemoji/c;)V
.parameter
***************
*** 117,122 ****
--- 117,126 ----
move-result v1
invoke-virtual {p0, v1}, Lcom/tencent/mm/ui/chatting/-&getInt(I)I
move-result v4
.line 2172
add-int/lit8 v1, v1, -0x1
***************
*** 124,129 ****
--- 128,139 ----
move-result v1
if-eqz v4, :cond_12
add-int/lit8 v1, v4, -0x1
.line 2173
new-instance p1, Lcom/tencent/mm/modelemoji/c;
***************
*** 224,226 ****
--- 234,302 ----
goto :goto_0
.end method
+ .method public getInt(I)I
.parameter "max"
const/4 v3, 0x0
:try_start_0
iget-object v4, p0, Lcom/tencent/mm/ui/chatting/-&cDI:Lcom/tencent/mm/ui/chatting/ChattingUI;
iget-object v4, v4, Lcom/tencent/mm/ui/chatting/ChattingUI;-&azR:Lcom/tencent/mm/ui/chatting/ChatF
invoke-static {v4}, Lcom/tencent/mm/ui/chatting/ChatF-&c(Lcom/tencent/mm/ui/chatting/ChatF)Lcom/tencent/mm/ui/MMEditT
move-result-object v4
invoke-virtual {v4}, Lcom/tencent/mm/ui/MMEditT-&getText()Landroid/text/E
move-result-object v4
invoke-interface {v4}, Landroid/text/E-&toString()Ljava/lang/S
move-result-object v1
.local v1, input:Ljava/lang/S
invoke-static {v1}, Ljava/lang/I-&parseInt(Ljava/lang/S)I
:try_end_0
.catch Ljava/lang/E {:try_start_0 .. :try_end_0} :catch_0
move-result v2
.local v2, re:I
const/4 v4, 0x1
if-lt v2, v4, :cond_0
if-gt v2, p1, :cond_0
.end local v1
#input:Ljava/lang/S
.end local v2
.restart local v1
#input:Ljava/lang/S
.restart local v2
move v2, v3
goto :goto_0
.end local v1
#input:Ljava/lang/S
.end local v2
move-exception v0
.local v0, e:Ljava/lang/E
move v2, v3
goto :goto_0
+ .end method
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 酒吧摇骰子怎么玩 的文章

 

随机推荐