asm
汇编
__xa__
.
展开
-
进入保护模式小例子
16位实模式进入32位保护模式原创 2023-03-15 01:43:15 · 177 阅读 · 0 评论 -
引导程序示例
引导程序,mbr原创 2023-03-07 20:41:30 · 164 阅读 · 0 评论 -
模拟链接器 重定位符号表
重定位符号表模拟连接器动态加载GDT模拟重定位原创 2021-12-29 15:38:50 · 345 阅读 · 0 评论 -
段界限 描述符表 32位保护模式
描述符表描述符界限段界限描述符D/B位 修改代码段原创 2021-12-12 07:18:19 · 563 阅读 · 0 评论 -
程序加载器
仅在16位上有效,给别人写的.作用:模拟如何加载一个APP实际还要检索内存空间,这里省去;读取硬盘端口 [读取硬盘这部分可直接忽略] ;0x1f0 数据端口 ;0x1f1 错误端口 ;0x1f2 设置扇区数量 ;0x1f3 ~ 0x1f6 [ 0x1f6 中只占4 bit] 共28bit ;0x1f6 高4位 1110 , 111 -> LBA, 0 -> 主盘 ;0x1f7 状态控制端口 ; 写入 0x20 -> 准备读取, ; 读取后 and 0x8原创 2021-11-09 01:48:37 · 329 阅读 · 0 评论 -
虚表指针在哪里
虚表指针群里有人问。就写了从最简单的类开始, 后面有单继承和多继承虚表指针的不同代码在32环境下:先写结论: 虚表指针在构造函数与析构中赋值(下面反汇编证明), 赋值: *this = 虚表指针(即首个成员) 虚表指针指向的是一个数组,存放虚函数,虚函数按一般声明先后排序. 这个数组一般在 .rdata 或 .data 每个父类都会在构造,析构中设置自己的虚表,下面继承中会写 * 为什么要在构造...原创 2021-09-08 18:27:01 · 929 阅读 · 0 评论 -
计算函数字节长度
#include <Windows.h>#include <stdio.h>#include <iostream>using std::cout;using std::endl;int main(){func_begin: DWORD asm_len = 0; DWORD func_len = 0; _asm { pushad begin_code: mov eax,offset end_code mov esi,offs...原创 2021-09-06 14:43:54 · 392 阅读 · 0 评论 -
win32asm 自定义添加可执行代码
C版本:win32asm 自定义代码段加密解密C版本没做新增节等各种检查1. 把一段可执行代码插入进另一个程序中2.插入的代码需要自定位3.3.1如果被插入的程序有空间可以新增一个节表则加入节表,对新增节表赋值(需对齐大小), 写入需要新增代码修正:FileHeader.NumberOfSections ++, OptionalHeader.SizeOfIm...原创 2021-09-03 01:16:00 · 139 阅读 · 0 评论 -
获取kernel32 peb
.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude msvcrt.incincludelib msvcrt.lib.databuffer db 256 dup(0).constszText db 'addr : ...原创 2021-08-18 12:38:45 · 123 阅读 · 0 评论 -
提取图标 ico 资源
待修改文件中 : 图标头后直接跟图标数据PE: 图标头跟图标数据分开放, 图标头被放在图标组(对应索引14), 图标数据放在图标资源(索引3)过程:通过图标组找到各个图标头, 根据图标头的ID再去匹配图标资源中的ID图标结构://图标头struct ICON_DIR{ WORD reserved; WORD idtype; //资源类别 . ico为1 WORD idcount; //图标数量 ICON_DIR_ENTRY dir_entry[1]; // 数...原创 2021-08-15 11:10:02 · 692 阅读 · 0 评论 -
查找kernel32.dll 基地址 stack
从[esp]获取kernel32中call 指令push的返回地址, 即应用程序返回后的地址rtlexituserthread , 有些是exitthread.拿到这个地址就拿到了kernel32空间的某个值, 模块地址64k对齐,去掉低2个字节来对齐.然后依次减64k寻找.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user...原创 2021-08-10 03:10:27 · 407 阅读 · 0 评论 -
函数地址动态加载api
C版本:GetProcAddress 实现asm:.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude msvcrt.incincludelib msvcrt.lib.codeseh_handler proc C p原创 2021-08-10 00:54:12 · 268 阅读 · 0 评论 -
查找kernel32.dll 基地址 SEH
根据SEH来找,teb.tib.exceptionlist 中最后一个EXCEPTION_REGISTRATION 异常处理函数在kernerl32 中最后一个 EXCEPTION_REGISTRATION.prev = 0ffffffffh根据这个特征找到EXCEPTION_REGISTRATION.handler , 去掉10000h, 模块都在64k边界上.386.model flat, stdcalloption casemap:noneinclude wind.原创 2021-08-09 11:27:29 · 219 阅读 · 0 评论 -
查找kernel32.dll 基地址 特征函数
从用户层高地址往下找高地址:7ffe0000h (用户层可读的最高地址,之后的地址拒绝访问)一直扫描到最后一块64k起始页面为止, 因此结束地址9999h每个pe模块都会加载在64k边界的地址上, 因此每次减64k(10000h)代码中增加了自己修复的重定位信息, 和异常处理;***** 不要运行在调试环境中 , 否则异常首先被送到debug中流程:1.每次在64k的边界上查看是否是一个pe2.如果是,则找到导出表,如果有导出表,根据名字GetProcAddres..原创 2021-08-09 06:07:04 · 434 阅读 · 0 评论 -
tls 回调
不修改aop, 用静态 tls回调在线程初始化时做一些事* 线程启动前会先初始化tls结构 , 依次调用tls回调数组1.在全局变量定义一个IMAGE_TLS_DIRECTORY 变量 模拟tls结构2.在回调部分放上自己的函数3.修改数据目录tls的位置, 指向自己的结构模拟tls 的C代码:tls回调函数跟dllentry 参数一样tls结构的第4个参数是一个回调数组, 依次调用前3个参数在这里没用 , 具体参考msdn#include <i...原创 2021-08-07 05:17:40 · 260 阅读 · 0 评论 -
GetProcAddress 实现
没用的C代码根据导出表查找函数名#define _CRT_SECURE_NO_WARNINGS#include <Windows.h>#include <iostream>using std::cout;using std::endl;void * getExportApi(DWORD base_addr ,const char * api_name) { if (0 == base_addr || 0 == api_name) return 0;原创 2021-07-29 02:24:14 · 337 阅读 · 0 评论 -
win32asm 自定义代码段加密解密
没有做各种错误处理和异常处理,以及如果失败需要还原属性一个简单的例子1.新增一个节用于解密代码段, 写入解密字节码,用于还原代码段2.找到入口所在的代码段,加密3.修改入口点指向新增节,修改.text属性加上可写执行流程, 新节->解密还原代码段->跳转代码段使用的exe是:win32asm 自定义PE头解密汇编:00405000 > 60 pushad00405001 BE 00104000 mov esi原创 2021-07-20 19:26:17 · 229 阅读 · 0 评论 -
win32asm 新增节 对齐内存 对齐文件
没用的c代码#define _CRT_SECURE_NO_WARNINGS#include <Windows.h>#include <iostream>using std::cout;using std::endl;//用来对齐内存DWORD calc_mem_section_size(void * mem,DWORD raw_size) { IMAGE_DOS_HEADER * dos = (IMAGE_DOS_HEADER*)mem; IMAGE_N..原创 2021-07-20 08:00:41 · 145 阅读 · 0 评论 -
win32asm 自定义PE头
3个节, .text, .data , .rdata(导入表)为了方便 ,长度均0x1000 , 对齐都0x1000.text rva 0x1000.data rva 0x2000.rdata rva 0x3000 - 导入表(或者.idata , 随意)BaseOfCode 0x1000BaseOfData 0x2000entrypoint 0x1000imagebase 0x400000sizeofImage 0x4000sizeofheaders 0x100..原创 2021-07-14 02:43:50 · 135 阅读 · 0 评论 -
win32asm 重定位表
没用的代码C版本:char szRelocMsg[] = "\n重定位表所处的节:%s , rva:%08X, foa:%08X\n";char szRelocOneBlock[] = "\n重定位基地址: %08X\n重定位项数量: %d\n需要重定位的地址列表:\n";char szRelocHighLow[] = "修正:%08X";char szRelocNone[] = "对齐使用:%08X";IMAGE_SECTION_HEADER * find原创 2021-07-06 18:27:30 · 77 阅读 · 0 评论 -
win32 资源表
没用的代码;C:#include <Windows.h>#include <iostream>using std::cout;using std::endl;const DWORD HIGH_BIT = 1 << 31;const DWORD EXCEPT_HIGH_BIT = 0x7fffffff;char szMsgRes[] = "资源所处的节:%s , rva:%08X , foa:%08X,资源首地址:%08X\n";char szM原创 2021-06-30 23:32:27 · 130 阅读 · 0 评论 -
win32asm 导出表
没用的测试代码C版:#include "stdafx.h"#include <Windows.h>#include <stdio.h>#include <iostream>using std::endl;using std::cout;char szMagExport[] = "导出表所处的节:%s ,rva:%08X, foa:%08X\n原始文件名 %s\nnBase %08X\nNu..原创 2021-06-25 16:46:48 · 143 阅读 · 0 评论 -
win32asm导入表
非IAT , 没用的代码,反编译用.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude msvcrt.incincludelib msvcrt.lib.const szFilePath db 'C:\\code\\win32原创 2021-06-12 20:36:04 · 124 阅读 · 0 评论 -
win32asm seh构建try catch
seh 模拟try catchfs:[0] 为当前线程tib.exceptionlist.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude Advapi32.incincludelib Advapi32.libinc...原创 2021-05-21 06:49:56 · 102 阅读 · 0 评论 -
win32asm int3 int1 tf WaitForDebugEvent 调试进程
需要用到的函数 :CreateProcess ,WaitForDebugEvent,ContinueDebugEvent ,WriteProcessMemory,GetThreadContext,SetThreadContext.ReadProcessMemory 一般都要用, 这里没用到WriteProcessMemory : 用来增加int 3 断点(0cch), 以及恢复旧数据的GetThreadContext: 用来获取被调试进程的线程所保存的寄存器, 这些寄存器用来恢复...原创 2021-05-14 04:56:47 · 703 阅读 · 0 评论 -
win32asm 控制台换行 crt_printf
不论在.data .const 中的字符串无法表示 转义字符 \r\n 用 0dh 0ah 替换.data szFormat db 'eip=%x',0dh,0ah,0.codewrite_to_console proc szFormat:ptr byte,ip:dword invoke crt_printf , szFormat, ip retwrite_to_console endpmain proc invoke AllocConsole ...原创 2021-05-14 01:38:26 · 378 阅读 · 0 评论 -
win32asm 全局钩子
反编译用.data? 设置成共享段, 否则触发写时复制在vs 链接器的命令行中加入/section:.bss,S .dll 模块hookdll.asm.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.lib...原创 2021-05-10 00:38:42 · 169 阅读 · 0 评论 -
win32asm 搜索文件
反编译用目录只支持'/'.386.model flat, stdcalloption casemap:noneinclude windows.incinclude gdi32.incincludelib gdi32.libinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude comdlg32.incincludelib ...原创 2021-05-06 02:11:22 · 155 阅读 · 0 评论 -
win32asm 文本转换
反编译用.386.model flat, stdcalloption casemap:noneinclude windows.incinclude gdi32.incincludelib gdi32.libinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude comdlg32.incincludelib comdlg32.lib;对话...原创 2021-05-01 01:33:32 · 133 阅读 · 1 评论 -
masm汇编 assume 伪指令
群里很多人都在问 assume ds:xxxxx , ss:xxxx 这些指令有啥用就是用来跟 数据标号 结合使用的. 主要是为了确定数据标号的段地址将使用哪个段寄存器数据标号就是没有冒号的标号数据标号:;一般的地址标号,后面有冒号start:;数据标号, 后面不跟冒号,一般用在数据段中data_segment segments first_block db 10 dup(0) second_block dw 10 dup(0)data_segment e原创 2021-04-11 21:53:29 · 957 阅读 · 1 评论