自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

https://github.com/CYRUS-STUDIO

  • 博客(164)
  • 资源 (7)
  • 收藏
  • 关注

原创 Frida 调用 kill 命令挂起&恢复 Android 线程

kill 是 Linux 系统中用来向进程发送信号的命令,最常用于终止进程。在底层,kill() 实际上会触发系统调用(比如 Linux 的 syscall kill),让内核发送信号给指定的进程。实现一个 suspendOtherThread 函数,挂起除了 excludeList 中指定名字的所有线程。kill 在 C 语言中是定义在 <signal.h> 中的一个标准函数,它本质上是一个系统调用的封装函数。这个目录中每一个子目录的名字就是该 App 的一个线程的 TID(Thread ID)。

2025-04-09 18:23:33 618

原创 Frida Stalker Trace 指令跟踪&寄存器变化监控

putCallout 会在你指定的位置插入一个“钩子”,在那一刻调用你指定的 JS 函数,提供当前上下文(CPU 寄存器状态)。在 Stalker.follow 的 transform 回调函数中 处理目标线程执行的每一条汇编指令。你无法在那时访问寄存器、调用栈等。iterator 是一个 指令迭代器对象,它让你能够 逐条处理目标线程将要执行的原始机器指令。指令级跟踪:Stalker 可精确到指令级别,对应用的原生代码进行实时监控。对比当前和上一次的寄存器值,返回发生变化的寄存器(不包括 pc 寄存器)。

2025-04-07 19:41:47 808

原创 Frida Hook Android Native 函数

android_dlopen_ext 是 Android 特有的 dlopen 扩展版本,允许开发者在加载共享库时使用额外的选项,比如 指定库的加载路径 或 共享库的保护标志。dlopen 函数 在 linker 模块,是 Android 系统上的动态库加载函数,用于在运行时加载共享库(.so 文件)。在 Android 系统中,这些函数的原型通常可以在 Bionic(Android 的 C 库)中找到。argTypes:一个数组,指定函数的参数类型,如 [“pointer”, “int”]。

2025-04-03 04:02:05 591

原创 Frida Hook Native:jobjectArray 参数解析

通过 env.js 中定义的 stringFromJni 函数可以直接获取到字符串对象的值。通过 getObjectClassName 可以获取到对象的类名进而判断该元素的类型。常用的 JNI 函数在 frida 的 env.js 中都已经定义好了。通过下面代码获取 JNIEnv 引用,就可以调用相关的 JNI 函数。hook native 函数并打印 jobjectArray 传参。打印 jobjectArray 的元素类型和值。

2025-04-02 18:08:39 199

原创 Unidbg Trace 反 OLLVM 控制流平坦化(fla)

在 callJniMethodObject 方法之前添加如下代码,trace 指令执行和内存读写,并把 trace log 输出到文件。得到 trace log,包含指令流、寄存器变化、内存读写信息。F5 反汇编代码如下,很明显通过 fla 隐藏了真实的执行流。通过 unidbg 加载 so 并执行 so 中目标函数。把 so 放到 resource 目录下。根据真实的执行指令流去还原算法执行过程。目标方法反汇编视图如下。

2025-03-30 23:38:33 264

原创 使用 Frida Stalker 反 OLLVM 算法还原

Stalker.follow() 使用 onCallSummary 时,不会实时回调,而是在合适的时间点返回已汇总的调用信息。通过 onRecive 解析可以知道 调用的是 libaes.so 偏移 0x25f60 的函数。使用 CyberChef 的 AES CBC 算法加密得到结果和 app 的是一样的。因此,你会在目标函数执行完毕后,看到 onCallSummary 输出的调用信息。用 IDA 打开 libaes.so 并调整到对应的地址,可以找到调用的函数。

2025-03-30 04:39:06 813

原创 Android 中实现一个自定义的 AES 算法

在 LibTomCrypt 中,AES 算法的 S-Box(替代盒)是通过查找表(lookup table)实现的,而 AES 的表(如 S-Box)主要是存在于 src/cipher/aes/aes_tab.c 文件中。算法支持丰富:包括对称加密(AES、DES 等)、非对称加密(RSA、ECC 等)、哈希算法(SHA-256、MD5 等)理论上,你可以通过修改 LibTomCrypt 中的 S-Box 或其他查找表,来实现你自己的 AES 变体。

