[汇编]学习笔记

//不知不觉2017了,看着博客发布日期是2016-07-15.

相关文档


汇编指令基础

DIV

div有毒,除数是8位,被除数就得是16位。被除数是16位,除数就得是32位。

div word/byte ptr [ax]

8位情况下,al存商,ah存余数。16位情况下ax存商,dx,存余数。

dw,db,dd

等于开辟内存,dw是开辟4位,称呼为1字。db是2位,称呼为1字节。dd为8位,顾名思义,双字。
db 1 = 01 , dw 1 = 0001 , dd 1 = 00000001

各个寄存器作用

  1. cs,都名思意,Codesegment
  2. ds,也是很容易理解,数据段寄存器
  3. ss,栈寄存器
  4. 通用寄存器有好多,ax,bx,cx,dx,si,di,其中,ax,bx,cx,dx可以分为两个8位寄存器位[]h(igh)高位和[]l(ow),储存八位数据
  5. bp,和ss联用,BP为基址指针,作为校准使用,一般用途是[sp+bp]( 其实是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等。
  6. ip,和cs联用,指向下一步执行代码段的地址
  7. sp,和ss联用,一直指向栈顶的指针,pop为sp+=2,push为sp-=2,ss为空时sp指向0,如果push或者pop过多会溢出或者越位,危险!
  8. ES,附加段寄存器,和di寄存器相关联使用,一般是es:di

寻址方式

debug下可以直接[idata],但是在MASM下会忽略[],直接传送数字去了,而不是指向地址的值,[ 0 ]除外。想要那样寻址,一般可以使用 ds : [偏移地址]

jmp

  • jmp short 标号 : 段内短转移,对IP的范围为(-128~127)
    ,并不是通过段:偏移地址来跳转,而是计算目前这条语句到跳转语句的偏移地址来跳转,所以说CPU并不会知道要跳转的地址,而是只知道距离要跳转的地址有多少个字节来跳转
  • jmp near ptr : 段内近转移,范围(-32769~32767),16位位移
  • jmp far ptr : 会连CS:IP一起修改

jcxz,loop

条件转移 jcxz 标号,有条件转移,只有在CX为0时才会转移。当CX!=0时,程序将继续执行下面的指令。这样看来的话,loop指令其实也是一个条件转移指令,每次loop,cx递减1,直到cx为0时跳出循环。注:标号均为8位,范围为-128~127

ret,retf

ret是跳转前的指令,把IP压入读出栈,之后sp-=2,相当于POP IP
retf同等,之不过多了CS,差不多等于POP CS;SP-=2,POP IP;SP-=2

Call指令

Call 标号 ,把当前IP,push入栈之后,跳转到标号地址执行
执行过程为:sp-=2;((ss)x16)+sp = IP#把IP压入栈;IP=IP+16位位移
因为跳转是计算位移而不是更具物理地址跳转,所以16位位移地址 = 标号地址 - call指令之后的第一个地址
因为是16位,所以范围是-32768~32767

标志寄存器

  • ZF 判断结果是否为0,执行结果为0,则ZF为1,反之
  • PF 判断奇偶,偶数为1,基数为0
  • SF 符号寄存器,判断是否带符号。
  • CF 进位或者结尾标志,debug中,NC为没进位,CY为进位,对于无符号数来说才会存在
  • OF 溢出标志位,对于有符号数来说才会存在
  • DF 方向标志位,DF=0,si di都会递减,DF=1,si di都会递增
  • TF 用来检测单步中断,如果TF=1则产生中断

ADC,SBB指令

  • adc,才不是射手呢(doge)带进位加法指令,adc ax,bx 相当于 ax = ax + bx +CF
  • SBB,有加法当然就有减法,带进位减法指令

cmp指令

对比指令,cmp a,b == a-b,只不过不记录结果
这时候我们可以看ZF位就可以进行对比,PF可以判断奇偶,看CF来判断两个大小,但是还要关注SF和OF来判断是否有溢出/进位

检测比较结果的转移指令

  • je,等于则转移 ZF=1
  • jne,不等则转移 ZF=0
  • jb,低于则转移 CF=1
  • jnb,不低于则转移 CF=0
  • ja, 高于则转移 CF=0 ZF=0
  • jna, 不高于则转移 CF=1 或ZF=1

movsb,movsw

功能是将ds:si中的内存单元指向es:di中然后更具DF进行sidi的递增或者递减
(果然我们计算机中的数据都是sb么2333
传送一个字就是movsw,区别就是每次递增或者递减sidi+-=2
可以配合rep指令使用,rep是更具CX重复执行指令

cld,std

有了上面那些,当然要对DF进行操作啦,然而肯定不能用ADD的说。所以就有了cld和std
cld 让DF=0,std让DF=1

CPU调用中断指令

也相当于执行N号中断

  1. 取中断类型码N
  2. push IF,TF
  3. push CS,IP
  4. IP=N4 CS=N4+2

lea

lea指令,格式:lea 目的寄存器,源操作数
作用:将源操作数的地址偏移量保存到目的寄存器中。学习lea指令可以和mov指令一起来记,他们格式相同,但mov指令是将操作数指向的内存中的数据保存到目的寄存器。

函数调用方式

//作用范围为VC++

  1. 首先是在上层函数,在调用函数之前,会先把参数从左到右push进栈
  2. 然后执行call函数,其中call函数又会隐藏触发一个压栈操作,会把IP压入栈
  3. 然后到了被调用函数,会先push ebp,把主函数的ebp保存
  4. 之后mov ebp,esp 更新EBP寄存器的值,更新完成后,被调用函数即可以使用EBP定位它的函数参数和局部变量
  5. 之后esp-00C,创建一片内存空间来保存函数状态
  6. 之后保存上层函数的ebx,esi,edi
  7. 之后在附加段寄存器创建一片空间(创建方式是为ECX赋值然后用rep stos循环写入
  8. 之后开始函数操作
  9. return操作其实是把值传给eax
  10. pop edi,esi,ebx
  11. mov esp,ebp 调整栈顶指针,使esp指向保存有main函数EBP的地址处,为恢复main函数ebp做准备
  12. pop ebp 正式恢复main函数的ebp
  13. ret 会触发一次栈出操作,会把最开始Call压入的IP弹出,然后程序开始执行IP所指向的地址
Tags: 学习笔记

python-IAT HOOK

难的不是HOOK,而是各种类型的转换。
先占坑。考完试再填。如果你们发现这个文章消失了的话估计就是弃坑了HHHH


2017/7/15
终于填完了,贼难受。头晕晕的,使用方式如图
IAT HOOK:
TIM截图20170714170055.png
LOAD IAT:
TIM截图20170714170432.png
代码在这里iat.rar

Tags: iat, hook

基于免杀马的永久防上报的实现以及工具

首发于 http://mapers.net/t/topic/328

两年前的一个点子,今天正好有时间。

前提:
你得马得免杀,而且我的工具是花几分钟随手写的,可能不靠谱。
其中增大文件我用的是在文件尾部增加空白数据,我记得这会被360给提示的,如果不想提示就自己写个添加随机数据的吧。反正winrar也能压缩

原理:
原理很简单,说出来可能会被笑。就是利用winrar的压缩+自解压把扩大体积后的免杀木马文件给怼成一个压缩包,因为被压缩了所以体积很小,再加上设置了密码所以即使被上报了360的云也无法自动检测出什么来。然后把压缩包追加到一个解压的壳后面又壳释放运行/
缺点:
虽然壳体积才6kb,但是加上winrar.exe体积就大了,至少300kb,所以你的文件最终体积可能是 你的木马体积+6kb壳的体积+200+winrar.exe体积,300+kb体积可是非常大的,可能某些条件下很难接受
怕手工分析,手工分析立刻翻水水。

P.S : 我只考虑防上报,免杀和过主防不在此考虑范围。壳是随便写的,所以压缩包内木马文件名称得是server.exe,不然无法启动木马,并且压缩包密码只支持coinkboom(逃

下面正式开始,首先,先找到我们的免杀马(好早之前写的,貌似不过主防),增大体积,并且给测试查杀
ed3bade92bb229aad997f654f31d9e489a018d35_1_690x410.png
然后打包为压缩文件并添加密码2.png
最后体积只有121kb,hhhhhhh
3.png
最后拉出我们的壳:
4.png
惨不忍睹啊惨不忍睹,壳本身6kb,加上rar.exe瞬间这么大了。有机会我写一个把rar.exe弄成远程下载的把。
最后利用cp把两个文件合并,得到最终的木马文件。
5.png
最后丢到虚拟机执行并且开启上报,成功执行木马。
6.png
查看上报区,空空如也7.png

毕竟40mb的东西也不好上报。
基本就这样啦。

壳在这里:链接: http://pan.baidu.com/s/1qXZh9zI 密码: wt92

就是这样辣,一个没啥用的小玩意_(:з)∠)_

Tags: 免杀

ffmpeg-rtmp搞事指南

因为有一台闲置的PI,加上直播浪潮,准备自己弄个无人点播的电台
收集了一些资料

  1. 使用FFmpeg在B站直播的姿势
  2. ffmpeg处理RTMP流媒体的命令大全
  3. ffmpeg 将1张图片和1个MP3音频文件转为MP4
  4. 利用 FFmpeg 将 MP4 转成 FLV
  5. PYTHON合并flv

预想效果:
收到点播弹幕->从网易云下载mp3文件和专辑图->合成mp4->转换为flv->合并到推送的主flv文件->推送到直播地址

希望合并到推送的主flv文件这里不会出错。

各种协议好神奇啊,可惜我只是高中生,不是大学生。不能花太多时间研究这些协议。QAQ

顺便求推荐一款语法爽快不冗杂的强类型的语言呀qwq。java和C#的语法。。。好。。长QAQ,记不下来,IDE带不动


2017/5/25

ffmpeg使用失败,太难用了,出现了几个问题

  • 没办法同时转码同时推流
  • 推流会出现间隔,没办法无间断播放
  • 十分不稳定

所以,打算,自己开始怼rtmp协议。
犹豫用golang还是py。golang的话在Pi上运行和编译略麻烦,Py的话感觉实现rtmp协议有点。。。不稳。
先收集资料

嗯,开怼。
(突然记起来,博客的点击查看大图还没写,应该就一个js绑定img标签被单机的时候弹出一个div里面放着一张大图的herf跳转应该就行了吧XD

Tags: ffmpeg, rtmp, 直播

瞎JB乱写的一个PY-BLOG

下载地址:SuperrrrrrrrrrrrrrrrrrMiniBlog.rar
看到天台用PY写了个博客,我自己也手痒,弄了一个
不使用数据库,用文件管理,排序也用系统日期,十分节能,使用markdown语法包,直接转换,没写后台,就写了一个写文章的页面,不过要求输入密码hhhhhhh所以管理员只有一个。自己用用十分适合。
样式是扒别人的QQ截图20170102220516.jpg
hhhhh毫无技术含量。

Tags: none

【易语言】随手瞎JB写的一些东西

<center>QQ截图20161203230540.jpg</center>
如图所示,和朋友想做一个BILIBILI-TOOLS,结果哪个魂断前端万年托坑2333我就只好把源码丢出来了。
只有几个小功能,视频下载和首页热门还有直播录制
可以考虑自己加直播间挂机和自动投币等等等等功能,我懒得加了。
因为某些原因视频下载我用的不是官方API,是第三方的,如果要官方API可以考虑去Bilibili Community Programming Union - BCPU查看API
下载地址:BilibiliTools.e
其中去文本中间内容那个模块是我随手自己写的一个取两个字符串中间内容的模块,你们自己随便写个子程序就行了_(:з)∠)_

Tags: 易语言, bilibili

开坑!没有翻译功能的VNR!(大雾

<center>程序框架</center>

程序框架如图,原本打算做个galgame的启动器
因为我的桌面干净整洁,但是硬盘里面却一团狼藉。导致下了游戏好久之后才突然记起来。

啊!原来我还有这一款游戏!!

然后,蛋疼的用Python写,Python!写!没错,蛋疼的PY,不是可视化,并且还是第一次用Wxpython。简直要哭了。
之后就写成了上面那样。。之后我就在思考。。就这样满足了吗?
随手看到VNR的主页面,惊了,竟然也是Python写的。别人写的那么牛逼,为啥我不行。
然后四处问了问,就有了如下几个计划

  1. BGM/CG提取
  2. 存档管理
  3. 一系列全自动签到
  4. 报时
  5. 任务计划提醒
  6. B站助手(包含提醒,下载,等等功能
  7. 待续....

没错,并不打算做galgame管理助手了,而是
全 方 位 管 理 助 手 !
感觉又是天坑hhhhhh
目前已经实现的

  1. 游戏添加与删除
  2. 托盘事件
    于是。。就是这么多啦(不是什么都没完成吗魂断!
Tags: python, galgame

[闲着没事做]管理员登陆报警器

查MSDN看到的,因为偷懒就不用ctypes了

from Tkinter import *
from ctypes import *
wtsapi = windll('wtsapi32.dll')
user32 = windll('user32.dll')
m_hPrevPorc = 0
hWnd = 0
class App(Frame):
    def __init__(self,master):
        global hWnd
        Frame.__init__(self,master=master)
        self.master.title("BakaBka")
        self.top = self.winfo_toplevel()
        self.master=master
        self.files=[]
        self.master.geometry('%dx%d+%d+%d' % (400,200,50,50))
        self.hwnd = eval(self.master.wm_frame())
        hWnd = self.hwnd
        global m_hPrevPorc
        m_hPrevPorc = user32.SetWindowLongA(self.hwnd,-4,id(WindowProc())) #-4 == #GWL_WNDPROC
        wtsapi.WTSRegisterSessionNotification(self.hwnd,1)##NOTIFY_FOR_ALL_SESSIONS
def WindowProc(hWnd,wMsg,wParam,lParam):
    if(wMsg == 689): #WM_WTSSESSION_CHANGE
        global m_hPrevPorc
        if(wParam == 1):#WTS_CONSOLE_CONNECT
            pass#Command login
        if (wParam == 3):#WTS_REMOTE_CONNECT
            pass#SomeBodyConnect
        if(wParam == 5):#WTS_SESSION_LOGON
            pass#User Login
        if(wParam == 7):#WTS_SESSION_LOCK
            pass#Computer Locking
        if(wParam == 8):#WTS_SESSION_UNLOCK
            pass#Computer unlock
        return(user32.CallWindowProcA(m_hPrevPorc,hWnd,wMsg,wParam,lParam))

if __name__=='__main__':
    root=Tk()
    app=App(root)
    #Entry(root).pack()
    app.mainloop()

明天就得关山里了。27号才放出来。

之后就是新的学期,第二年了,不能像第一年一样了。

然而打算立个计划表,感觉目前没有什么特别想实现的东西。

现在一次一次感觉到了,最可怕的东西不是你不会。而是没有东西能让你提起兴趣去研究。没东西研究所以不能提升自己的技术。

打算复习下世界上最好的语言,接触的比PY早但是用的却比PY少,可能是因为是世界上最好的语言的缘故吧(笑

还有这个代码高亮的bug必须解决一下了,这个玩意因为pjax的缘故一翻页就不会高亮了

Tags: python