自定义实现无模块

      时下的各种流行的注入大都需要在目标进程中装载一个DLL,多个模块会引起很多麻烦。虽然可以采取各种手法隐藏之,但隐藏终归不是很好,不能做到很彻底。稍微拉风点的就是直接操作内核对象,将模块从以加载模块列表中移除。但这个连XueTr哥哥就能轻易发现。本文讨论在ring3下如何实现无模块。该技术可以妥妥的应用于ring0。

      无模块也有不少哥哥玩过,比如比较不错的一篇文章http://www.codeproject.com/KB/threads/processinject.aspx。里面描述的方法是将整个PE镜像写入目标进程,然后手工实现重定位修正,也不是很复杂。这里采用另外一种方法,编写一种无需重定位的代码,使之在内存中随意浮动,也可正常运行。

      首先大致描述一下什么是重定位,代码编译成PE文件后,代码里对全局变量的引用,是直接用的地址。这个地址是采用的PE文件的建议装入地址为准的比如有全局变量 int a; 在某个函数中对a赋值的可能语句a=0;对应的汇编为mov [0x10001000],0。这里0x10001000即为a的地址。如果该段代码没有装入建议地址,0x10001000表示的内存,可能就不在该DLL之中,程序必然出错。为此,在生成DLL时,大都会有一个重定位段,包含那部分代码需要重定位修正。比如实际装载地址和建议装载地址的差为X,则在每处需要修正的地方都加上该偏移。以保证代码的正确性。就a的例子来说,会将程序修正成mov [0x10001000+X],0

        这里描述的自定位技术,是代码运行过程中,自动计算装入偏移,自动修正。其精髓为几句汇编代码:

运用的是call指令会将之后的返回地址压栈。故在pop eax后,eax里存放的是LABLE的实际地址。 mov ebx, offset LABLE执行后,ebx里存放的是LABLE的建议装入地址。两者做差,便得到了偏移值。在以后引用全局变量时,只需加上此偏移即可。但这样的代码很难写成C语言,还会限制一个寄存器必须存储该偏移值。为了能拓展到C语言,我们可以定义与全局变量对应的局部变量,统一修正后存入局部变量,然后只用局部变量即可。为此,定义几个宏方便使用:

 

AUTOALLOCWITHOUTACCESS 将全局变量Source的地址 存入Des中。AUTOALLOCWITHACCESS将全局变量Source的内容存入Des中。

下面给出一个示例函数玩:

 其中

#define AUTOALLOCFUNC(FuncName) AUTOALLOCWITHACCESS(My##FuncName,g_##FuncName)

#define ALLOCINMYSEG __declspec(allocate("MySeg"))

typedef HMODULE (WINAPI *LOADLIBRARYA)(LPCSTR);

 

#pragma code_seg("MySeg")
ALLOCINMYSEG
LOADLIBRARYA g_LoadLibraryA;

 

其它没给出定义的变量类似。ALLOCINMYSEG 以及#pragma code_seg("MySeg") 是为了将所用代码 变量置于一个段中,需要时把该段写入目标进程即可。这里有个小tips

1.. 导入表以及导入函数的可能存在的包装函数分别位于不同的段中,故不可直接使用导入函数。要用LOADLIBRARYA g_LoadLibraryA;来定义自己的导入表。

2.. 鉴于进程创建时ntdll.dll和kernel32.dll装载地址必定同一,故可放心的在程序中使用ntdll.dll和kernel32.dll中的函数。但要注意g_LoadLibraryA必须初始化,只需g_LoadLibraryA = LoadLibraryA;

3.. 不能用__try 保护,这样会导致生产的代码使用.text段中的保护函数。其实那个做清理工作的switch结构,放在__finally块中更合适的。一定不要break,令代码看着很亲切,眉清目秀的。

4..关闭VS给你带的什么堆栈保护了,变量检查了。这要设置如下图 啊,好可惜 不让上传

5..函数也是全局变量,但函数的调用,是通过偏移来实现的,故不需要修正。但是当引用函数地址进行某些操作时,函数也需要重定位

 

最后再给个函数例子吧

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 PyTorch 中,我们可以通过继承 `nn.Module` 类来实现自定义模块。下面是一个简单的例子,展示了如何实现一个简单的全连接层模块。 ```python import torch.nn as nn class MyLinear(nn.Module): def __init__(self, input_size, output_size): super(MyLinear, self).__init__() self.weight = nn.Parameter(torch.Tensor(output_size, input_size)) self.bias = nn.Parameter(torch.Tensor(output_size)) nn.init.xavier_uniform_(self.weight) nn.init.zeros_(self.bias) def forward(self, x): x = x.view(x.size(0), -1) # 将输入数据展平,以适应全连接层 out = torch.mm(x, self.weight.t()) + self.bias return out ``` 在上述代码中,我们定义了一个名为 `MyLinear` 的自定义模块,该模块继承自 `nn.Module` 类。我们在 `__init__` 方法中定义了模块的参数,包括权重和偏置,这些参数都是 `nn.Parameter` 类型,它们会自动被注册到模型参数列表中。我们还使用 `nn.init` 模块中的函数来初始化权重和偏置。在 `forward` 方法中,我们对输入数据进行展平操作,并使用 `torch.mm` 函数进行矩阵乘法运算,最后加上偏置即可。 使用自定义模块和内置模块的方式是一致的。例如,我们可以这样使用上述定义的自定义全连接层模块: ```python import torch # 创建一个 MyLinear 实例 linear = MyLinear(784, 10) # 随机生成一个大小为 (1, 784) 的张量 x = torch.randn(1, 784) # 使用自定义模块进行前向计算 out = linear(x) print(out.size()) # 输出:torch.Size([1, 10]) ``` 这里我们创建了一个输入大小为 784,输出大小为 10 的全连接层模块,并对一个大小为 (1, 784) 的随机输入数据进行前向计算,得到了大小为 (1, 10) 的输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值