kotlin
变量valval(value的简写)用来声明一个不可变的变量,这种变量在初始赋值之后就再也不能重新赋 值,对应Java中的final变量。
varvar(variable的简写)用来声明一个可变的变量,这种变量在初始赋值之后仍然可以再被重新 赋值,对应Java中的非final变量。
fun main(){ val a=10 println("a = " + a)}
显示的进行变量声明val a: Int = 10
函数语法规则fun methodName(param1: Int, param2: Int): Int{ return 0}
函数名后面紧跟着一对括号,里面可以声明该函数接收什么参数,参数的数量可以是任意多个,例如上述示例就表示该函数接收两个Int类型的参数。参数的声明格式是“参数名: 参数类型”,其中参数名也是可以随便定义的,这一点和函数名类似。如果不想接收任何参数,那么写一对空括号就可以了
参数括号后面的那部分是可选的,用于声明该函数会返回什么类型的数据,上述示例就表示该函数会返回一个Int类 ...
so
枚举各种
通过枚举导入表,可以得到出现在导入表中的函数地址
var imports=Module.enumerateImports("libxiaojianbang.so");for(let i=0;i<imports.length;i++){ console.log(JSON.stringify(imports[i]));}
通过枚举导出表,可以得到出现在导出表中的函数地址
var exports=Module.enumerateExports("libxiaojianbang.so");for(let i=0;i<exports.length;i++){ console.log(JSON.stringify(exports[i]));}
通过枚举符号表,可以得出出现在符号表中的函数地址
var symbol=Module.enumerateSymbols("libencryptlib.so");for(let i=0;i<symbol.length; ...
密码学进阶
MD5MD5对明文的处理C实现MD5算法的使用MD5.h#pragma once//// Created by Administrator on 2021-07-28.////在一些情况下,反斜杠 \ 可以用作行连接符,用于将代码行连接在一起。换句话说,如果你想在一行代码上换行而不终止该行,可以在行末添加一个反斜杠。#ifndef HOOKDEMO_MD5_H#define HOOKDEMO_MD5_Htypedef struct { unsigned int count[2]; unsigned int state[4]; unsigned char buffer[64];} MD5_CTX;#define F(x,y,z) ((x & y) | (~x & z))#define G(x,y,z) ((x & z) | (y & ~z))#define H(x,y,z) (x^y^z)#define I(x,y,z) (y ^ (x | ~z))#define ROTATE_LEFT(x,n) ((x <&l ...
NDK开发
NDK介绍
NDK与Java工程的区别
第一个NDK工程
so中常用的Log输出
NDK多线程简介
JNI_OnLoad
JavaVM
JNIEnv
so相关的几个概念
so函数注册
so之间的相互调用
so路径的动态获取
通过jni创建Java对象
//1、找类//2、得到方法id//3、创建对象jclass clazz = env->FindClass("com/xiaojianbang/ndk/NDKDemo");jmethodID methodID = env->GetMethodID(clazz,"<init>","()V");jobject ReflectDemoOjb = env->NewObject(clazz,methodID);LOGD("ReflectDemoObj %p",ReflectDemoObj);
通过jni访问Java属性
jmethodID methodID = env->GetMethodID(clazz,"<in ...
密码学
h5App的逆向
PC端的谷歌浏览器进入chrome://inspect/#devices
hook修改WebView为可调试Java.perform(function(){ var WebView = Java.use('android.webkit.WebView'); WebView.$init.overload('android.content.Context').implementation = function(a){ console.log("WebView.$init is called!"); var retval = this.$init(a); this.setWebContentsDebuggingEnabled(true); return retval; } WebView.$init.overload('android.content.Context& ...
免root使用frida
Frida自吐算法演示Java.perform(function () { function showStacks() { console.log( Java.use("android.util.Log") .getStackTraceString( Java.use("java.lang.Throwable").$new() ) ); } function logOutPut(msg) { Java.use("android.util.Log").d("xiaojianbang", "frida inject: " + msg); } var ByteString = Java.use("com.android.okhttp.okio ...
objection
objection的安装
objection的使用
objection的插件
frida
静态方法和实例方法的hook
不需要区分修饰符,也不需要区分静态和实例方法,hook代码的写法都是一样的
得到Money类对象
var money = Java.use("com.xiaojianbang.hook.Money");
hook实例方法
money.getInfo.implementation = function(){ var result = this.getInfo(); console.log("money.getInfo result:",result); return result;}
hook静态方法
money.setFlag.implementation = function(a){ console.log("money.setFlag parmm:",a); return this.setFlag(a);}
函数参数和返回值的修改var money = Java.use("com.xiaojianbang. ...
关键代码快速定位
hook一些重要函数Java.perform(function () { function showStacks() { console.log( Java.use("android.util.Log") .getStackTraceString( Java.use("java.lang.Throwable").$new() ) ); } // var hashMap = Java.use("java.util.HashMap"); // hashMap.put.implementation = function (a, b) { // if(a.equals("username")){ // showStacks(); // co ...
嘟嘟牛算法复现
;(function (root, factory) { if (typeof exports === "object") { module.exports = exports = factory(); } else if (typeof define === "function" && define.amd) { define([], factory); } else { root.CryptoJS = factory(); }}(this, function () { var CryptoJS = CryptoJS || (function (Math, undefined) { var create = Object.create || (function () { function F() { ...