ARM-DCD&DCDU

DCD指令分配一个或多个文字内存,按照四字节边界内存对齐,定义初始化运行内存内容。 & 是DCD指令的代名词。 DCDU与DCD一样,只不过内存对齐方式是任意的。 语法: {label} DCD{U} expr{,expr} expr    数字表达式    PC相对表达式 用处: DCD在第一个定义的字之前最多插入三个填充字节,以实现四字节对齐。 example: data1   DCD     1,5,20      ; Defines 3 words containing                             ; decimal values 1, 5, and 20 data2   DCD     mem06 + 4   ; Defines 1 word containing 4 +                             ; the address of the label mem06         AREA    MyData, DATA, READWRITE         DCB     255         ; Now misaligned … data3   DCDU    1,5,20      ; Defines 3 words containing                             ; 1, 5 and 20, not word aligned

Arm架构学习

ARM处理器是典型的RISC(精简指令集计算)处理器,实现了加载和存储架构。只有加载和存储指令才能访问内存,数据处理指令只操作寄存器。在实现了ARMV4或更新ARM架构的处理器中,都有32位的寻址范围。 ARM,THUMB和ThumbEE指令集 thumb指令集是ARMV4T之后定义的一种16位指令集,其中大部分32位指令可用,但是有些操作需要更多指令,thumb指令集以性能为代价提供了更好的代码密度。 ARMv6T2通过提供32位Thumb指令对Thumb指令集进行了重大增强。32位和16位Thumb指令共同提供与ARM指令集几乎完全相同的功能。增强的Thumb指令集(Thumb®-2)实现了ARM代码的高性能和更好的代码密度,例如16位Thumb代码。 ARMv7定义了Thumb执行环境(ThumbEE)。ThumbEE指令集基于Thumb,并进行了一些更改和添加,使其成为动态生成代码(即在执行之前或执行期间在设备上编译的代码)更好的目标。 ARM寄存器 在所有ARM处理器中,以下寄存器均可用: 13个通用寄存器R0-R12 1个栈指针(SP)R13 1个链接寄存器(LR)R14 一个程序计数器(PC)R15 1个程序状态寄存器(APSR)

Android使用系统签名签名apk

1. java -jar signapk.jar platform.x509.pem platform.pk8 Demo.apk signedDemo.apk 或者直接在Ubuntu 编译环境执行 java -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 input.apk output.apk 2. a:把pkcs8格式的私钥转化成pkcs12格式 openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt b:x509.pem公钥转换成pkcs12格式 openssl pkcs12 -export -in platform.x509.pem -inkey     shared.priv.pem -out shared.pk12 -name androiddebugkey 密码都是:android c:生成platform.keystore keytool -importkeystore -deststorepass android -destkeypass android -destkeystore platform.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey

支付宝老版本移动支付无法接收异步通知notify_url

今天适配了一个17年的移动支付,app和后端是老版本的移动支付api,这里暂且不谈安全不安全,遇到一个坑: app能够支付成功,但是后端始终接收不到异步通知,支付宝开放平台提供的排查地址也查询不到订单回调信息, 前后端联调半天不好使,问了问蚂蚁金服的客服,技术客服也调了很长时间,让我尝试配一下下面这两个地方: 这里我只配置了老版本wap支付的秘钥,没有配置mapi网关产品秘钥,问题就出在这,配一下mapi网关秘钥就好了。

Frida 找不到类: java.lang.ClassNotFoundException: Didn’t find class

