关闭

Java中如何修改Jar中的内容

7033人阅读 评论(0) 收藏 举报
分类:

一、摘要

好长时间没写blog了,之前换了一家公司。表示工作更有战斗力了,可惜就是没时间写文章了。在这段时间其实是遇到很多问题的,只是都是记录下来,并没有花时间去研究解决。但是这周遇到这个问题没办法让我继续前进了。必须记录一下。以被后人使用。不多说了,进入主题。


二、前提

1、对于GA的了解(自行google)

2、对CampaignTrackingReceiver类的了解,他是当从GP上下载并且安装完成一个app的时候,发送一个广播,会在Intent中携带一些数据,一般是Refer值,这里可以区分从哪里下载的,具体简单的例子:A应用是我需要发布到GP上的应用,但是我们可能会在各个渠道上推广A,所以我们可能需要加上渠道号进行统计,所以这时候需要在A应用添加CampaignTrackingReceiver广播接收器,然后处理接收到的广播中的Intent的内容,解析出具体的渠道号,进行上报即可。所以说GP发送这个广播还是很奇特的,他发送了这个广播,然后等我们安装A并且运行了之后就可以接收到这个广播,等于这个广播发出去了,他会等待有一个接收器接受他。

3、本文中需要用到的工具下载地址:http://download.csdn.net/detail/jiangwei0910410003/8679153,下载完之后,首先要看一下txt文档中的说明。


三、问题描述

工程中接入了GA统计(Google提供的一种app统计功能的SDK),但是我们自己可能需要统计app从GP上下载的统计(这里一般是注册一个CampaignTrackingReceiver的广播),但是有问题就是GA的SDK中已经包含了CampaignTrackingReceiver类了,当时在弄的时候进入到了一个误区:就是认为如果app中想接收到这个广播的话。广播接收器的包名必须是:com.google.analytics.tracking.android,类名:CampaignTrackingReceiver,类似于下面的注册代码:

<receiver
	android:name="com.google.analytics.tracking.android.CampaignTrackingReceiver"
	android:exported="true">
	<intent-filter>
	    <action android:name="com.android.vending.INSTALL_REFERRER" />
	</intent-filter>
</receiver>
但是之后发现不需要这样的,只要包名一样即可,其实从Android中发送广播的机制就可以知道。类名没有关系的,但是当时这个东西没办法测试的(需要发布一个测试app到GP上,时间上也是不允许的,只能听前辈的)。最后也是自己发布了一个测试app测试了才知道,不需要类名一样的,这个也算是一种收获,那么既然类名不一样的话,这里就没有问题了。就不会和GA中的类重复了。但是我在没有解释这个误区前用了另外的一种方法解决了这个问题。既然GA中有这个广播接收类,我们不能定义的话,可以在它的SDK中的这个广播类中插入一段代码:发送一个广播,把Intent中的数据带出来即可。思路有了,下面来看一下具体操作:


四、技术介绍

下面讲述的内容是基于上面的误区没有被解释的情况下说的,而且侧重点也不是解释误区。而是如何修改Jar中内容

首先说一下这个过程中的三个角色:jar,dex,smali

四个工具:dx.bat,dex2jar.bat,baksmali.jar,smali.jar

关系图如下:

我们这里需要修改jar中的代码,

首先说明一下,关于修改jar中的代码其实有很多方法的:

1、直接用压缩包工具打开jar中的class文件进行修改(除非你对指令集很熟悉,反正我是不愿意尝试)

2、使用jd-gui工具直接打开jar,进行修改(这个虽然能看懂代码,但是有一个问题就是如果代码被混淆了,那个难度还不如第一种方法了,所以也没有尝试)

好吧,那么第三种方法就是修改smali文件,这个文件的好处在于:指令简单,而且如果混淆了,也是没有关系的。关于smail的指令说明,可以自行google一下。很简单这里就不做解释了。


那么问题来了,如何将jar变成smali呢?这里没有发现他们两之间的直接转化工具,所以就曲线救国的方式做了。

首先将jar==>dex==>smali

然后修改smail中的内容

修改完之后会变成jar

smail==>dex==>jar

相当于dex是中转站了。


五、项目演示

技术实现说明完之后,下面来看一下Demo:

ReceiverLib工程

1、BtnReceiver.java

package com.example.receiverdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BtnReceiver extends BroadcastReceiver{

	private String action = "demo.action.myreceiver";
	
	@Override
	public void onReceive(Context context, Intent intent) {
		Log.i("demo", "action:"+intent.getAction());
	}

}
接收到广播然后打印log一下

2、MyReceiver.java

package com.example.receiverdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver{

	private String action = "demo.action.myreceiver";
	
	@Override
	public void onReceive(Context context, Intent intent) {
		Log.i("demo", "action:"+intent.getAction());
	}

}


