PE
PEPE文件格式123456789101112131415PE: IMAGE_DOS_HEADER e_lfanew(OD) DOS_STUB[176] IMAGE_NT_HEADERS; NT头 DWORD Signature //Magic Number IMAGE_FILE_HEADER; //文件头 FileHeader 描述信息 IMAGE_OPTIONAL_HEADER32 //选项头 OptionalHeader 程序加载的信息 //数据目录(表) IMAGE_DATA_DIRECTORY []//节表 描述区的映射IMAGE_SECTION_HEADER[]数据
DOS头:
12345678910111213141516171819202122typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; ...
ASM32-1 --32位环境配置
ASM32搭建基本运行环境生成依赖项:新建一个c++空项目
生成自定义项
选择masm
添加的源文件需要修改后缀为asm
同时如下修改属性
添加Irvine32链接库Irvine32 链接库提供了很多简单的输入输岀接口,添加Irvine32链接库,方便后续编程
Irvine32 链接库的文件下载地址Assembly Language for x86 Processors (asmirvine.com)
配置VS2019在项目的属性面板的Include Paths一栏输入Irvine32文件解压的路径
选择“链接器”→“常规”→“附加库目录”,输入 Irvine32文件解压的路径
同时修改链接器中输入的附加依赖项,输入“Irvine32.lib”
代码高亮插件VS2019默认没有汇编代码的语法高亮提示,安装AsmDude插件可以实现语法高亮
在VS2019中依次选择扩展->管理扩展,打开管理扩展面板
PEWork3.12--输出PE头信息
PE123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 ...
ASM16-25 --串操作指令
ASM16串操作指令
串操作指令是8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,在操作主存连续区域的数据时,特别好用、因而常用
重要掌握:MOVS STOS LODS CMPS SCAS REP
一般了解:REPZ/REPE REPNZ/REPNE
串数据类型
串操作指令的操作数是主存中连续存放的数据串(String)——即在连续的主存区域中,字节或字的序列
串操作指令的操作对象是以字(W)为单位的字串,或是以字节(B)为单位的字节串(所需要的时间相同)
串存储STOS(store string)
把AL或AX数据传送至目的地址
串读取LODS(load string)
把指定主存单元的数据传送给AL或AX
串比较CMPS(compare string)
将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系
串扫描SCAS(scan string)
将AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系
REP重复前缀指令12REP ;每执行一次串 ...
ASM16-22~24 --处理机控制类指令及位操作类指令
ASM16处理机控制类指令
这些指令在特定的情况下,必须使用
对标志位进行设置的指令
CLC STC CMC
CLD STD
CLI STI
对CPU状态进行控制的指令
NOP CS: SS: DS: ES:
LOCK HLT ESC WAIT
进位标志操作指令
设置标志位
123clc ;复位进位标志:cf=0stc ;置位进位标志:cf=1cmc ;求反进位标志:cf=~cf
方向标志操作指令
串操作指令中,需要使用
12cld ;复位方向标志:df=0std ;置位方向标志:df=1
中断标志操作指令
在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止
12cli ;复位中断标志:if=0sti ;置位中断标志:if=1
空操作指令
NOP不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期
NOP常用于程序调试
在需要预留指令空间时用NOP填充
代码空间多余时也可以用NOP填充
还可以用NOP实现软件延时
事实上,NOP和XCHG AX,AX的指令代码一样,都是90H
123 ...
对于python源码编译的exe及pyc的逆向
对于python源码编译的exe及pyc的逆向以2024SCTF中的ez_cython为例
ez_cython提供了一个python源码编译的exe
用这个exe在直接IDA中看 会发现得不到什么有效的信息 基本都是fail
需要用到三个工具
pyinstxtractor.py
任意一个Hex编辑器
uncompyle库
pyinstxtractor.py 工具的下载地址:
https://sourceforge.net/projects/pyinstallerextractor/
或
https://download.csdn.net/download/qq_63585949/86509791
Hex编辑器wxMEdit下载地址:https://wxmedit.github.io/downloads.html或
https://download.csdn.net/download/qq_63585949/86509705
uncompyle库为第三方库,可以使用pip命令安装:
1pip install uncompyle6
将pyinstxtractor.py ...
ASM16-21 --函数(补充)和中断指令
ASM16函数123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103MyStack segment stack db 256 dup(?)MyStack endsMyData segmentMY_MSG1 db "Hello World1!",0dh,0ah,'$'MY_MSG2 db "Hello World2!",0dh,0ah,'$'MyData endsMyCode2 segment call far ptr MY_SUBMY_SUB: push bp mov bp,sp ;保存栈底 mov ax,[bp+6] ...
ASM16-20 --花指令
ASM16花指令1234567891011121314151617181920212223242526MyStack segment stack db 256 dup(?)MyStack endsMyData segmentMY_MSG db "Hello World!",0dh,0ah,'$'MyData endsMyCode segmentMAIN: mov ax,MyData mov ds,ax mov es,ax jmp LABEL1 db 0b8h ;花指令LABEL1: mov dx,offset MY_MSG mov ah,09h int 21h mov ax,4c00h int 21hMyCode endsend MAIN
从B8开始下面全部的代码都会出错 但是运行的结果是不变的 只不过反汇编代码分析时会被干扰(实现代码加密)
找到花指令 写入一条机器码 从正确的地方开始分析 即可获得正确的代码
子程序重复利用代码段
12345678910111213141 ...
ASM16-19 --通讯录
ASM16通讯录处理菜单选项1234567891011cmp al,'1'jz ADD1cmp al,'2'jz DELETE1cmp al,'3'jz MODIFY1cmp al,'4'jz QUERY1cmp al,'5'jz EXIT1jmp DEFAULT1
根据用户输入的选项跳转到对应的处理代码段。如果输入无效,跳转到DEFAULT1处理。
添加联系人123mov dx, offset NEXT_LINE mov ah, 09h int 21h
然后换行
1234ADD1: ;增加联系人 mov dx,offset INPUT_NAME mov ah,09h int 21h
提示输入联系人姓名。
09h - 显示字符串
功能描述:显示从DX寄存器指向的内存地址开始的字符串,直到遇到字符串结束符号$为止。
输入:
DX:指向要显示的字符串的地址
AH:09h
输出:将字符串显示在屏幕上
123mov dx,offset NAME_BUFmo ...