2025-03-29 04:59:51 894

原创 Android 自定义变形 HMAC 算法

HMAC(Hash-based Message Authentication Code)是一种基于哈希函数的消息认证码,用于验证数据的完整性和真实性。比如,哈希函数是 SHA256 则返回的字符串就是 32 字节(256位),通常由长度为 64 的 十六进制字符串 表示。比如,哈希函数是 MD5 则返回的字符串就是 16 字节(128位),通常由长度为 32 的 十六进制字符串 表示。HMAC-MD5 总共调用了 2 次 MD5:一次计算 InnerHash,一次计算最终的 HMAC。

2025-03-26 22:23:59 601

原创 OLLVM 增加 C&C++ 字符串加密功能

当我们如果没有对字符串进行加密,使用 IDA 反汇编一下 so 可以看到 C++ 代码中的字符串就直接暴露了。编译完成后,通过 IDA 打开 so 可以看到字符串常量 “cyrus” 已经被替换成 &unk_6DE20。processConstantStringUse() 找到所有使用加密字符串的地方,替换为解密后的变量。只要在定义的地方把字符串加密,引用时候再解密就可以实现字符串的自动加解密了。为字符串变量创建一个初始化函数,用于在运行时执行解密操作。通过生成 ir 文件可以看到字符串的定义都是 @“?

2025-03-25 20:24:13 1074

原创 Android 自定义变形 SHA1 算法

SHA1Update 用于处理输入数据。SHA1Init 是 SHA1 算法中的一个初始化函数,用于初始化 SHA1 的上下文 (SHA1_CTX),设置初始状态和计数器,为后续的哈希计算做好准备。在 SHA1 算法中,R0、R1、R2、R3、R4 是 SHA1 的五个主要轮次(Rounds),每个轮次包含 20 次操作,总共 80 次迭代。这些轮次的核心是基于位运算的消息调度和非线性函数的应用,用于将输入数据混淆并生成最终的哈希值。R4 (Round 4):最终的轮次,进一步强化数据的不可逆性。

2025-03-25 02:57:05 894

原创 Android 自定义变形 MD5 算法

在 MD5 中,FF、GG、HH 和 II 是四个核心的轮函数(Round Functions),它们负责对数据块进行不同形式的混淆和非线性操作。每一轮都包含 16 次操作,共 64 次。MD5是一种哈希函数,用于将任意长度的数据映射为一个固定长度的哈希值。在 cpp 中实现 native 方法,调用 MD5_Init、MD5_Update、MD5_Final 完成 MD5 的计算并返回结果。固定长度输出:将任意长度的数据转换为 128 位(16 字节) 的哈希值,通常以 32 位十六进制 字符串表示。

2025-03-22 01:53:56 1106

原创 使用 Unicorn 还原变异 CRC32 算法

把 LDR X8, [X19] 和 BLR X8 nop 掉,再替换成自定义的 hook 函数 get_string_utf_chars,在函数中实现自定义的 GetStringUTFChars。app 中实现一个 CRC32 算法变形,具体实现在 so 中 modifiedCRC32 函数,现在要通过 unicorn 和 IDA Pro 逆向还原 so 中的算法。直接 nop 掉就好。把 X8 存入 X29(即 FP,帧指针)的 var_8 位置,通常是局部变量或栈空间的一部分。

2025-03-18 20:39:14 755

原创 基于 Unicorn 实现一个轻量级的 ARM64 模拟器

get_string_utf_chars() 模拟了 GetStringUTFChars(),在指定内存地址写入 UTF-8 编码的字符串,并返回指针地址。代码 Hook:在 _setup_hooks() 中设置 UC_HOOK_CODE 钩子,每次执行到一条指令时触发 hook_code()。寄存器设置:提供了 set_x0()、set_x1() 和 set_x2() 等方法,用于直接设置寄存器值。内存映射:在 _setup_memory() 中分配 10MB 的代码区和 1MB 的栈区。

2025-03-18 18:34:34 320

原创 安卓实现魔改版 CRC32 算法

CRC32 Table 是通过 init_crc32_table 方法中 位移 和 异或 常量 0xedb88320 运算得来的。实现 native 方法并调用 crc32 方法进行加密并返回 hex 字符串。我们可以通过修改常量值,实现自定义 Table,比如改成 0xd76aa478。计算 CRC 时额外 XOR 0xA5A5A5A5 进一步扰动结果。创建 crc32.cpp,使用 C++ 实现标准 CRC32 算法。修改常量 0xedb88320 改为 0x82F63B78。