3、Utils.java

package com.example.receiverdemo;

import android.content.Context;
import android.content.Intent;

public class Utils {
	
	public static void sendBroadcast(Context context,String action){
		Intent intent = new Intent();
		intent.setAction(action);
		context.sendBroadcast(intent);
	}

}
说明:BtnReceiver是点击Button之后发送的一个模拟广播,相当于上面需要改的CampaignTrackingReceiver类,MyReceiver是我们需要自己添加的广播接收器。

项目下载:http://download.csdn.net/detail/jiangwei0910410003/8679113


ReceiverDemo工程(需要导入ReceiverLib导出的jar)

package com.example.receiverdemo;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends ActionBarActivity {
	
	private String action = "demo.action.btnreceiver";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.btn).setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				Utils.sendBroadcast(MainActivity.this, action);
			}});
	}
}
模拟发送一个广播

项目下载:http://download.csdn.net/detail/jiangwei0910410003/8679123

效果:

点击Button之后,发送了广播,BtnReceiver也接收到了。


那么下面就开始在BtnReceiver.java中插入代码,发送一个MyReceiver

首先使用dx命令,将我们上面ReceiverLib导出的jar变成dex文件:

dx命令的使用方式:dx --dex --output C:\receiver.dex receiver.jar

然后在将receiver.dex转化成smali:

baksmali.jar的使用方式:java -jar baksmali-2.0.5.jar -o c:\classout/ c:\receiver.dex 

我们可以查看smali文件,我们重点看BtnReceiver.smali文件,因为我们要在这里插入代码:

.class public Lcom/example/receiverdemo/BtnReceiver;
.super Landroid/content/BroadcastReceiver;
.source "BtnReceiver.java"


# direct methods
.method public constructor <init>()V
    .registers 1

    .prologue
    .line 8
    invoke-direct {p0}, Landroid/content/BroadcastReceiver;-><init>()V

    return-void
.end method


# virtual methods
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
    .registers 7
    .param p1, "context"    # Landroid/content/Context;
    .param p2, "intent"    # Landroid/content/Intent;

    .prologue
    .line 12
    invoke-virtual {p2}, Landroid/content/Intent;->getAction()Ljava/lang/String;

    move-result-object v0

    .line 13
    .local v0, "action":Ljava/lang/String;
    const-string v1, "demo"

    new-instance v2, Ljava/lang/StringBuilder;

    const-string v3, "action:"

    invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-static {v1, v2}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

    const-string v4, "demo.action.myreceiver"

    invoke-static {p1, v4}, Lcom/example/receiverdemo/Utils;->sendBroadcast(Landroid/content/Context;Ljava/lang/String;)V

    const-string v5, "sendbroadcast"

    invoke-static {v1, v5}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

    .line 14
    return-void
.end method

关于smali指令网上自行搜索,很简单的,我们需要插入一行代码就是:

Utils.sendBroadcast方法:


这个过程中没有难度的,就不做解释了

下面我们就需要还原成jar了:

使用smali.jar工具将samli变成dex

用法:java -jar smali-2.0.5.jar c:\classout/ -o c:\receiver.dex

然后使用dex2jar命令将dex变成jar

用法:dex2jar receiver.dex

这时候我们就产生了修改之后的jar,我们将这个jar替换ReceiverDemo中的jar,然后运行结果:


成功显示了。我们的MyReceiver接收到了BtnReceiver中发送出来的广播了。


问题:

在这个过程中可能使用一些命令的时候会出现问题:


这个是class版本号不对,需要修改一下Eclipse中的Java编译器版本在编译导出jar就可以了。

其他的问题我这里没有遇到了。如果在开发的过程中遇到问题,记得回复留言,我尽量解答一下~~


六、总结

1、关于上面说到的问题,就是GA包中的类重复的问题,再次在说明一下,那个是个误区,我们自定一个Receiver也是可以的,不需要类名必须是:CampaignTrackingReceiver,所以有同学如果用到这个类的话,一定要记得,不要在入这个误区了。

2、关于修改jar中的内容,其实用途还是很多的,但是不是正规的解决方法,这个有点偏向于破解的方向了,这个是不符合开发原则的,这里说明一下就是为了多一条解决问题的办法,而且对逆向领域的一种知识补充,这个内容对逆向领域用处还是很大的。

3、关于这种方式使用与所有Java编写的程序,这里可能偏向于Android移动端了,但是如果JavaWeb中遇到这样的问题,也是可以使用这种方式解决的,不仅仅局限于Android方向。


《Android应用安全防护和逆向分析》

点击立即购买:京东  天猫


更多内容:点击这里

关注微信公众号,最新技术干货实时推送

编码美丽技术圈
微信扫一扫进入我的"技术圈"世界

扫一扫加小编微信
添加时请注明:“编码美丽”非常感谢!

4
0
查看评论

jar包修改并重新打包

由于需要修改下第三方jar包里面的一些逻辑,自己没有源码,使用下面的方法完成了任务: 1、首先使用反编jd打开jar包,以okhttp-2.6.0.jar为例: 通过菜单保存为java源码,然后修改代码,修改完成后 javac -classpath okhttp-2.6.0.jar C...
  • new_abc
  • new_abc
  • 2016-08-18 18:54
  • 10081

将JAR包反编译,修改后重新打包(转)

在学习和开发JAVA项目中,我们经常会用到第三方提供的一些jar。使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间。有的第三方工具,提供具体的使用说明和源代码,有时有的却不提供源代码,使用说明也不是很具体,这对我们使用就非常不方便。   有道是,知其然才知其所以然。有时候,我们必须...
  • junjie319
  • junjie319
  • 2015-02-07 10:14
  • 76256

直接修改别人jar包里面的class文件 工具:jclasslib

出于某些原因 需要把别人jar包里面的class修改一下信息 配置文件*.properties MANIFEST.MF 这些东西可以直接用记事本打开修改 然后替换掉就OK.. 在网上游荡了半天,没有找到合适的方法 开始我是先用jd-gui反编译 把我需要修改的那个A.class文件反编译...
  • hexin373
  • hexin373
  • 2011-08-08 16:50
  • 108626

修改Jar包源码(无需反编译工具)(文章看起来很长,其实方法超级简单!)

前言:本文结合实际项目案例,介绍修改jar包源码的方式。(其中运用了一些小技巧~) 正文: 场景:在项目中用了第三方的jar包,但是jar包某个类的成员变量是private的,想将其改为public属性,以便为其赋值(源码中没有其提供简单的set方法) 问题:如下图中,源码虽然可以阅读,但是根...
  • coycleipenghui
  • coycleipenghui
  • 2016-11-01 19:26
  • 9610

如何修改jar文件的内容

在做(或修改别人的)项目的时候,可能遇到要修改调用的的jar包内的类属性或方法的问题。在eclipse或是其他的IDE中是无法直接修改的,所以需要一个解压jar-->修改文件-->编译-->打包成jar文件的过程,下面简要的记录下我是如何做的: 1.将工程中的jar文件拷出来,用...
  • sy19901121
  • sy19901121
  • 2015-12-22 11:20
  • 14286

深入理解Dalvik字节码指令及Smali文件

今天来介绍有关Davilk虚拟机相关的知识,首先便是介绍我们最关心的Davilk字节码相关知识,进而深入到Android逆向领域.之所以写这篇文章,是因为有姑娘要学习这,再加上网上的许多资料太过零散和片面,
  • dd864140130
  • dd864140130
  • 2016-07-31 04:11
  • 11678

Java 操作Jar包,删除Jar包内的文件

JDK提供了一套操作Jar包的方法,使用方法如下: 1、JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarName)); 2、jos.putNextEntry(entry); 3、jos.wri...
  • u010402202
  • u010402202
  • 2018-01-17 16:57
  • 78

如何修改jar包中的内容

如何修改jar包中的内容背景:我们的java项目发布后通常会打包成jar包、或者war包,但是有一些配置文件是同jar包打在一起的。如果想要在打包之后修改配置文件,就有点问题了。这里介绍在打包后修改jar包内容的方法ps:以下操作接在linux上使用命令行操作,可用其他平台上的同类操作或者图形化工具...
  • bjrxyz
  • bjrxyz
  • 2016-07-14 20:53
  • 4247

修改jar内容

  • 2015-05-09 12:27
  • 4.76MB
  • 下载

利用AS修改Jar包中class文件内容

最简单的修改class文件方法
  • enlangs
  • enlangs
  • 2016-04-23 13:52
  • 1688
    《Android应用安全防护和逆向分析》正式开售
    《Android应用安全防护和逆向分析》

    360创始人周鸿祎、CSDN创始人蒋涛、看雪创始人段钢联袂推荐

    零基础学习移动安全逆向,手把手带你进入安全逆向领域!安全不息,逆向不止!让别人的应用都成为我们手中的炮灰!

    读者技术交流QQ群:682646223



    购买地址: 京东 天猫
    技术分享微信公众号
    扫一扫关注

    关注公众号留言可咨询问题和技术交流,推送最新技术文章!
    酱爆短视频
    酱爆短视频



    全球首款短视频聚合应用「酱爆视频」正式发布上线

    别人等车干着急,我在酱爆看视频

    想你说想,为你所做!

    不负众望,就在酱爆!

    点击查看详情
    微信扫一扫加入安全逆向圈

    友情链接
    个人资料
    • 访问:5684474次
    • 积分:32274
    • 等级:
    • 排名:第170名
    • 原创:306篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1668条
    博客专栏
    文章分类