今天写的这篇文章,倒不如说是弥补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模块的句柄,然后在获取
到信息框的基地址,然后在远过程调用地址函数调用这个函数、
好了,当我们调用了记事本中的信息框函数、那么会返回一个值
用于判断,信息框那个按钮被单击了、在上图中你可以