C# 远过程调用地址(弥补缺陷)

今天写的这篇文章,倒不如说是弥补C# 远过程外部调用 LoadLibrary、GetModuleHandle、GetProcAddress、FreeLibrary

我这篇文章内共享代码的缺点,相信有很多道友即便拿着这个源代码

也不知道能做什么因为即便大家知道了 可以获取外部模块函数地址,

卸载、导入本地模块、但是还有很多人对Win32编程并不熟悉、当然

我们做.NET开发的、一点也不用WINAPI会有些太不正常、

当然你必须更改你的项目属性,生成、目标平台为x86,在上面提到的

文章链接中我应该已经注明、此代码只适用x86平台程序、当然如果需

要x64实现类似的功能,我建议你深读理解此代码 过儿大升华自己编写

x64平台的此类功能代码、

所以我特意编写了一个函数(CallRemoteBaseAddress),它可以令我

们在调用时更方便些、简单的说除却你需要把参数每个挨到写到目标

对象内存中外、当然有些参数并不需要 具体根据函数定义操作、如果

按照常规方式,那么会有很多人不知道如何去调用多参数的外部对象

函数,毕竟这里涉及到更庞统的Win32编程知识、

当然整个调用核心是通过AOP技术,有些.NET开发人员可能明白AOP

切面编程在.NET中的应用,但是或许仅限高阶反射Emit、但是Assembler

同样可以AOP开发、AOP只是一种开发概念,我简短说说吧、AOP切面

编程、是通过动态构建一个可执行程序集,该程序集可以是一个整体也

可以是一个单独的个体(函数)、准确的说是通过切割指令动态生成令程

序执行不同的命令组合、

通过动态切割组合指令,当然在上图中你可以清楚地看到组合的是PUSH

压入计算堆栈的命令、当然在这里压入的是DWORD PTR[EBP+?]中的内容

然而这是我在逗你们、呵呵,实际上是直接压入一个有效值可以是地址、

在Win32中一个函数参数的堆栈地址,保存在EBP(栈底指针 / 基底指标)中,

当然它同时包含局部变量的指针、ESP(栈顶指针 / 堆叠指标),一般可以通

过EBP-ESP计算出一个函数的可用堆栈大小(或可以避免堆栈内存溢出)

在Win32中默认分配1MB堆栈空间、牢记写代码别无脑定义那么多参数与局

部变量、不想你的程序死掉就好好写代码、

然后在通过汇编调用函数地址、当然至于是否有返回值与否你和我不用关心

如果具备返回值那么在EAX(累积暂存器)会被自动返回,当然如何对方函数是

无返回值类型,那么会被缺省为0、至于为什么还是去好好研究下Win32开发

吧、当然同时需要注意,由于在汇编中压入参数时是从高到低、所以参数压

入的顺序是相反的、所以在编写该函数时我在代码内部已经反向压入 所以不

需要你在调用时压入参数反向提供、

在上图中可以看到,我们先运行了一个记事本对象、然后获取到

它的进程句柄,然后在获取它的User32模块的句柄,然后在获取

到信息框的基地址,然后在远过程调用地址函数调用这个函数、

好了,当我们调用了记事本中的信息框函数、那么会返回一个值

用于判断,信息框那个按钮被单击了、在上图中你可以

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#调用 Oracle 存储过程可以使用 Oracle.DataAccess.Client 命名空间中的 OracleCommand 类。下面是一个示例代码: ```csharp // 创建 Oracle 数据库连接 OracleConnection connection = new OracleConnection("Data Source=your_datasource;User ID=your_userid;Password=your_password"); // 打开数据库连接 connection.Open(); // 创建 OracleCommand 对象,设置存储过程名称和连接对象 OracleCommand command = new OracleCommand("your_stored_procedure_name", connection); command.CommandType = CommandType.StoredProcedure; // 添加输入参数 OracleParameter inputParameter = new OracleParameter("input_parameter_name", OracleDbType.Varchar2, ParameterDirection.Input); inputParameter.Value = "your_input_parameter_value"; command.Parameters.Add(inputParameter); // 添加输出参数 OracleParameter outputParameter = new OracleParameter("output_parameter_name", OracleDbType.Varchar2, ParameterDirection.Output); command.Parameters.Add(outputParameter); // 执行存储过程 command.ExecuteNonQuery(); // 获取输出参数值 string outputValue = outputParameter.Value.ToString(); // 关闭数据库连接 connection.Close(); ``` 其中,your_datasource 是你的 Oracle 数据库连接字符串,your_userid 和 your_password 是你的数据库用户名和密码,your_stored_procedure_name 是你要调用的存储过程名称,input_parameter_name 是存储过程的输入参数名称,output_parameter_name 是存储过程的输出参数名称。执行存储过程后,可以通过 outputParameter.Value 属性获取输出参数的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值