用frida hook公司线上app(经过360加固的),发现有的类能够hook到,有的类hook不到,提示如: Error: java.lang.ClassNotFoundException: Didn't find class "duozhao.com.baselib.util.RsaUtil2" on path: DexPathList … 于是乎准备hook一下DexClassLoader的loadClass方法打印一下加载的class: var dexclassLoader = Java.use("dalvik.system.DexClassLoader"); //var pathclassLoader=Java.use("dalvik.system.PathClassLoader"); var hookClass = undefined; var ClassUse = Java.use("java.lang.Class"); var hooked = false; dexclassLoader.loadClass.overload("java.lang.String","boolean").implementation=function (name,resolve) {   console.log("加载类:"+name);  return   this.loadClass(name,resolve); }; 发现还是无法打印出想要的类,此时考虑可能是360加固改变了classloader,把加固后的app拿到jax下看,StupApp中以下代码:    public final void attachBaseContext(Context context) {         boolean r0;         super.attachBaseContext(context);         C0002.m6();         f5 = context;         if (f2 == null) {             f2 = this;         }         if (f3 == null) {             Boolean valueOf = Boolean.valueOf(C0002.m3());             Boolean valueOf2 = Boolean.valueOf(false);             Boolean valueOf3 = Boolean.valueOf(false);             if (Build.CPU_ABI.contains("64") || Build.CPU_ABI2.contains("64")) {                 valueOf2 = Boolean.valueOf(true);             }             if (Build.CPU_ABI.contains("mips") || Build.CPU_ABI2.contains("mips")) {                 valueOf3 = Boolean.valueOf(true);             }             if (valueOf.booleanValue() && needX86Bridge) {                 System.loadLibrary("X86Bridge");             }             if (!loadFromLib) {                 String absolutePath = context.getFilesDir().getParentFile().getAbsolutePath();                 try {                     absolutePath = context.getFilesDir().getParentFile().getCanonicalPath();                 } catch (Exception e) {                 }                 String str = absolutePath + "/.jiagu";                 f10 = m8(str, valueOf2.booleanValue(), valueOf3.booleanValue());                 f6 = m8(str, false, false);                 f7 = str + File.separator + f6;                 f8 = str + File.separator + f10;                 f9 = str;                 if (valueOf3.booleanValue()) {                     C0002.m4(context, f4 + "_mips.so", str, f6);                 } else if (!valueOf.booleanValue() || needX86Bridge) {                     C0002.m4(context, f4 + ".so", str, f6);                 } else {                     C0002.m4(context, f4 + "_x86.so", str, f6);                 }                 if (!valueOf2.booleanValue() || valueOf3.booleanValue()) { … Read more

Use Frida hook Android so File

我们自己写一个简单的app,java层调用so 方法返回的字符串打印输出,java层和c代码如下  public class TestUtil {     static {         System.loadLibrary("security");     }     public static native String getSecretPro(int adam); } #调用jni方法 LogUtil.e("adam",TestUtil.getSecretPro(23)); #C方法返回字符串 JNIEXPORT jstring JNICALL Java_com_adam_ndktest_TestUtil_getSecretPro   (JNIEnv *env, jclass jobj, jint val){   return (*env)->NewStringUTF(env,"eveve");   } 打包生成apk,安装到手机 把libsecurity.so文件拖入ida分析, 由上图可知,Java_com_adam_ndktest_TestUtil_getSecretPro方法的偏移地址是0x630,字符串便宜地址是0x64f,那么我们用基址+偏移地址就是函数的绝对地址了,frida获取so的基地址方法如下: var soAddr=Module.findBaseAddress("libsecurity.so"); Java_com_adam_ndktest_TestUtil_getSecretPro地址是soAddr+0x630: var proAddr=soAddr.add(0x630 ); 我们要直接hook返回值的话就是soAddr+0x64f地址对应的字符串 ,然后通过Memory.readUtf8String方法读取,更改返回值的话需要用到JNIEnv api的newStringUtf方法,完整的代码如下: Java.perform(function () {    // Memory.readUtf8String var mru8s = function(addr) {return Memory.readUtf8String(addr);};     var soAddr=Module.findBaseAddress("libsecurity.so");     console.log("soAddr:"+soAddr);     var proAddr=soAddr.add(0x630);     console.log("proAddr:"+proAddr);        Interceptor.attach(proAddr, {       onEnter: function (args) {               console.log("—–华丽的分割线—–");       },       onLeave: function(retval){       var staddr=soAddr.add(0x64f);       console.log(staddr);       var nat=new NativePointer(staddr);       console.log("nat:"+nat);       console.log("str:"+mru8s(staddr));   //读取返回的字符串          //替换返回字符串        var env = Java.vm.getEnv();        var jstring = env.newStringUtf("lixiaopeng");         retval.replace(ptr(jstring));         send("retval:"+retval);       }    });      });

