AutoHotkey结合 7z 和 keytool 一键查看apk文件的签名信息

网上下载的 apk,想核实是否被修改过,可以通过签名信息来查看,常规操作比较复杂,于是有了此文。

1、压缩软件打开apk,解压到临时文件夹 c: mp

  7z 用命令行可直接完成 7z.exe x c: esk.apk d:aa.7z -oc: mp

2、用Java jdk自带的 keytool 查看信息。用命令行 keytool.exe -printcert -file c: mpMETA-INFCERT.RSA 来获取

(附上最新的jdk官方下载地址,keytool在 jdk-15in目录下,keytool 本想单独提取出来,简单尝试后失败了

此步骤用 AutoHotkey 执行,可直接用 msgbox 显示结果,效果如下:

AutoHotkey结合 7z 和 keytool 一键查看apk文件的签名信息

3、删除解压的临时文件夹c: mp

代码如下(AutoHotkey v2 a102版):

#SingleInstance Force
;定义几个文件路径
fpApk := "c:UsersAdministratorDesktop	candroid3.apk"
fp7z := "d:AATCsoft7-Zip7z.exe"
fpKeytool := "d:Softjdk-15inkeytool.exe"
dir := "c:	mp" ;临时解压目录

;解压
RunWait(format("{1} x {2} -o{3}", fp7z,fpApk,dir))
;keytool 执行并返回签名信息
fpRsa := dir . "META-INFCERT.RSA"
res := cmdExec(format("{1} -printcert -file {2}", fpKeytool,fpRsa))
;删除临时文件夹
DirDelete(dir, 1)
;显示签名信息
msgbox(res)
return

cmdExec(strCode, callback:="", encode:="CP936")
{ ;  GAHK32 ; Modified version : SKAN 05-Jul-2013  http://goo.gl/j8XJXY
    dllcall("CreatePipe", "uintp",hPipeRead, "uintp",hPipeWrite, "uint",0, "uint",0)
    dllcall("SetHandleInformation", "uint",hPipeWrite, "uint",1, "uint",1)
    ; STARTUPINFO          http://goo.gl/fZf24
    VarSetCapacity(STARTUPINFO, 68, 0 )
    numput(68,         STARTUPINFO,  0)      ; cbSize
    numput(0x100,      STARTUPINFO, 44)      ; dwFlags    =>  STARTF_USESTDHANDLES = 0x100
    numput(hPipeWrite, STARTUPINFO, 60)      ; hStdOutput
    numput(hPipeWrite, STARTUPINFO, 64)      ; hStdError
    ; PROCESS_INFORMATION  http://goo.gl/b9BaI
    VarSetCapacity(PROCESS_INFORMATION, 16)
    if !dllcall("CreateProcess", "uint",0, "uint",&strCode, "uint",0, "uint",0, "uint",1, "uint",0x08000000, "uint",0, "uint",0, "uint",&STARTUPINFO, "uint",&PROCESS_INFORMATION)
    { ;http://goo.gl/USC5a
        dllcall("CloseHandle", "uint",hPipeWrite)
        dllcall("CloseHandle", "uint",hPipeRead)
        dllcall("SetLastError", "int",-1)
        return ""
    }
    hProcess := numget(PROCESS_INFORMATION, 0)
    hThread := numget(PROCESS_INFORMATION, 4)
    dllcall("CloseHandle", "uint",hPipeWrite)
    VarSetCapacity(Buffer, 4096, 0), nSz := 0
    while(dllcall("ReadFile", "uint",hPipeRead, "uint",&Buffer, "uint",4094, "uintp",nSz, "uint",0))
    {
        sThis := strget(&Buffer, nSz, encode)
        sRes .= sThis
        if isobject(callback)
            callback.call(A_Index,sThis)
    }
    dllcall("GetExitCodeProcess", "uint",hProcess, "uintp",ExitCode)
    dllcall("CloseHandle", "uint",hProcess )
    dllcall("CloseHandle", "uint",hThread  )
    dllcall("CloseHandle", "uint",hPipeRead)
    dllcall("SetLastError", "uint",ExitCode)
    return isobject(callback) ? callback.call(0,sRes) : sRes
}