自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (2)
  • 收藏
  • 关注

原创 ttEncrypt 虚拟机加密逆向分析(超详细附带算法源码)

再次查看函数 sub_2BD4 的汇编指令,发现函数头部 SP, SP, #0x520 申请的栈空间特别大,函数内部只需要很小的栈空间,然后参数5中传入 sp+0x510,栈中的一个地址,所以参数5指向的栈地址,应该是虚拟机的内存和context所需的内存大小,在函数sub_2BD4栈中分配,但是并没有初始化操作,只是将这个栈内存指针传递到了 sub_2D28 这个虚拟机函数,那么在虚拟机函数中一定会做初始化。= Xn时,[X19,#-0x20] = 1,且 [X19,#-0x18] = PC + 8。

2025-03-31 13:52:01 339

原创 unidbg读写跟踪还原X-Gorgon

后20字节 0x06292b2e51bf21d8e270474e655a4379e5d3f7f6,指令地址 0x804e8。都是同一个地址,应该是在做加密运算。参数签名函数调用序列 0x88ee0 -> 0x87e48 -> 0x86d60 -> 0x6B14c。第5和6字节 0x0000,指令地址0x13742c,初始化buffer为0后没有再写入。进一步跟踪,查看地址 0xbfffda60 + 0x12 ,在哪里被写入 0x3d。第1个字节 0x84,指令地址 0x81138,直接写入无需计算。

2025-03-31 12:15:32 621

原创 get_seed协议

【代码】get_seed协议。

2025-03-28 11:07:46 181

原创 X-Khronos算法分析

额,这个好像不用分析。

2025-02-10 15:24:06 180

原创 X-Argus算法分析

【代码】X-Argus算法分析。

2025-02-10 15:21:20 493 1

原创 X-Ladon算法分析

【代码】X-Ladon算法分析。

2025-02-10 15:12:11 226

原创 X-Gorgon算法分析

1) 生成一个长 0x100 即 256 的表,初始时分别赋值为 0 - 255。循环执行下面操作,用于初始化表。md5(url_param) -> 4字节。2字节 random + 0000(可用)md5(body) -> 4字节。返回 -> X-Gorgon。固定头部 0x8404。

2025-02-10 15:00:20 462 2

原创 图灵顿 SDK协议加解密

【代码】图灵顿 SDK协议加解密。

2024-12-19 16:50:32 265

原创 图灵顿 SDK协议序列化和反序列化

【代码】图灵顿 SDK协议序列化和反序列化。

2024-12-19 16:48:14 237

原创 SOUL密钥交换算法

使用了ecdh算法,非标准椭圆曲线参数。分析过程懒得写了,直接上demo。

2024-12-19 16:41:53 224

原创 Lsposed Java HOOK原理及检测

从当前指令 + 0xC处,取地址保存到 X0,根据前面的分析,这是HOOk方法的 ArtMethod结构体指针,接着取出 ArtMethod + 0x20处的值,这个值正是HOOk方法的ArtMethod对应的 entrypoint。这个函数先使用 BuildDex 接口动态生成HOOK类和方法,然后创建ClassLoader加载这个DEX,详情可以分析 BuildDex 内部,会创建 LSPHooker_ 类名和hook的方法名。上述根据不同平台生成了不同的跳板指令。

2024-09-22 12:27:46 1162 1

原创 允许特权APP写data_system目录

修改后发现priv_app仍然被selinux限制。

2024-09-17 00:02:57 287

原创 Android DPC模式多开 APP

4、修改 UserManagerService canAddMoreProfilesToUser getMaxUsersOfTypePerParent。修改 markUserProvisioningStateInitiallyDone。3、修改 mUserManager.getMaxSupportedUsers。1、修改创建多个profile时超出限制。7、 删除不需要的APP。

2024-09-17 00:01:51 1291

原创 Android源码集成 Google Play

将app 和 product 文件夹下的所有apk文件拷贝到 /gms/app目录下,将 priv-app文件夹下的apk拷贝到 /gms/priv-app目录下,在 gms目录下 新建 Android.bp文件,配置预装的app。将 etc lib64 和 framework 拷贝到源码 /gms/copyToSystem 目录下,并在 /build/target/product/base_product.mk 中添加如下拷贝命令。

2024-09-16 23:55:03 1095

原创 Android 源码集成可卸载 APP