Frida连接远程设备报错:Failed to spawn: unable to connect to remote frida-server

  hook app过程中由于usb松动总断开,所以只好连wifi,首先是用adb连接设备 adb tcpip 5555 adb connect 192.168.43.137:5555 #ip是远程设备的ip地址 进行frida调试: frida -R -f  com.tencent.mm  -l mm.js 会报错: Failed to spawn: unable to connect to remote frida-server 解决方法: 端口转发: adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27043

Frida hook 微信掷骰子

import  frida,sys rdev=frida.get_usb_device() session=rdev.attach("com.tencent.mm") print(session) # 1对应2点 # 4对应5点 # 3对应4点 # 0对应1点 # 2对应3点 # 5对应6点 jsr=""" Java.perform(function(){ var native=Java.use("com.tencent.mm.sdk.xx.xx"); native.方法名.overload("int","int").implementation=function(arr1,arr2){ console.log("调用了",arr1,arr2); var res=this.方法名(arr1,arr2); console.log("结果是"+res);  return 5; } }); """ def on_msg(message,data):     print(message) script=session.create_script(jsr) script.on("message",on_msg) script.load() sys.stdin.read()

Frida获取类下的所有方法和属性

Java.perform(function(){ var native=Java.use("com.tencent.mm.sdk.platformtools.bo"); console.log( Object.getOwnPropertyNames(native.__proto__).join("—") ); }); 以上js代码获取  com.tencent.mm.sdk.platformtools.bo 下所有的方法和属性 输出: (tensorflow) E:androiddevsdkplatform-tools>python wx.py Session(pid=3791) constructor—$new—$alloc—$init—$dispose—$isSameObject—class—$className—B—C—D—E—ET—G—H—K—N—P—PM—Q—R—SU—Y—a—aB—aC—aH—ag—ah—am—aq—arY—arZ—asA—asB—asC—asD—asE—asF—asG—asa—asb—asc—asd—ase—asf—asg—ash—asi—asj—ask—asl—asm—asn—aso—asp—asq—asr—ass—ast—asu—asv—asw—asx—asy—asz—ayF—ayG—b—bK—bL—bn—bq—c—cP—ci—cm—cn—co—convertStreamToString—cp—cq—cv—dNR—dNS—dNT—dNU—dNV—dNW—dNX—dNY—dNZ—dOa—deleteFile—dp—dq—e—eT—f—fH—fI—getBoolean—getDouble—getFloat—getInt—getLong—gp—h—hJ—hK—hL—hM—hN—hO—hP—hQ—hR—hS—hT—hb—hc—hideVKB—i—if—ig—isEqual—isNullOrNil—j—jf—jg—k—l—n—nN—nO—nP—nQ—nR—nullAsNil—o—om—q—r—readFromFile—t—wk—y—AzT—AzU—GMT—hij—kbE—kbF

adb 导出安装包

#列出已安装的所有包  adb shell pm list package package:com.miui.screenrecorder package:com.github.shadowsocks package:com.android.cts.priv.ctsshim package:com.qualcomm.qti.auth.sampleextauthservice package:com.qualcomm.qti.perfdump package:com.miui.contentextension package:com.oasisfeng.greenify package:com.android.providers.telephony package:com.miui.powerkeeper package:com.unionpay.tsmservice.mi package:com.mi.liveassistant package:com.android.providers.calendar package:com.miui.contentcatcher #查看要导出安装包的路径 adb shell pm path com.github.shadowsocks package:/data/app/com.github.shadowsocks-cCS55QKHkkCVrRtJVa79Rw==/base.apk #复制地址导出安装包 adb pull  /data/app/com.github.shadowsocks-cCS55QKHkkCVrRtJVa79Rw==/base.apk   shadowsocks.apk  over