2025-03-13 23:43:44 666

原创 安卓逆向魔改版 Base64 算法还原

通过引用查找发现 xmmword_54C30、qword_54C40 是在 sub_23F30 方法中初始化的,sub_23F30 方法在 init_array 时被调用。customEncode 是一个 Function1<byte[], String> 类型的 函数接口,表示它是一个接受 byte[] 并返回 String 的函数。_QWORD 和 _OWORD都是 IDA Pro 反编译器使用的类型,它们不是标准的 C/C++ 关键字,而是 IDA 用于表示不同大小的数据类型。

2025-03-12 21:26:03 1747

原创 安卓实现魔改版 Base64 算法

C++ 实现 customBase64Encode 和 customBase64Decode(使用自定义 Base64 码表)。使用 XOR 值对标准 Base64 码表进行偏移,生成新的 Base64 码表。实现 native 函数并调用 C++ 中 Base64 编码和解码函数。码表基于 输入长度变化,用 异或(XOR)运算 生成新字符映射。创建 base64.cpp 实现 Base64 编码和解码。Kotlin 层中声明 native 编码和解码函数。C++ 中实现 native 编码和解码函数。

2025-03-12 21:07:16 394

原创 常用加解密算法介绍

HMAC(基于哈希的消息认证码)使用一个密钥(Key)和一个哈希函数(Hash Function),将输入消息进行加密计算,生成一个固定长度的认证码(MAC)。它提供了一系列 加密、解密、编码、解码、数据转换、压缩、哈希、取证分析 等功能,适用于安全研究、数据处理和取证分析等场景。OpenSSL 是一个开源加密库,支持 SSL/TLS 协议,实现 RSA、AES、SM2、SM4 等算法,提供加密、证书管理、哈希计算等功能,广泛用于网络安全、身份认证和数据保护。

2025-03-07 00:32:27 764

原创 unidbg 实现 JNI 与 Java 交互

再实现一个 native 方法 sign 接受一个字符串 content,将 java 层 UnidbgActivity 中 静态变量 a + content + 非静态变量 b 拼接,再调用 java 层的 base64 方法传入拼接后的字符串得到加密串作为返回值。更简单的方案,直接把反编译后的 java 类复制过来,做一下简单的修改,去掉不需要的代码,只留下目标方法相关的代码(注意:类路径一定要保持一致!对于对象中的字段,我们可以重写 getObjectField 方法类似的处理,处理逻辑也类似。

2025-03-03 10:37:50 1069

原创 unidbg 加载 so 并调用 so 中函数

unidbg 是一个基于 Java 的 Android 动态分析框架,专注于模拟 Android 应用中的 native 代码。以下是它的主要功能:支持对so的加载;支持对JNI接口函数的模拟调用;支持常见syscalls的模拟调用;支持ARM32和ARM64。支持Android以及iOS基于HookZz实现的inline hookxHook实现的hookiOS fishhook,substrate、whale hook等支持gdb、IDA远程调试等高级功能。…Unidgb 项目地址:https://git

2025-02-27 13:42:04 1116

原创 使用 AndroidNativeEmu 调用 JNI 函数

native_method 装饰器用于在 AndroidNativeEmu 中将 Python 函数标记为模拟的 JNI 原生方法,允许函数在模拟器中执行并与 Android 的原生方法交互。对应 JNI 接口的模拟实现在 src/androidemu/java/jni_env.py,通过 write_function_table 方法模拟实现 JNI 函数表。so 加载过程中,对 so 中导入符号的 Hook,具体代码在:src/androidemu/native/hooks.py。

2025-02-23 18:13:41 467

原创 使用 Unicorn 如何进行栈读写 和 Patch

struct.pack 是 Python 标准库 struct 模块中的一个函数,它用于将 Python 的基本数据类型(如 int、float、long)打包为字节流,以便在二进制文件、网络传输或内存操作(如 Unicorn 仿真器的 mem_write)中使用。在 Unicorn 中,可以通过 mem_write 方法直接修改指定地址的指令数据。例如,要将某个位置的指令替换为 NOP。<f:表示小端(<)的 4 字节浮点数(float)value:要转换的 Python 值。

2025-02-23 18:03:45 546

原创 Unicorn Hook 详解:指令、代码块、内存、系统调用等

UC_HOOK_BLOCK用于 Hook 代码块(Basic Block)执行,在 Unicorn 模拟执行时,每进入一个新的 Basic Block,都会触发 Hook 回调。默认情况下,UC_HOOK_MEM_READ 和 UC_HOOK_MEM_WRITE 会监听所有内存地址的读写。但是,你可以指定特定的内存范围来限制 Hook 的触发范围。第二次执行时崩溃,因为 SVC 指令触发了系统调用,而 Hook 已移除,没有模拟返回值,导致 CPU 异常 (UC_ERR_EXCEPTION)。

2025-02-10 00:23:31 646

原创 使用 Unicorn 调用 android so 中的 JNI 方法

编写一个方法用于打印所有 ARM64 寄存器的值,包括 通用寄存器(X0-X30)、SP(堆栈指针) 和 PC(程序计数器)。调用 emu_start ( start_address, end_address ) 开始执行 add 方法的机器码。通过 IDA 打开 so 文件可以看到 add 方法的开始地址为 0x0608,结束地址为 0x063C。前 8 个参数(整数/指针)使用 X0-X7(64 位)传递,32 位值使用 W0-W7。第 5 个及后续参数 存放在栈上(从 SP 指向的位置开始)。

2025-02-10 00:20:19 534

原创 Frida 实现 JNI 方法地址跟踪、反汇编、Patch

调用 printAssemblyInstructions 方法重新反汇编 add 函数地址可以看到汇编指令 mov w0, #3 已经成功被替换为 mov w0, #2。把 add 函数动态注册到 com.cyrus.example.frida.disassemble.FridaDisassembleActivity#add。这些功能在 Frida 的 Instruction 类中实现,基于 Capstone 实现的反汇编功能。定义一个 native 函数 add,计算 1+ 1 + 1 并返回结果。

2025-02-09 01:52:51 883

原创 Capstone、Unicorn 与 Keystone

跨平台、跨架构的仿真框架,支持模拟多个操作系统(如 Windows、Linux 和 macOS),使用 Unicorn 作为指令集仿真的底层引擎。要反汇编 .so 文件,首先需要提取其中的代码段内容(通常为 .text 段),然后利用 Capstone 进行反汇编。的底层核心使用 Capstone 作为反汇编引擎,用于分析运行时的指令流、解码和显示二进制代码(例如,用户可以通过。以下是一个用于 ARM64 的 Keystone 示例,实现一个简单的 1 + 1 运算,并将结果存储在寄存器中。

2025-02-09 01:47:24 923

原创 Android Dex VMP 动态加载加密指令流

为了进一步加强对 dex 指令的保护,实现指令流加密和动态加载,比如使用 AES 加密指令流,在运行时解密执行。将 .vmp 和 .key 文件放在 Android 应用的 assets 目录下。调用 AESUtils 类中方法对 sign 进行加密并输出加密文件和密钥。得到解密后的指令流后调用 VMP 执行指令流对 input 参数加密。把 sign 方法字节码粘贴到新建的文件保存文件为 sign。编写工具类,用于读取 assets 文件并解密。和原来的 sign 算法对比是结果是一样的。

2025-01-13 21:37:55 535

原创 详解如何自定义 Android Dex VMP 保护壳

Android Dex VMP(Virtual Machine Protection,虚拟机保护)壳是一种常见的应用保护技术,主要用于保护 Android 应用的代码免受反编译和逆向工程的攻击。VMP 保护壳通过将应用的原始 Dex(Dalvik Executable)文件进行加密、混淆、虚拟化等处理,使得恶意用户无法轻易获取到应用的原始代码和逻辑。比如,实现一个 Android 下的 Dex VMP 保护壳,用来保护 Kotlin 层 sign 算法,防止被逆向。

2025-01-13 21:20:09 1823

原创 移植 OLLVM 到 Android NDK,Android Studio 中使用 OLLVM

自 Android NDK r18 开始,Google 弃用了 GCC,全面转向使用 LLVM/Clang 作为 NDK 的编译工具链。OLLVM 是 LLVM 的一个分支,增加了代码混淆功能(如控制流平坦化、指令替换),主要用于保护二进制代码的安全性。bin:包含可执行文件,例如编译器(clang、clang++)、链接器(ld)等,主要用于 NDK 工具链的操作。例如,支持标准 C/C++ 函数的实现库。NDK 中 LLVM 所在路径:/toolchains/llvm/prebuilt//bin/

2024-12-24 00:09:10 1155

原创 移植 OLLVM 到 LLVM18,修复控制流平坦化报错

从报错信息来看,Flattening.cpp 的第 101 行代码在运行时发生了异常,具体错误类型是 访问权限冲突 (0xC0000005),通常意味着代码尝试访问了无效或空的内存指针。在 Flattening.cpp 中 65 行和 97 行都调用了 entryBB.getTerminator()->eraseFromParent();(img-vOKCAkqn-1734793869941)](img-vOKCAkqn-1734793869941)]把 Flattening.cpp 中 97行的代码。