在 /build/target/product/base_product.mk中添加如下命令, 会将 /apps/apps目录下的所有文件拷贝到 /system/usr/app ,将 shell脚本拷贝到 /system/bin目录。2、系统APP放在 /system/app目录。系统编译后,打包前, /data分区不起作用,因此系统打包前,可以先将APP全部拷贝到 /system分区的 /system/usr/app目录下。1、拷贝APP暂存到 /system/usr/app 目录。

2024-09-16 23:52:39 1150

原创 ADB ROOT开启流程

ADBRootService类位于 frameworks/base/core/java/android/adb/ADBRootService.java。当 service.adb.root 属性为 1 且 ro.debuggable = 1 时,会继续保持root权限运行。adb_root服务的入口函数位于 system/core/adb/root/main.cpp。执行 adb root命令时, 调用 restart_root_service。上述字段通过 getString 获取。

2024-09-16 23:47:15 1393 1

原创 USB开启ADB设置流程

那么 sys.usb.state 属性的值是在哪设置的呢?setting应用中有监听adb状态广播:packages/apps/Settings/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java。UsbDeviceManager类路径位于 frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java。

2024-09-16 23:41:33 2886

原创 编译 Android 11源码

ture 改为 WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY?1)WITH_DEXPREOPT := ture 改为 WITH_DEXPREOPT := false。2、build/make/core目录下dex_preopt_config.mk文件。2、用生成的framework.jar替换系统的framework.jar。3、重启zygote。

2024-09-16 23:27:44 963

原创 LLVM IR指令VM混淆分析

看注解,这个虚拟指令 vstore 的逻辑是从当前栈顶取两个元素,这两个元素都是指向虚拟内存的地址,实际上是虚拟内存的下标,第一个元素指向虚拟内存中的一个 int32值,第二个元素指向虚拟内存中的一个 int32*地址值,然后把第一个元素取出的 int32值,保存到第二个元素取出的int32*地址处,然后把栈顶下标移动2 个。来模拟全部 IR指令的过程。看注解,vadd指令有一个操作数,操作逻辑是将前两个 vpush指令压入栈中的地址,取出来并从虚拟内存中取出值,相加后保存在指令操作数指向的地址中。

2024-09-06 23:31:11 849

原创 数盟IOS端可信ID

基本结论: 所谓的可信设备ID,并不是还原原生的IDFA,同样只是上报一些数据,后台归因然后返回后台保存的IDFA.后台归因时,不是简单的根据某个ID一样判断出是一个设备。也就是说对于越狱设备,直接读取到的就是与APP无关的全局设备ID,当系统不存在这些文件以及设备未越狱时,由SDK生成并保存,未越狱设备测试发现每次清空数据后启动did值改变。2、SDK内部的did出现碰撞等。2、改变包名,不是同一个开发者,IDFA1此时为空,simulateIDFA相同,其余ID不同,但是返回了不同的qid和cdd。

2024-08-30 11:35:58 1840

原创 数美Android SDK

文件路径、stat文件节点信息,__system_property_get系统属性、硬件信息、路由和网络信息等。stat lstat __system_property_get open 等。

2024-08-29 16:35:20 1953

原创 图灵盾IOS SDK

var/mobile/Containers/Data/Application/47E75209-64AF-4F43-AE14-204D57BDF53C/Documents(APP文档目录)Stat信息中的时间信息只有越狱状态下才能获取,即越狱设备可以根据stat时间信息计算设备ID。/usr/lib/CepheiUI.framework/CepheiUI(非法模块)3、同一个设备 HOOK stat函数,篡改函数的返回值,设备ID不同。1、同一个设备清空keychain和app缓存前后,设备ID相同。

2024-08-29 16:31:28 1645 1

原创 客户端安全全景图

简单描述了下,等有时间了再把每个点的原理和细节详细整理。这里不包括 PC客户端。

2024-08-29 16:01:11 215

原创 unidbg直接调用tiktok so生成签名

Tiktok版本: 33.2.5 (24年1月25日) 通过对Tiktok抓包发现TikTok的所有http请求的头部增加了参数签名(x-argus、x-goron、x-khronos、x-ladon):直接将apk文件用jadx工具反编译,搜索关键字x-argus等,未搜索到任何关键字:使用frida hook java层 Header对象的构造方法,发现有监控到https请求头设置,但是始终没有发现签名字段接着尝试hook interceptor拦截器,打印出请求头部,结果输出的请求头部中还

2024-08-29 15:42:37 4091 18

原创 LuaJit分析(十一)去除string.dump函数

