文章目录
逆向第一步,从frida开始! 用我自己的理解,说一下frida是干什么的。
首先,hook是什么?
在一些大神的文章中,经常会出现“hook它!”,“hook之~”,翻译成大白话就是“盘它!”,说明这个东西起着决定性、结束性的步骤。
要了解一个东西,首先要知道它的应用场景在哪里。
① 做爬虫的时候,有时会发现请求头有个加密值,例如x-sign值,这个值通常和我们的请求参数有关,当我们编写请求代码,如果不能破解x-sign值,我们发出的请求就会被对方发现,嘿呀原来你是伪造的,打回,那既然请求错误了,那爬取就自然扑街啦。这时我们的hook就可以登场啦~
② 在做①爬虫的时候,我们有时会发现,我们其实连抓包都抓不到,还构建什么请求,爬什么虫,这大概率是因为对方使用了SSL加密,刚开始用个代理服务器进行代理人攻击进行抓取,现在有很多应用都要对客户端的证书进行验证,那还伪造个屁啊,玩不下去了!这时我们的hook就又登场啦~
③ 还有一些其他逆向破解类的,都会用到hook。
说了这么多,那么hook到底是什么呢?
hook,中文翻译为“钩子”。我的理解是,无论是什么进程,还是函数,都能把它勾过来,然后“加工”一番,再扔出去(执行)。
还有一个问题,我们为什么可以hook呢?
现在应用一般分为B/S架构,C/S架构。
B/S架构,例如应用场景①中,一般我们需要x-sign加密函数会在某一个js文件中,浏览器都帮你解析好了,慢慢找就好了。
而C/S架构中,例如应用场景②中,一般我们需要认证的证书都在本地应用程序中,需要我们自己对应用程序进行反编译,然后慢慢找需要hook的地方。
一般对方也有反制措施,比如混淆文件代码等,实际上只是让我们需要hook的地方变得识别困难一些,但并不影响我们hook它。
什么是Frida?
终于到本篇的正题了,如果说hook是技术,那么Frida就是工具。技术是一个概念,而工具是最终具体的实现。
Frida是二进制动态插桩技术,我的理解就是把一段代码动态的插入程序中,但最终不会改变原有的程序,但我们通过动态的插入,可以快速简单的分析出我们想要的那段源代码。
提示:记得添加环境变量
提示:切记安装路径不要有中文
Python 3.10.6 win-amd64 下载地址:百度云下载
命令行输入:python -V
显示如下,即配置成功。
PS D:\> python -V
Python 3.10.6
pip install frida -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
提示:若一直卡在 Running setup.py install for frida … –
则下载对应版本的egg文件,egg文件列表,可自行查找。
我电脑win11 64 python3.10对应的是frida-15.2.2-py3.10-win-amd64.egg 点击下载
将egg文件放在D:\Python\Lib\site-packages下(根据自己的Python安装目录)。
在当前目录cmd,执行easy_install frida-15.2.2-py3.10-win-amd64.egg
提示:若提示easy_install 不是内部或外部命令,也不是可执行的程序
当setuptools版本>51.3.3时,就没有带easy_install,按如下方式重新安装解决。
pip uninstall setuptools
pip install -v setuptools==51.3.3 -i https://pypi.tuna.tsinghua.edu.cn/simple/
最后再执行下载任务
pip install frida -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
命令行输入:frida --version
显示如下结果,即安装成功。
PS D:\> frida --version
15.2.2
提示:该工具用于在PC端用命令行对安卓手机或模拟器进行调试。
提示:记得添加环境变量
adb工具:百度云下载
以下用逍遥模拟器演示Frida-server端。
打开一个模拟器,通过adb可查看该模拟器设备,查看连接,并查看模拟器设备型号。
PS D:\> adb devices
List of devices attached
127.0.0.1:21503 device
PS D:\> adb connect 127.0.0.1:21503
already connected to 127.0.0.1:21503
PS D:\> adb shell getprop ro.product.cpu.abi
x86_64
在官网找到对应frida版本、对应手机型号的frida-server下载,官网地址。
本次演示对应的frida-server版本为frida-server-15.2.2-android-x86_64.xz,下载地址为百度云下载。
将解压之后的文件push到设备中,指定到 /data/local/tmp 路径下重命名为 frida-server。
PS D:\> adb push C:\Users\xxx\Desktop\frida-server-15.2.2-android-x86_64 /data/local/tmp/frida-server
C:\Users\xxx\Desktop\frida-server-15.2.2-android-x86...le pushed, 0 skipped. 19.4 MB/s (99542760 bytes in 4.882s)
命令行运行android设备中的frida-server。
PS D:\> adb shell // 进入手机
VOG-AL00:/ # su // 确定手机是root权限
VOG-AL00:/ # cd /data/local/tmp // 进入到tmp目录下
VOG-AL00:/data/local/tmp # chmod 777 frida-server // 给执行权限,可读可写可执行
VOG-AL00:/data/local/tmp # ./frida-server //正式启动frida-server
提示:执行完毕后为运行状态。这个shell不能关闭,关闭了frida就停止了。
进行端口转发监听
PS D:\> adb forward tcp:27042 tcp:27042
27042
PS D:\> adb forward tcp:27043 tcp:27043
27043
27042端口用于frida-server通信的默认端口号,不转发的话客户端是连接不上服务端。
使用默认端口非常容易被检测,可以使用非标准端口来启动frida。启动frida-service的时候设置IP和端口,启动命令。
./frida-server -l 127.0.0.1:9999
之后的每个端口对应每个注入的进程,例如27043端口。
检查是否成功 执行 frida-ps -U 命令成功输出进程列表,如下所示。
PS D:\> frida-ps -U
PID Name
---- ---------------------------------
2364 android.ext.services
2403 android.process.media
1566 audioserver
1567 cameraserver
... ...

test.py
import frida
rdev = frida.get_remote_device()
front_app = rdev.get_frontmost_application()
print(front_app)
PS E:\学习\python> python .\test.py
Application(identifier="com.android.chrome", name="Chrome", pid=13770, parameters={})
基本的入门就是这样了,之后的实战,还需要一点Python知识(不会也没关系其实),一些JavaScript知识(比较重要)。
对于B/S架构的程序,更偏重于JavaScript代码的分析能力。
对于C/S架构的程序,更偏重于Java代码的分析能力。
个人认为Hook最主要的地方,是找出需要Hook的地方,找到后一切都会迎刃而解的。
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我打算为ruby脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm