Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified kstools.jar
Binary file not shown.
Binary file modified libs/baksmali.jar
Binary file not shown.
Binary file modified libs/smali.jar
Binary file not shown.
2 changes: 2 additions & 0 deletions libs/version.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
baksmali-2.5.2.jar
smali-2.5.2.jar
108 changes: 54 additions & 54 deletions src_code/kstools/src/cn/wjdiankong/jw/DoWorkUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,118 +16,118 @@ public class DoWorkUtils {
public static ArrayList<String> errorDexList = new ArrayList<String>();

/**
* ��ȡӦ��ǩ����Ϣ
* 获取应用签名信息
* @param srcApkFile
* @return
*/
public static boolean getAppSign(File srcApkFile){
try{
long time = System.currentTimeMillis();
System.out.println("��һ��==> ��ȡapk�ļ�ǩ����Ϣ");
System.out.println("第一步==> 获取apk文件签名信息");
String sign = ApkSign.getApkSignInfo(srcApkFile.getAbsolutePath());
Const.appSign = sign;
System.out.println("signed:"+sign);
System.out.println("��ȡapkǩ����Ϣ�ɹ�===��ʱ:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
System.out.println("获取apk签名信息成功===耗时:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
return true;
}catch(Exception e){
System.out.println("��ȡapkǩ����Ϣʧ�ܣ��˳���:"+e.toString());
System.out.println("获取apk签名信息失败,退出!:"+e.toString());
return false;
}
}

/**
* ��ȡӦ�������
* 获取应用入口类
*/
public static boolean getAppEnter(File srcApkFile){
try{
long time = System.currentTimeMillis();
System.out.println("�ڶ���==> ��ȡapk�ļ������Ϣ");
System.out.println("第二步==> 获取apk文件入口信息");
String enter = AnalysisApk.getAppEnterApplication(srcApkFile.getAbsolutePath());
Const.entryClassName = enter.replace(".", "/");
System.out.println("Ӧ�������:"+enter);
System.out.println("��ȡapk�������Ϣ�ɹ�===��ʱ:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
System.out.println("应用入口类:"+enter);
System.out.println("获取apk入口类信息成功===耗时:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
return true;
}catch(Exception e){
System.out.println("��ȡapk�������Ϣʧ�ܣ��˳���:"+e.toString());
System.out.println("获取apk入口类信息失败,退出!:"+e.toString());
FileUtils.printException(e);
return false;
}
}

/**
* ��ѹapk
* 解压apk
*/
public static boolean zipApkWork(File srcApkFile, String unZipDir){
try {
long time = System.currentTimeMillis();
System.out.println("������==> ��ѹapk�ļ�:"+srcApkFile.getAbsolutePath());
System.out.println("第三步==> 解压apk文件:"+srcApkFile.getAbsolutePath());
FileUtils.decompressDexFile(srcApkFile.getAbsolutePath(), unZipDir);
System.out.println("��ѹapk�ļ�����===��ʱ:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
System.out.println("解压apk文件结束===耗时:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
return true;
} catch (Throwable e) {
System.out.println("��ѹapk�ļ�ʧ�ܣ��˳���:"+e.toString());
System.out.println("解压apk文件失败,退出!:"+e.toString());
return false;
}
}

/**
* ɾ��ǩ���ļ�
* 删除签名文件
*/
public static boolean deleteMetaInf(String unZipDir, String aaptCmdDir, String srcApkPath){
try{
long time = System.currentTimeMillis();
File metaFile = new File(unZipDir + Const.METAINFO);
System.out.println("���IJ�==> ɾ��ǩ���ļ�");
System.out.println("第四步==> 删除签名文件");
if(metaFile.exists()){
File[] metaFileList = metaFile.listFiles();
File aaptFile = new File(aaptCmdDir);
String cmd = aaptFile.getAbsolutePath() + " remove " + new File(srcApkPath).getAbsolutePath();
for(File f : metaFileList){
cmd = cmd + " " + Const.METAINFO + f.getName();
}
System.out.println("ɾ��ǩ���ļ�����:"+cmd);
System.out.println("删除签名文件命令:"+cmd);
execCmd(cmd, true);
}
System.out.println("ɾ��ǩ���ļ�����===��ʱ:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
System.out.println("删除签名文件结束===耗时:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
return true;
}catch(Throwable e){
System.out.println("ɾ��ǩ���ļ�ʧ�ܣ��˳���:"+e.toString());
System.out.println("删除签名文件失败,退出!:"+e.toString());
return false;
}
}

/**
* ��dexת����smali
* 将dex转化成smali
*/
public static boolean dexToSmali(String dexFile, String smaliDir){
File smaliDirF = new File(smaliDir);
if(smaliDirF.exists()){
smaliDirF.delete();
}
smaliDirF.mkdirs();
System.out.println("���岽==> ��dexת����smali");
String javaCmd = "java -jar libs"+File.separator+"baksmali.jar -o "+smaliDir + " " + dexFile;
System.out.println("第五步==> 将dex转化成smali");
String javaCmd = "java -jar libs"+File.separator+"baksmali.jar disassemble "+dexFile + " " + "-o" + " " + smaliDir;
long startTime = System.currentTimeMillis();
try {
Process pro = Runtime.getRuntime().exec(javaCmd);
int status = pro.waitFor();
if(status == 0){
System.out.println("dexת��smali�ɹ�===��ʱ:"+((System.currentTimeMillis()-startTime)/1000)+"s\n\n");
System.out.println("dex转化smali成功===耗时:"+((System.currentTimeMillis()-startTime)/1000)+"s\n\n");
return true;
}
System.out.println("dexת��smaliʧ��,status:"+status);
System.out.println("dex转化smali失败,status:"+status);
return false;
} catch (Exception e) {
System.out.println("dexת��smaliʧ��:"+e.toString());
System.out.println("dex转化smali失败:"+e.toString());
return false;
}
}

/**
* �滻ԭʼǩ���Ͱ���
* 替换原始签名和包名
*/
public static boolean setSignAndPkgName(){
System.out.println("������==> �������滻ԭʼǩ���Ͱ�����Ϣ");
System.out.println("第六步==> 代码中替换原始签名和包名信息");
File pmsSmaliDirF = new File(JWMain.rootPath + Const.smaliTmpDir + File.separator + Const.pmsSmaliDir);
if(!pmsSmaliDirF.exists()){
pmsSmaliDirF.mkdirs();
Expand Down Expand Up @@ -156,10 +156,10 @@ public static boolean setSignAndPkgName(){
writer.write(str+"\n");
}
}
System.out.println("����ǩ���Ͱ����ɹ�===��ʱ:"+((System.currentTimeMillis()-startTime)/1000)+"s\n\n");
System.out.println("设置签名和包名成功===耗时:"+((System.currentTimeMillis()-startTime)/1000)+"s\n\n");
return true;
}catch(Exception e){
System.out.println("����ǩ���Ͱ���ʧ��:"+e.toString());
System.out.println("设置签名和包名失败:"+e.toString());
}finally{
if(reader != null){
try{
Expand All @@ -184,10 +184,10 @@ public static boolean setSignAndPkgName(){
}

/**
* ����hook����
* 插入hook代码
*/
public static boolean insertHookCode(){
System.out.println("���߲�==> ����hook����");
System.out.println("第七步==> 添加hook代码");
long startTime = System.currentTimeMillis();
String enterFile = JWMain.rootPath + Const.smaliTmpDir + File.separator + Const.entryClassName.replace(".", File.separator) + ".smali";
String enterFileTmp = JWMain.rootPath + Const.smaliTmpDir + File.separator + Const.entryClassName.replace(".", File.separator) + "_tmp.smali";
Expand Down Expand Up @@ -235,10 +235,10 @@ public static boolean insertHookCode(){
isSucc = true;
}
}
System.out.println("����hook����ɹ�===��ʱ"+((System.currentTimeMillis()-startTime)/1000)+"s\n\n");
System.out.println("插入hook代码成功===耗时"+((System.currentTimeMillis()-startTime)/1000)+"s\n\n");
isWorkSucc = true;
}catch(Exception e){
System.out.println("����hook����ʧ��:"+e.toString());
System.out.println("插入hook代码失败:"+e.toString());
}finally{
if(reader != null){
try{
Expand Down Expand Up @@ -269,38 +269,38 @@ public static boolean insertHookCode(){
}

/**
* ��smaliת����dex
* 将smali转化成dex
*/
public static boolean smaliToDex(String smaliDir, String dexFile){
System.out.println("�ڰ˲�==> ��smaliת����dex");
System.out.println("第八步==> 将smali转化成dex");
File dexFileF = new File(dexFile);
if(dexFileF.exists()){
dexFileF.delete();
}
String javaCmd = "java -jar libs"+File.separator+"smali.jar "+smaliDir + " -o " + dexFile;
String javaCmd = "java -jar libs"+File.separator+"smali.jar assemble "+smaliDir + " -o " + dexFile;
long startTime = System.currentTimeMillis();
try {
Process pro = Runtime.getRuntime().exec(javaCmd);
int status = pro.waitFor();
if(status == 0){
System.out.println("smaliת��dex�ɹ�===��ʱ:"+((System.currentTimeMillis()-startTime)/1000)+"s\n\n");
System.out.println("smali转化dex成功===耗时:"+((System.currentTimeMillis()-startTime)/1000)+"s\n\n");
return true;
}
System.out.println("smaliת��dexʧ��,status:"+status);
System.out.println("smali转化dex失败,status:"+status);
return false;
} catch (Exception e) {
System.out.println("smaliת��dexʧ��:"+e.toString());
System.out.println("smali转化dex失败:"+e.toString());
return false;
}
}


/**
* ʹ��aapt��������dex�ļ���apk��
* 使用aapt命令添加dex文件到apk中
*/
public static boolean addDexToApk(String aaptCmdDir, String unZipDir, String srcApkPath){
try{
System.out.println("�ھŲ�==> ��dex�ļ����ӵ�Դapk��");
System.out.println("第九步==> 将dex文件添加到源apk中");
long time = System.currentTimeMillis();
File aaptFile = new File(aaptCmdDir);
String cmd = aaptFile.getAbsolutePath() + " remove " + new File(srcApkPath).getAbsolutePath();
Expand All @@ -313,7 +313,7 @@ public static boolean addDexToApk(String aaptCmdDir, String unZipDir, String src
}
System.out.println("cmd:"+cmd);
if(!execCmd(cmd, true)){
System.out.println("����dex�ļ���apk��ʧ�ܣ��˳���");
System.out.println("添加dex文件到apk中失败,退出!");
return false;
}

Expand All @@ -325,28 +325,28 @@ public static boolean addDexToApk(String aaptCmdDir, String unZipDir, String src
}
System.out.println("cmd:"+addCmd);
if(!execCmd(addCmd, true)){
System.out.println("����dex�ļ���apk��ʧ�ܣ��˳���");
System.out.println("添加dex文件到apk中失败,退出!");
return false;
}
System.out.println("����dex�ļ���apk�н���===��ʱ:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
System.out.println("添加dex文件到apk中结束===耗时:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
return true;
}catch(Throwable e){
System.out.println("����dex�ļ���apk��ʧ�ܣ��˳���:"+e.toString());
System.out.println("添加dex文件到apk中失败,退出!:"+e.toString());
return false;
}
}

/**
* ǩ��apk�ļ�
* 签名apk文件
*/
public static boolean signApk(String srcApkPath, String rootPath){
try{
System.out.println("��ʮ��==> ��ʼǩ��apk�ļ�:"+srcApkPath);
System.out.println("第十步==> 开始签名apk文件:"+srcApkPath);
long time = System.currentTimeMillis();
String keystore = "cyy_game.keystore";
File signFile = new File(rootPath+File.separator+keystore);
if(!signFile.exists()){
System.out.println("ǩ���ļ�:"+signFile.getAbsolutePath()+" �����ڣ���Ҫ�Լ��ֶ�ǩ��");
System.out.println("签名文件:"+signFile.getAbsolutePath()+" 不存在,需要自己手动签名");
return false;
}
String storePass = "cyy1888";
Expand All @@ -361,28 +361,28 @@ public static boolean signApk(String srcApkPath, String rootPath){
signCmd.append(keystore + " ");
signCmd.append("-digestalg SHA1 -sigalg MD5withRSA");
execCmd(signCmd.toString(), false);
System.out.println("ǩ��apk�ļ�����===��ʱ:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
System.out.println("签名apk文件结束===耗时:"+((System.currentTimeMillis()-time)/1000)+"s\n\n");
return true;
}catch(Throwable e){
System.out.println("����ǩ��apk�ļ�ʧ�ܣ��˳���:"+e.toString());
System.out.println("重新签名apk文件失败,退出!:"+e.toString());
return false;
}
}

/**
* ����ɾ������
* 清理删除工作
*/
public static void deleteTmpFile(String rootPath){
//ɾ����ѹ֮���Ŀ¼
//删除解压之后的目录
FileUtils.deleteDirectory(rootPath+Const.unZipDir);
//ɾ��smaliĿ¼
//删除smali目录
FileUtils.deleteDirectory(rootPath+Const.smaliTmpDir);
//ɾ����ʱdex�ļ�
//删除临时dex文件
FileUtils.deleteFile(rootPath+File.separator+"classes.dex");
}

/**
* ִ������
* 执行命令
* @param cmd
* @param isOutputLog
* @return
Expand Down