因此即使我们的指令顺序被打乱,通过loadfile系统调用,再通过string.dump调用,可以得到字节码文件,再通过与标准的luajit生成的字节码文件比对,即可找出差异所在。Lua脚本中的string.dump函数用于生成字节码文件,根据对 luajit -b命令的分析可以得出,最终dump出字节码文件都是使用的string.dump函数。同时lj_libdef.h和lj_ffdef.h这两个文件都是自动生成的,在msvcbuild.bat中,使用如下命令生成。

2024-08-29 12:03:10 753

原创 LuaJit分析(十)luajit自定义修改

通过分析luajit字节码文件格式可知,luajit文件由文件头和原型数组组成,而原型又包括原型头和原型体,文件头中包含了字节码文件的一些关键信息,目前的反编译工具根据标准的luajit2.0文件格式解析文件,如果对字节码文件的信息自定义,将直接导致反编译过程中出现异常。字节码指令中,第一个字节存放的是opcode,实质是该字节码的opcode在BCOp中的下标,因此修改上述BCDEF宏定义的顺序后,对应字节码opcode的顺序也跟着改变,即生成的字节码文件与标准的字节码文件中指令的opcode会改变。

2024-08-29 11:51:02 1212

原创 LuaJit分析(八)LuaJit预编译库函数加载过程

可以看到,该函数通过调用lj_bcread_proto读取luajit字节码的原型数据,接着使用原型创建一个新函数,然后保存该函数变量。

2024-08-29 11:38:58 621

原创 LuaJit分析(九)LuaJit中的JIT原理分析

Luajit存在97个字节码指令,例如 FORL指令对应一个数字类型的for循环语句,同时还有IFORL指令(强制解释模式执行)和JFORL指令(Jit模式执行),同时解释器实现了对各个字节码指令的翻译,这里以X86的翻译器为例。它将当前指令的地址右移一位,并与HOTCOUNT_PCMASK与操作,得到一个索引(哈希运算),根据这个索引在数值中找到计数值,减去HOTCOUNT_LOOP,当这个计数值小于0时,跳转到vm_hotloop继续执行。多种情况都会出现结束记录的情况,如遇到了已经编译的指令。

2024-08-29 11:35:30 2153

原创 LuaJit分析(五)LuaJit filename分析

参数argx包含了执行的lua脚本文件名,luaL_loadfile加载了一个lua脚本,通过之前的分析可知,luaL_loadfile会加载一个字节码文件或者转换一个源码文件,最终都会得到转换好的原型结构。在还原指针和参数栈后,ins_call开始执行解释器的call指令。

2024-08-29 11:15:33 632

原创 LuaJit分析(七)LuaJit -b 命令分析

由之前对luajit -b 命令的分析可知,readfile函数最终返回原型数据,如果是字节码文件,返回读取后的原型数据,否则进行源码分析再返回原型数据。luajit -b生成字节码,实际上是调用 bcsave.lua脚本中的bcsave函数,该函数通过readfile函数(最终调用loadfile库函数)来完成lua脚本和字节码统一返回原型数据,并通过string.dump库函数生成完整的字节码文件。从这里就可以明显的看出,它通过分别生成头部、原型等数据来完成字节码的生成。

2024-08-29 11:12:59 700

原创 LuaJit分析(六)luajit -bl 命令分析

接着调用bc.lua中的bcdump函数,递归解析各个原型,通过bcline函数,解析各个指令,bcline函数中用到了vmdef.lua中定义的opcode和各个库函数的符号名,这些符号名由buildvm.c在编译过程中自动生成。从备注可以看出就是输出字节码指令,这是一个递归函数,先根据传入的第一个参数,使用funcinfo函数获取函数信息,funcinfo是一个库函数,位于jit.util. funcinfo,如果它有孩子,则递归调用全部为原型类型的孩子。

2024-08-29 11:09:52 1295 1

原创 LuaJit分析(三)luajit字节码文件格式

Luajit字节码文件格式的完整信息如上图所示,包括文件头Header和原型Proto,一个原型可以对应lua源码中的一个函数或源文件。原型的字节码指令,每条指令占四个字节,默认对齐时,第一个字节为opcode,占用三个字节,始终是0x1B4C4A,表示这是一个luajit文件。STRIP表示是否去除调试信息,0表示没去除,包含调试信息。uleb128类型,表示整个原型占用字节大小,为0标志结束。upvalue,uint16,个数为原型头中指定的个数。BE表示是否大端对齐,默认0表示小端对齐。

2024-08-29 10:59:58 1635

