字符串转字节数组
1 | s = "Hello, world!" # str object |
字节数组转字符串
1 | b = b"Hello, world!" # bytes object |
本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
乱码三千 – 码出一个新世界
1 | s = "Hello, world!" # str object |
1 | b = b"Hello, world!" # bytes object |
本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。

1 | # 想将字符串转编码成base64,要先将字符串转换成二进制数据 |
1 | # 将base64解码成字符串 |
本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
1 | import binascii |
执行以上 Python 代码,得到以下输出:
1 | 1dbbd4e9246ebffa |
1 | import javax.crypto.spec.IvParameterSpec; |
执行以上 Java 代码,输出:
1 | 加密前:zx |
python中还有一个库Crypto 也是用于加密的, 但是加密的结果和java不一致, 这是个坑, 以下是Crypto加密的代码, 用于对比:
1 | from Crypto.Cipher import DES |
本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
1 | from pyDes import des, ECB, PAD_PKCS5 |
python中还有一个库Crypto 也是用于加密的, 但是加密的结果和java不一致, 这是个坑, 以下是Crypto加密的代码, 用于对比:
1 | from Crypto.Cipher import DES |
本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
在使用NDK编译过程中发现针对不同的CPU架构,部分支持编译调试,部分不支持调试,故记录下来,以防忘记
在Application.mk文件中有个预定义命令参数APP_ABI,是指明编译与调试的CPU架构。
目前Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x86(从2011年),MIPS(从2012年),ARMv8,MIPS64和x86_64(从2014年),每一种都对应相应的ABI。
| CPU架构 | ABI | |
|---|---|---|
| ARMv5 | armeabi | 32位,从2010年 |
| ARMv7 | armeabi-v7a | 32位,从2010年 |
| x86 | x86 | 32位,从2011年 |
| MIPS | mips | 32位,从2012年 |
| ARMv8 | arm64-v8a | 64位,从2014年 |
| MIPS64 | mips64 | 64位,从2014年 |
| x86_64 | x86_64 | 64位,从2014年 |
相应生成arm64-v8a,mips64,x86_64下的文件需要NDK_r10以上版本支持。在Application.mk文件里配置APP_ABI的内容。例如指明某个具体的CPU架构
1 | APP_ABI := arm64-v8a |
或者直接生成所有的版本
1 | APP_ABI := all |
注意:根据不同的NDK版本,APP_ABI := all仅能生成当前版本支持的ABI信息库文件,如果需要生成最新的必须更新相应的NDK版本。
或者明确写明支持的CPU架构
1 | APP_ABI := armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64 |
建议采用该方法
注意:由于目前版本支持的问题,采用Eclipse+NDK+Windows集成方式开发,对应编译生成对应CPU架构的so文件是没有问题的。但是不一定可以执行调试工作,启动NDK调试模式时将会提示无法识别对应的ABI。
注意:
(1)、目前模拟器只有x86_64的没有arm64-v8a的;
(2)、在用真机测试armv8-a时,最好先通过adb shell, cat /proc/cpuinfo ,来查看下真机是否是支持armv8-a;
(3)、arm32和arm64有些配置参数不能共存,如-msoft-float仅在arm32位下支持,在arm64位下是不支持的.

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
Termux 是一款基于 Android 平台的开源 Linux 终端模拟器,使用 pkg(apt) 进行软件包的管理。最重要的是,它无需 root 权限,因此,绝大多数 Android 都可以运行。
目前来说,它能做一些简单的 Linux 任务:

因为 Termux 是一款 Linux 终端模拟器,因此,在命令的使用方面和 Linux 是一致的。在这里,我将介绍一些针对 Termux 工具的一些使用方法。
业内已经有了一种共识,在涉及包管理方面,尽量都会将官方源替换成国内镜像源,Termux 也不例外。初次进入 Termux 后,我们可以使用 TUNA 的 Termux 镜像:
1 | $ sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux stable main@' $PREFIX/etc/apt/sources.list # 更换源文件$ pkg up # 更新源文件$ pkg udpate -y && pkge upgrade # 更新系统及软件 |
替换为国内镜像后,接下来,需要开启 Termux 的存储权限:
1 | $ termux-setup-storage |
执行命令之后,会弹出权限确认窗口,选择「始终允许」即可。
权限确认

如果需要对 Termux 中的内容进行复制以及粘贴内容至 Termux,可以通过长按屏幕实现。

