ahu.me
域名年龄: 14年3个月26天HTTP/1.1 301 永久重定向 服务器:nginx/1.1.19 访问时间:2016年03月03日 11:37:47 类型:text/html; charset=UTF-8 Transfer-Encoding: chunked 连接:keep-alive 语言环境:PHP/5.3.10-1ubuntu3.5 X-Pingback: http://www.ahu.me/xmlrpc.php 目标网址:http://www.ahu.me/ HTTP/1.1 200 OK 服务器:nginx/1.1.19 访问时间:2016年03月03日 11:37:47 类型:text/html; charset=UTF-8 Transfer-Encoding: chunked 连接:keep-alive 语言环境:PHP/5.3.10-1ubuntu3.5 X-Pingback: http://www.ahu.me/xmlrpc.php Content-Encoding: gzip 网站编码:UTF-8
老虎的日记我就是阿虎么!跳至内容RSS关于留言本关于留言本Python进程实时注入2015-05-22 • python • 评论关闭在调试 Python 程序的时候,一般我们只能通过以下几种方式进行调试:程序中已经有的日志在代码中插入 import pdb; pdb.set_trace()但是以上的方法也有不方便的地方, 比如对于已经在运行中的程序, 就不可能停止程序后加入 调试代码和增加新的日志.从 JAVA 的 BTrace(https://kenai.com/projects/btrace) 项目得到灵感,尝试对正在运行的 Python 进程插入代码,在程序运行到指定的函数后,自动连接远程主机进行调试首先介绍三个开源的项目, 本实验需要用到这三个项目Pyasite https://github.com/lmacken/pyrasite Tools for injecting code into running Python processesByteplay https://github.com/serprex/byteplay 一个字节码维护项目,类似 java的asm/cglibRpdb-Shell https://github.com/alex8224/Rpdb-Shell待注入的代码, 用官方的 tornado hello demo 做例子import tornado.ioloopimport tornado.webimport osclass MainHandler(tornado.web.RequestHandler):def get(self): self.write("Hello, world") application = tornado.web.Application([(r"/", MainHandler),])if __name__ == "__main__":application.listen(8888)print(os.getpid())tornado.ioloop.IOLoop.instance().start()注入以下代码(testinject.py)到 get 中import sysimport disimport inspectfrom byteplay import *def wearedcode(fcode):c = Code.from_code(fcode)if c.code[1] == (LOAD_CONST, 'injected'):return fcodec.code[1:1] = [(LOAD_CONST, injected'), (STORE_FAST, 'name'),(LOAD_FAST, 'name'), (PRINT_ITEM, None), (PRINT_NEWLINE, None),(LOAD_CONST, -1), (LOAD_CONST, None), (IMPORT_NAME, 'rpdb'), (STORE_FAST, 'rpdb'), (LOAD_FAST, 'rpdb'), (LOAD_ATTR, 'trace_to_remote'), (LOAD_CONST, '192.168.1.1'), (CALL_FUNCTION, 1),(POP_TOP, None)] return c.to_code()def trace(frame, event, arg):if event != 'call':returnco = frame.f_codefunc_name = co.co_nameif func_name == "write":returnif func_name == "get":import tornado.webargs = inspect.getargvalues(frame)if 'self' in args.locals:if isinstance(args.locals['self'], tornado.web.RequestHandler):getmethod = args.locals['self'].getcode = getmethod.__func__.__code__getmethod.__func__.__code__ = wearedcode(code)returnsys.settrace(trace)环境ubuntu 14.04 64bit LTSPython 2.7.6步骤在机器上安装上面需要用到的三个项目python server.py在 192.168.1.1 执行 nc -l 4444pyrasite $(ps aux |grep server.py |grep -v grep|awk ‘{print $2}’) testinject.py执行 curl http://localhost:8000 两次, 在第二次请求时替换的 bytecode 才会生效结果在执行上面的步骤后, 在执行第二次 curl http://127.0.0.1:8000 后, 应该能够看到控制台输入 injected 的字样,并且 nc -l 4444 监听的终端会出现 (pdb)> 的字样, 这样就能够对正在运行中的程序进行调试了.原理**Pyasite** 可以注入代码到运行中的 Python 进程,它利用了 Python 的 PyRun_SimpleString 这个API插入代码, 至于进程注入应该是使用了 ptraceByteplay 是一个可以维护 Python bytecode的工具, 这部分跟 cglib/asm类似**Pyasite** 只能把代码注入到进程中并运行,不能定位到具体的函数并注入 bytecode, 在 testinject.py 中结合 Byteplay 完成了函数定位和替换 get 函数字节码的功能.函数的定位用到了 sys.settrace 这个API,他提供了以下事件,在合适的时机调用用户提供的函数, 具体可以参考https://docs.python.org/2/library/sys.html#sys.settrace 的解释理论上可以插入任意字节码到程序中的任意位置, 实现对现有进程中代码的任意修改.继续阅读 »GIT与SVN协同使用2014-09-26 • GIT • 评论关闭一.git-svn初始化git svn init SVN地址-s 参数是表面使用的是svn标准命名方法,即 trunk,tags,branches,这个参数有时很重要,建议使用,命 令后面还可以加个文件夹名字作为c
© 2010 - 2020 网站综合信息查询 同IP网站查询 相关类似网站查询 网站备案查询网站地图 最新查询 最近更新 优秀网站 热门网站 全部网站 同IP查询 备案查询
2025-08-12 21:36, Process in 0.0063 second.