2024-12-21 23:17:36 421

原创 移植 OLLVM 到 LLVM 18,C&C++代码混淆

BCF 的核心思想是通过增加虚假的分支语句,构造看似复杂的控制流图(CFG),让逆向分析者难以理解程序的真实逻辑。在较新版本的 LLVM 中,llvm::Type::getInt8PtrTy 已经被移除或更改,取而代之的是通过 llvm::PointerType::get 创建指针类型。你可以为每个函数添加一个或多个注释。LLVM 是一个广泛使用的编译器框架,OLLVM 在其基础上提供了多种混淆技术,旨在增加程序逆向分析和反编译的难度,从而提高程序的安全性。

2024-12-13 04:02:11 1137 4

原创 docx2markdown,使用 python 把 docx 文件转换为 markdown

docx2markdown 是一个可以把 docx 文件中内容转换为 markdown 的 python 库。docx 文档转换后的 markdown。

2024-11-28 17:12:46 422

原创 使用 opt 优化 LLVM IR,定制 clang 实现函数名加密

使用 opt 工具加载 MyPass.dll 插件,运行自定义的 my-function-pass ,对 test.ll 进行优化处理,并将结果输出到 test_opt.ll。使用 opt 工具加载 MyPass.dll 插件,运行自定义的 my-module-pass ,对 test.ll 进行优化处理,并将结果输出到 test.bc。创建 MyFunctionPass.cpp,定义一个函数级别的 Pass,run 遍历函数中的基本块以及基本块中的每条指令,并将其输出。

2024-11-26 03:30:06 679

原创 编译 LLVM 源码,使用 Clion 调试 clang

LLVM IR(Intermediate Representation):一种类似汇编的中间表示语言,是 LLVM 的核心抽象。在 Android NDK 中,LLVM/Clang 是默认的编译器。LLVM 是一个开源的编译器基础架构,最初由 Chris Lattner 于 2000 年在伊利诺伊大学开发,后来成为一个广泛应用于编译器和程序分析的项目。LLVM IR 优化和代码生成:LLVM 对中间表示进行优化,并生成适合 Android 设备(如 ARM、ARM64、x86、x86_64)的机器码。

2024-11-24 23:05:32 1329

原创 Android下的系统调用 (syscall),内联汇编syscall

由于我们内联汇编 syscall 需要和原来的汇编保持一致,不需要编译器自动生成的函数入口代码和退出代码,所有需要用到 “裸函数”(naked function)。裸函数是一种特殊的函数,它允许你直接控制函数的汇编指令,而不会自动为你生成函数的入口代码(如保存寄存器、调整栈指针)和退出代码(恢复寄存器、恢复栈指针)。直接内联汇编实现 syscall 调用可以让你跳过标准库的封装层,隐藏 syscall 调用,防 hook 增加逆向难度。在 C++ 代码文件中添加 raw_syscall 函数声明。

2024-11-10 06:34:29 1886

原创 Android 下内联汇编,Android Studio 汇编开发

由于 Android 设备可能使用不同的 CPU 架构(如 ARM、ARM64、x86 和 x86_64),使用条件编译和 NDK 的特性,我们可以让代码适配不同的 CPU 架构。) 指令,判断当前编译架构并编写相应的内联汇编代码。在 Android 开发中,编写兼容不同架构的内联汇编代码时,可以通过条件编译来处理不同的指令集。占位符用于在汇编指令中插入 C++ 变量,格式为 %0、%1 等,对应输出和输入操作数的顺序。汇编指令:这是我们想要执行的汇编代码,通常是 ARM 或 ARM64 指令。