可以看到,在正常的键盘上方,还有一盘额外的功能键,分别是:ESC 键,Tab 键,CTRL 键,ALT 键,- 符号,向下以及向上功能键。有了这一行额外视图,可以更加方便地实现 Android 键盘上没有,而电脑键盘上有的功能。
因为 Android 键盘没有电脑键盘上的一些功能按键,此时,我们可以通过按住音量键+,再输入键盘某个字母数字键,可以达到一些功能键的作用。
有些时候,我们需要将 Android 上的某些文件发送到其他设备(例如笔记本,分享)。以往的解决方案一般是用微信或者 QQ 来作为中转站,现在,可以利用 Termux 搭建一个简单的文件服务器来实现。
1 | $ pkg install python -y # 需要使用 Python$ ifconfig wlan0 # 查看 Android 在局域网中的 IP 地址(我的为 192.168.2.104)$ python -m http.serverServing HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/)... |
命令成功运行之后,可以看到输出信息中包含了端口地址(我这里是 8000)。此时,用另外一台处于相同局域网(例如 Wi-Fi)的设备在浏览器地址输入 192.168.2.104:8000 即可访问文件服务器了。

一提到命令行,怎能少得了那些酷炫的字符如降雨一般,这看起来就很黑客。我们可以通过安装 pkg install cmartix 来实现这种效果。

本文转自:https://sspai.com/post/56031

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
相信点击进入这篇博客的小伙伴都知道并且搞过App逆向,不过有时候会遇到各种加壳的App,不让你反编译。但是道高一尺,魔高一丈,有正向加密,就有逆向解密。此篇博客博主带大家搭建脱壳环境,并且手动脱一个加了某60的壳的App。闲话少叙,直接开始吧!
Android系统 环境需要一个Android系统,并且系统的版本控制在4.0-6.0之间。建议使用虚拟机/模拟器,不然你还要获取root权限,容易搞坏真机。我这里用的是网易模拟器,Android系统的版本为6.0.1.

需要root权限,虚拟机直接允许即可,真机要用第三方工具获取,网上有很多教程。
Xposed Installer官网地址:https://repo.xposed.info/module/de.robv.android.xposed.installer
Xposed Installer下载完毕后,直接拖入模拟器安装即可。然后打开这个App

由于我之前安装过,所以没提示要root权限,第一次安装的时候会提示授权的,授予即可。
反射大师 反射大师是一个支持一键脱壳的神器,貌似什么壳都能脱,不过后面更新的壳会不会添加检测机制就说不清了。。。
反射大师下载地址:https://www.lanzous.com/i6x1kaf
ReflectMaster并授权 直接拖入模拟器中进行安装,然后打开。会提示让你激活Xposed。



然 后 重 启 模 拟 器 ! \color{red}然后重启模拟器!然后重启模拟器!
首先在模拟器中安装好待脱壳的软件,用MT管理器可以查看软件加的是什么壳。(反射大师不区分壳类型,是壳都可以脱。)
反射大师打开待脱壳App 先把软件选中,然后打开待脱壳的App。








jadx工具可以将dex反编译成java代码。
以上就是脱壳环境搭建与脱某60壳实战的主要内容。壳确实脱了,但是没有修复步骤,比如修改Apk中的xml、程序入口等操作。这主要是由于不同的壳,修复步骤不同
本文转载自https://blog.csdn.net/qq_41855420/article/details/106276824

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
昨天在逆向某App的时候,发现有个加密工具类中的native方法是用C语言编写的,隐藏在so文件中。某大佬推荐逆向工具unidbg,能在pc端直接调用so文件中的函数,最终成功解决了问题。
unidbg引入 逆向某App,反编译dex得到Java代码,但是有两个加密工具类中的方法放到so文件中。


方法的实现用的C语言编写的,放在了so文件中。在Java中,动态加载so文件,使用native方法的形式隐藏了方法的方法体。难道伟大的逆向工程就此放弃?这显然不符合我们技术人的性格,肯定要想方设法弄出来。
unidbg概述 unidbg 是一个基于 unicorn 的逆向工具,可以直接调用Android和iOS中的 so 文件。项目的GitHub地址为https://github.com/zhkl0228/unidbg
我使用unidbg,直接调用libbaseEncryptLib.so、libencryptLib.so中的方法,这样就不用想破脑袋去逆向so文件了。
备 注 : \color{red}备注:备注:so文件是unix系统中的动态连接库,属于二进制文件,作用相当于windows系统中的.dll文件。在Android中也可调用动态库文件(*.so),一般会将加密算法、密码等重要的方法、信息使用C语言编写,然后编译成so文件,增强了软件的安全性。
unidbg使用姿势unidbg项目 下载地址:https://github.com/zhkl0228/unidbg
unidbg项目用Java编写,并且上面下载的是一个标准的maven项目。我这里演示导入到IDEA中,如果你熟悉其它的IDE,也可以自己去弄。(顺带一提,如果你之前没接触过Java语言,要确保电脑安装好JDK、maven)

IDEA,导入解压的项目
浏览到刚刚解压好的文件夹


后面一路无脑next即可。。。