原创 LuaJit分析(四)luajit 64位与32位字节码区别

luajit 64位和32位字节码不一样,体现:1、文件头部的flags表示,64位中有标记 fr2 = 12、原型头中的栈帧大小,当原型中有call指令并有参数时,frame大小会比32位的加13、参数压入的位置,当存在call指令并且有KSTR等指令压入参数时,压入的位置会加14、原因是CALL调用时需要保存返回地址,在32位中,地址占4字节,直接覆盖了栈中压入的函数字段类型的类型部分(4字节),而64位中地址占8字节,因此将栈的大小增加了1,并移动所有参数。

2024-08-29 10:55:03 1576

原创 LuaJit分析(二)luajit反编译工具

总的来说,luajit-decomp比较稳定,但是反编译出来的代码可读性差,之所以稳定,是因为它先使用 luajit -bl 命令将字节码转换成汇编代码,再通过线性扫描汇编代码,转换成lua脚本代码。Ljd是使用Python写的反编译工具,定义了luajit2.0完整的指令信息,并实现了所有的luajit字节码解析函数,解析出来的lua脚本可读性高。

2024-08-29 10:38:14 1465

原创 LuaJit分析(一)LuaJit交叉编译

使用ndk版本 r16bNDKP指定了ndk编译器的前缀NDKARCH指定了编译成armv7平台NDK_SYSROOT_BUILD指定了头文件目录NDK_SYSROOT_LINK=$NDK/platforms/android-$NDKABI/arch-arm指定了链接时的库文件目录1、Windows下编译:启动cygwin64,切换到luajit目录,sh运行脚本(需要安装make)2、Linux下编译:sh运行脚本,注意ndk路径。

2024-08-29 10:29:21 1154

原创 C++虚函数对象内存模型分析

编写测试代码如下,定义一个基类Base,并第一个虚函数 func。定义一个子类Derived,继承基类Base,并覆盖虚函数 funcmain函数中创建临时对象 Derived, 并使用基类指针指向Derived对象,通过指针调用虚函数 func。首先进入分析main函数代码:上述是main函数的汇编指令,由于是局部申明对象,申明后的对象在栈中保存,保存地址是将该地址通过rdi寄存器传参,然后调用Derived的构造函数。

2024-08-28 20:07:24 1212

原创 IOS CydiaSubstrate inline hook分析

测试代码中 my_fopen直接调用了原始的fopen,此时调用的原始fopen和系统的原始fopen起始地址肯定不一样,因为前四条指令已经被patch,要成功调用,一定得执行原始的前四条指令。从汇编代码中可以看到, blr x8调用了原始的fopen函数,x0和x1保存了fopen需要的两个参数。可以看到,该地址即为自定义的my_fopen函数的起始地址。该地址即为系统原始的fopen地址开始处的第五条指令,到此即可以正常完成原始fopen函数的调用。

2024-02-18 16:40:06 735 1

原创 160个破解练习之CrackMe 008

这个软件超简单,那我就简单的写一下过程:直接OD载入,运行界面如下:随便输入一个字符串提示如下:那么我们直接在OD里面智能搜索字符串,定位到这个提示框调用的函数处;00401CD0 > \55 push ebp00401CD1 . 8BEC mov ebp,esp00401CD3 . 83EC 0C

2017-12-07 11:37:41 489

原创 KMP算法笔记

KMP算法是一种快速的字符串匹配算法,我们先从暴力字符串匹配算法讲起看怎么对其优化得到KMP算法。1、暴力字符串匹配        有如下两个字符串:A:“abcabbcabc”和B:“adfabcabccabcadbcabca”,我们要在B中找到A的匹配位置,暴力匹配的做法就是:把A的第一个元素与B的第一个元素对齐并开始往后遍历比较,遍历的过程中只要有一个字符不匹配,则将

2017-12-07 10:34:50 260

原创 160个破解练习之CrackMe 007

第七个软件与第六个类似,同一个作者,软件界面如下:        软件有两个文本框,三个按钮,点击说明按钮时,和上一个软件的提示类似,也是要求隐藏下面的按钮,使下面的Logo显示完全才算破解。这个软件也是使用Delphi写的,那么我们直接使用Delphi专用的逆向软件分析下事件:         通过分析发现,程序隐藏了一个按钮,

2017-12-06 21:28:52 673

cheat engine

寻找游戏代码工具 最新汉化版 .................................

2012-10-04

进制转换器

进制转换器,将十六进制数据转换成十进制

2012-09-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除