- 博客(240)
- 资源 (26)
- 收藏
- 关注

原创 win32asm 自定义添加可执行代码
C版本:win32asm 自定义代码段加密解密C版本没做新增节等各种检查1. 把一段可执行代码插入进另一个程序中2.插入的代码需要自定位3.3.1如果被插入的程序有空间可以新增一个节表则加入节表,对新增节表赋值(需对齐大小), 写入需要新增代码修正:FileHeader.NumberOfSections ++, OptionalHeader.SizeOfIm...
2021-09-03 01:16:00
163

原创 win32asm int3 int1 tf WaitForDebugEvent 调试进程
需要用到的函数 :CreateProcess ,WaitForDebugEvent,ContinueDebugEvent ,WriteProcessMemory,GetThreadContext,SetThreadContext.ReadProcessMemory 一般都要用, 这里没用到WriteProcessMemory : 用来增加int 3 断点(0cch), 以及恢复旧数据的GetThreadContext: 用来获取被调试进程的线程所保存的寄存器, 这些寄存器用来恢复...
2021-05-14 04:56:47
784

原创 纯重叠io服务器模型
基础:套接字重叠io客户端: telnet 或者自己随意写一个;纯重叠实现的服务器模型,基本上就是使用OVERLAPPED和APC函数完成.APC函数即需要使用alterable状态的函数 , 例 SleepEx.另外重叠io与非阻塞是2个概念.下面的代码中使用到了非阻塞io, 仅仅作用在了accept上. 让其不阻塞;原因是如果阻塞accpet 就没法调用到Slee...
2019-01-15 17:32:18
500
1
原创 4. 权限,特权,任务说明
CPL:当前CS段的RPL, RPL:请求这个数据段的权限, DPL: 数据段的权限。从大方向说:只要权限比数据段大 ,或者相等就OK。
2023-11-29 20:57:10
198
原创 2.1 总线问题
同一时间只能有一个去控制总线,因此需要一个输出开关去确保总线不出错一旦同时开启输出开关,下面的锁存器还会被上面的数据修改如果上下同时开启可写,且同时开启可输出, 则短路
2023-11-25 23:51:44
107
原创 2.1 总线问题
同一时间只能有一个去控制总线,因此需要一个输出开关去确保总线不出错一旦同时开启输出开关,下面的锁存器还会被上面的数据修改如果上下同时开启可写,且同时开启可输出, 则短路
2023-11-25 23:49:45
87
原创 2. 寄存器
锁存器,用于存储1位的电路只有当 可写位(write enable)开启,才会把输入写到输出,同时保存输出使用锁存器带时钟的锁存器带时钟带可写控制的完整版锁存器下面的时钟使用按钮来代替, 只有按钮为1时,相连的电路才工作时钟的作用在于协同所有电路共同工作,也是一切电路自动化的源头更多关于时钟的解释在 3.1 内部数据总线与时钟 中1个8位的简易版寄存器可由8个锁存器组成
2023-11-25 23:48:41
118
原创 1.5 加减法
加减法这是一个有问题的加减法根据8位加法和8位取反可以组合成一个加减法减法相当于 加一个负数,而负数可以用取反+1的补码来表示现在的问题是如何解决+1的问题, 目前只有一个取反控制器 ?加法器中有个“首个进位控制" , 可以用来+1操作,只需要把 " 首个进位控制" 跟 取反器的“开启取反” 用同一个控制线连接即可根据下面可以看到2个数相加没问题,一旦相减,最后的进位还是存在问题, 原因在于 补码+正数 后的进位解决方式解决方案是如果没开负数,进位保持原样如果开了负数,则忽略进位
2023-11-25 23:46:03
72
原创 1.2 全加器
处理1个进位的加法根据半加器可知,结果和进位只有1种情况:要么有结果要么有进位因此全加器可由2个半加器组合而成通过一个半加器输出的结果和进位再次由另一个半加器输出2个半加器的进位通过或门输出
2023-11-25 23:38:04
120
原创 1.1 半加器
输入1输入2结果进位0000101001101101半加器: 实现1位的加法根据结果可知输入1与输入2相加结果 -> 符合 异或门进位 -> 符合 与门最终要么有结果要么有进位,不存在即有结果也有进位异或门的实现也可以由基本的3个 “与或非” 门实现与:& , 或:| , 非:! 用这3个符号表示假设输入1:x, 输入2:y可以得出真值表达式(仅有1的结果):sum = x&!y +
2023-11-25 23:36:35
144
原创 3. 内存单元
原行1 连接到 位0 , 原列1->位1,原行2->位2,原列2->位3…列1:1000010 (行4连连接到是位6, 列1连接到的是位1)由于上面一共16个地址, 因此2的4次方 => 2^4 就可以表示。行3连接到的是位4:10000, 列1连接到的是位1:10。总之,根据 行,列 对应连接的位来计算此内存单元的值。因此 行3列1 的内存单元 对应的值是:10010。下面替换的地址线,通过一个查找表来实现。列4:10010000。列4:11000000。列2:1001000。列3:1100000。
2023-11-25 23:27:55
208
原创 3.2 CPU的自动化
MOV_TO_ADDR(1010) 流程: step 0 ~ step 2一样。1.step 1,内存地址寄存器传送地址,内存缓存寄存器获取数据。4.step 4, 执行一次step 1, 传递地址获取内存数据。上述的改造还需要手动输入二进制,才能实现自动化,因此继续改造。2.step 2, 内存缓存寄存器把数据传送到指令寄存器。8.step 8, 执行MOV_TO_ADDR。5.step 5, 把数据传送到寄存器A。6.step 6, 回到step 0。7.step 7, 执行ADD。
2023-11-25 23:09:34
1481
1
原创 3.1 CPU内部结构与时钟与指令
CPU内部结构总线一些自定义部件总线图内存指令执行流程:取指令,译码,执行pc做的事内存地址寄存器内存缓存寄存器指令寄存器,译码第一步指令寄存器传递地址到内存地址寄存器指令MOV_A的过程(译码第二步)第一条指令执行完毕第三条指令的执行第四条指令第四条指令不同的执行流程整体流程内部数据总线使用到的有8位寄存器(用于输入),4位寄存器(用于内存地址,只能寻址16个内存单元[2^4]),简化版加法ALU寄存器带了时钟, 由时钟统一控制操作ALU不需要时钟, 输入端的
2023-11-25 23:00:25
1527
原创 程序加载器
仅在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
354
原创 虚表指针在哪里
虚表指针群里有人问。就写了从最简单的类开始, 后面有单继承和多继承虚表指针的不同代码在32环境下:先写结论: 虚表指针在构造函数与析构中赋值(下面反汇编证明), 赋值: *this = 虚表指针(即首个成员) 虚表指针指向的是一个数组,存放虚函数,虚函数按一般声明先后排序. 这个数组一般在 .rdata 或 .data 每个父类都会在构造,析构中设置自己的虚表,下面继承中会写 * 为什么要在构造...
2021-09-08 18:27:01
990
原创 计算函数字节长度
#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
437
原创 获取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
147
原创 提取图标 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
762
原创 查找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
460
原创 函数地址动态加载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
290
Linux高性能服务器编程
2019-07-06
libevent参考手册(中文版)
2019-07-06
libevent深入浅出
2019-07-06
Effective.C++.中文版(第3版_中文版) 完整书签
2018-11-26
Effective C++ 完整目录
2018-11-26
UNIX网络编程卷1 完整目录
2018-11-06
Python网络编程 Python网络数据采集
2018-06-09
TCP/IP网络编程[韩] 尹圣雨
2018-05-25
Wireshark网络分析的艺术
2017-10-21
Windows核心编程
2017-10-21
UNIX网络编程卷1
2017-10-21
UNIX网络编程 卷2 进程间通信
2017-10-21
Unix-Linux编程实践教程
2017-10-21
UNIX环境高级编程
2017-10-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人