第一次导入此项目会自动下载一些jar包,和网速、maven服务器有关,耐心等待吧。
unidbg 项目中的src/test/java/com/xxxx/frameworks/core/encrypt路径中有一个TTEncrypt测试用例,直接执行其中的main方法。
控制台打印相关调用信息,说明项目导入成功。
so文件 在前面,我们不是遇到了libbaseEncryptLib.so、libencryptLib.so文件么,利用unidbg直接调用so文件中 的方法。下面演示调用libencryptLib.so文件中的getGameKey函数。
EncryptUtilsJni类1 | package cn.hestyle; |
EncryptUtilsJni类中最重要的设置为main方法中的soFilePath、classPath、methodSign三个参数,它们的作用在main方法中已经注释过了,这里再次解释一下。
soFilePath,填写你需要调用的so文件路径classPath,填写你需要调用的函数所在Java类的完整类路径。
methodSign,填写你要调用的函数签名,语法为smali。(在jadx中,直接可以看smali代码)

备 注 : \color{red}备注:备注:如果你要调用的函数还需要传入参数,直接传入myJni方法中即可,myJni方法中省略args参数就是供你传入参数。

so文件的IDA工具 IDA工具是反汇编so文件的强大工具,由于libencryptLib.so文件比较简单,并且getGameKey函数返回的是一个常量,并没有复杂的处理过程,所以可以直接查看。
首先用IDA打开libencryptLib.so文件


查看反汇编得到的代码。


unidbg确实很强大,直接在pc端模拟调用so文件,省去了反汇编逆向so文件的麻烦。上面的教程只演示了unidbg项目的导入、封装自己的调用so文件的API,其实这只是入门了,unidbg还支持断点调试so文件,也能导入到IDA中进行动态调试
本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Dex文件结构

第一代壳 Dex加密
第二代壳 Dex抽取与So加固
第三代壳 Dex动态解密与So混淆
第四代壳 arm vmp(未来)
1.用加固厂商特征:
2.基于特征的识别代码


android-unpacker https://github.com/strazzere/android-unpacker

drizzleDumper https://github.com/DrizzleRisk/drizzleDumper
升级版的android-unpacker,read和lseek64代替pread,匹配dex代替匹配odex

IDA Pro + dumpDEX**dumpDex https://github.com/CvvT/dumpDex**











gdb gcore法
1 | .gdbserver :1234 –attach pid .gdb (gdb) target remote :1234 (gdb) gcore |
coredump文件中搜索“dex.035”

Dex篇
ZjDroid http://bbs.pediy.com/showthread.php?t=190494
对付一切内存中完整的dex,包括壳与动态加载的jar


so篇
elfrebuild


构造soinfo,然后对其进行重建


针对无代码抽取且Hook dvmDexFileOpenPartial失败
Hook dexFileParse
http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp

https://github.com/WooyunDota/DumpDex

针对无代码抽取且Hook dexFileParse失败
Hook memcmp
http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp


修改安卓源码并刷机-针对无抽取代码
https://github.com/bunnyblue/DexExtractor

Hook dexfileParse


https://github.com/zyq8709/DexHunter
DexHunter的工作流程:

DexHunter的工作原理:

绕过三进程反调试
http://bbs.pediy.com/showthread.php?p=1439627


修改系统源码后:

http://www.cnblogs.com/lvcha/p/3903669.html

1 | ls /proc/345/task |

./gdbserver :1234 –attach346 … (gdb) gcore
1 |
http://bbs.pediy.com/showthread.php?t=198995
断点mmap调试,针对Hook dexFileParse无效
原理: dexopt优化时, dvmContinueOptimization()->mmap()

静态脱壳机
分析壳so逻辑并还原加密算法
http://www.cnblogs.com/2014asm/p/4924342.html

自定义linker脱so壳
https://github.com/devilogic/udog
main() -> dump_file()
1 |

ART模式下,dex2oat生成oat时,内存中的DEX是完整的
http://bbs.pediy.com/showthread.php?t=210532

Hook Dalvik_dalvik_system_DexFile_defineClassNative
枚举所有DexClassDef,对所有的class,调用dvmDefineClass进行强制加载

第N代壳so + vmp动态调试 + 人肉还原

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
当你习惯了python的便捷,在逆向安卓是碰到so库的加密分析时,除了使用ida进行函数分析之外,so库的调用也成了一个问题,尤其是遇到只有arm架构的so时,明显感觉到头疼
痛点:
优势:
痛点:
痛点:
简介: AndroidNativeEmu是基于Unicron实现的一个指令解析器, 让您能够使用python跨平台模拟安卓虚拟机环境
使用资料参考:
痛点:
unidbg(推荐)优势:
痛点:
有条件折腾的话还是选择树莓派吧
1 | /tmp/lib/jniLibs/libkey.so: libstdc++.so: cannot open shared object file: No such file or directory |
由于自身能力有限,对C语言不熟,暂时搁置, 来日再处理

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站