2024-11-09 02:26:23 1300

原创 ARM64汇编寻址、汇编指令、指令编码方式

以及专门的栈指针(SP)和程序计数器(PC)寄存器,用于管理函数调用和指令执行。在上面的例子中,由于使用的是 64 位的 X 寄存器,每个寄存器占 8 字节(64 位),所以 STP 和 LDP 指令会操作两个 8 字节的数据。在 MOV(bitmask immediate)中,该字段固定为 11111,表示使用零寄存器(WZR 或 XZR),以便执行立即数到寄存器的移动操作。支持多种寻址方式,例如偏移寻址、基地址寄存器加偏移等,非常适合访问内存中的数据,如全局变量、数组元素等。例如,存储和加载局部变量。

2024-11-05 12:46:54 1900

原创 详解ARM汇编条件标志

具体来说,CMP R1,R2 指令会将寄存器 R1 的值减去寄存器 R2 的值,但不会将结果存储在任何寄存器中。这一操作的主要目的是更新条件标志,以便后续的条件执行指令可以根据比较结果做出决策。当两个有符号数相加或相减时,如果结果的符号与操作数的符号不一致,表示发生了溢出,V 被置为 1。对于减法,若没有借位,则 C 被置为 1。在 ARM 指令集中,条件标志是控制指令执行的一种机制,它们用于实现条件分支、比较和其他逻辑操作。ARM 处理器通常使用四个主要的条件标志,它们的状态影响指令的执行。

2024-11-04 20:23:52 885

原创 Thumb 汇编指令集,Thumb 指令编码方式,编译 Thumb 汇编代码

打开 hello_thumb.s 可以看到,结构上和 ARM 汇编是差不多的,多了一些 thumb 标记,如:.code 16、.thumb_func 标记为 16 位 thumb,还有使用到 thumb 指令。由于 16 位 Thumb 指令长度有限,无法直接处理大立即数,而 32 位 Thumb 指令支持更大的立即数范围。ARM64 仅支持 32 位的固定长度指令,取消了 Thumb 指令集以及 ARM 和 Thumb 模式的切换,从而简化了指令解码和执行流程。

2024-11-04 02:38:15 1502 1

原创 adb 远程调试,手动修改 adb 调试授权信息

在 Android 系统中,adb 调试授权信息存储在设备的 /data/misc/adb/adb_keys 文件中。可以将当前电脑的 adb 公钥复制到设备的 adb_keys 文件中,手动实现 adb 调试授权。使用 ADB 进入设备的 Shell(假设设备已经 root,可以通过 USB 连接)找到 adbkey.pub 后,复制文件中的内容。在设备上,进入设置 > 网络与互联网 > Wi-Fi,选择当前连接的网络。根据设备 ip 地址和端口号连接到设备,并在手机上确认授权调试提示。

2024-11-03 04:54:36 1131

原创 详解ARM64可执行程序的生成过程

例如,下面的汇编代码中,FADD D0, D0, D1 执行的了浮点运算 ,结果存放在浮点寄存器 D0 中。汇编器(如 GNU Assembler,as)将汇编代码文件(.s 文件)转换为机器代码,生成二进制的目标文件(.o 文件)。在ARM64的栈结构中,栈指针(SP)通常指向栈帧的底部(也就是较低地址的位置)。var_18 = -0x18 表示的是一个相对于当前 SP 的偏移量。文件包含:处理 #include 指令,将所需的头文件内容直接插入代码中,确保所有引用的函数和变量声明都在同一文件中。

2024-11-02 20:24:21 996

JS 精彩两百例

JS 精彩两百例

2015-05-30

Cocos2d-x2.1.5的代码提示包

用于cocos code ide中的Cocos2d-x2.1.5的代码提示包

2014-10-17

Cocos2d-x 遮罩效果

Cocos2d-x实现遮罩效果

2014-10-15

Cocos2d Particle Builder粒子编辑器

Cocos2d Particle Builder粒子编辑器

2014-07-09

jar2exe绿色破解版

将jar包转换为exe执行文件的工具

2014-07-06

Java就业培训教程(带书签)

Java就业培训教程(带书签),pdf格式文件

2014-06-04

工程打成jar包供第三方调用示例

工程打成jar包供第三方调用示例

2014-06-04

空空如也

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

TA关注的人

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