用VC写Assembly代码(5) --函数调用(一)

VC9 32位运行库完整安装指南:解决DLL缺失与系统兼容性问题 动态链接库(DLL)是Windows系统中实现代码共享的核心机制,程序通过动态链接调用共享库函数以减小体积。然而,DLL版本冲突曾导致著名的“DLL地狱”问题。微软引入Side-by-Side Assembly技术,通过清单文件和WinSxS目录实现多版本库共存,从而解决了这一难题。Visual C++运行库作为典型的SxS程序集,为C++程序提供必要的运行时支持。其中,VC9(Visual C++ 2008)运行库因其稳定的ABI接口,至今仍是许多老旧系统和行业软件(如工控软件、经典游戏)的必备组件。在W 阅读详情

用C写一个加载msvcrt.dll的方法如下:

#include <windows.h>
#include <stdio.h>

void main()
{
  char *msvcrt = "msvcrt.dll";
  HINSTANCE h = LoadLibrary(msvcrt);
}

反汇编得到的代码是:

5:    #include <windows.h>
6:    #include <stdio.h>
7:
8:    void main()
9:    {
0040B4B0 55                   push        ebp
0040B4B1 8B EC                mov         ebp,esp
0040B4B3 83 EC 48             sub         esp,48h
0040B4B6 53                   push        ebx
0040B4B7 56                   push        esi
0040B4B8 57                   push        edi
0040B4B9 8D 7D B8             lea         edi,[ebp-48h]
0040B4BC B9 12 00 00 00       mov         ecx,12h
0040B4C1 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
0040B4C6 F3 AB                rep stos    dword ptr [edi]
10:       char *msvcrt = "msvcrt.dll";
0040B4C8 C7 45 FC 1C F0 41 00 mov         dword ptr [ebp-4],offset string "msvcrt.dll" (0041f01c)
11:       HINSTANCE h = LoadLibrary(msvcrt);
0040B4CF 8B F4                mov         esi,esp
0040B4D1 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040B4D4 50                   push        eax
0040B4D5 FF 15 38 41 42 00    call        dword ptr [__imp__LoadLibraryA@4 (00424138)]
0040B4DB 3B F4                cmp         esi,esp
0040B4DD E8 8E 5B FF FF       call        __chkesp (00401070)
0040B4E2 89 45 F8             mov         dword ptr [ebp-8],eax
12:   }
0040B4E5 5F                   pop         edi
0040B4E6 5E                   pop         esi
0040B4E7 5B                   pop         ebx
0040B4E8 83 C4 48             add         esp,48h
0040B4EB 3B EC                cmp         ebp,esp
0040B4ED E8 7E 5B FF FF       call        __chkesp (00401070)
0040B4F2 8B E5                mov         esp,ebp
0040B4F4 5D                   pop         ebp
0040B4F5 C3                   ret


我觉得
call        dword ptr [__imp__LoadLibraryA@4 (00424138)]
非常奇怪,是什么意思呢??

然后我写了个C中汇编程序:

#include <windows.h>
#include <stdio.h>

void main()
{
  char *msvcrt = "msvcrt.dll";
  __asm
  {
    mov ebp, esp
    mov eax, msvcrt
    push eax
    call LoadLibrary
    mov esp, ebp
  }
}

结果出错,然后在
call LoadLibrary
加如break point,调试后说[访问违规],跳出如下代码:

__imp__LoadLibraryA@4:
00424138 C4 2F                les         ebp,fword ptr [edi]
0042413A 88 7C 8D 2C          mov         byte ptr [ebp+ecx*4+2Ch],bh
0042413E 81 7C AB 14 81 7C A2 cmp         dword ptr [ebx+ebp*4+14h],0CAA27C81h
00424146 81 7C 56 99 85 7C A9 cmp         dword ptr [esi+edx*2-67h],2CA97C85h
0042414E 81 7C 9F 0F 81 7C 94 cmp         dword ptr [edi+ebx*4+0Fh],97947C81h
00424156 80 7C 5C 9B 85       cmp         byte ptr [esp+ebx*2-65h],85h
0042415B 7C 28                jl          __imp__GetEnvironmentStringsW@0+1 (00424185)
0042415D AC                   lods        byte ptr [esi]
0042415E 80 7C 7B 97 80       cmp         byte ptr [ebx+edi*2-69h],80h
00424163 7C 57                jl          __imp__GetCPInfo@8 (004241bc)
00424165 B3 80                mov         bl,80h
00424167 7C 16                jl          __imp__WideCharToMultiByte@32+3 (0042417f)
00424169 1E                   push        ds
0042416A 80 7C 0D E0 80       cmp         byte ptr [ebp+ecx-20h],80h
0042416F 7C 8A                jl          __NULL_IMPORT_DESCRIPTOR+0E7h (004240fb)
00424171 2B 86 7C 3F DC 81    sub         eax,dword ptr [esi-7E23C084h]
00424177 7C 5F                jl          __imp__LCMapStringA@24 (004241d8)
00424179 48                   dec         eax
0042417A 81 7C C7 A0 80 7C 23 cmp         dword ptr [edi+eax*8-60h],0CC237C80h
00424182 81 7C 78 2C 81 7C CF cmp         dword ptr [eax+edi*2+2Ch],0C6CF7C81h
0042418A 80 7C 69 10 81       cmp         byte ptr [ecx+ebp*2+10h],81h
0042418F 7C EE                jl          __imp__WideCharToMultiByte@32+3 (0042417f)
00424191 1E                   push        ds
00424192 80 7C 10 11 81       cmp         byte ptr [eax+edx+11h],81h
00424197 7C 29                jl          __imp__GetACP@0+2 (004241c2)
00424199 29 81 7C 3D 04 93    sub         dword ptr [ecx-6CFBC284h],eax
0042419F 7C 14                jl          __imp__IsBadReadPtr@8+1 (004241b5)
004241A1 9B                   wait
004241A2 80 7C 40 7A 95       cmp         byte ptr [eax+eax*2+7Ah],95h
004241A7 7C 31                jl          __imp__LCMapStringA@24+2 (004241da)
004241A9 03 93 7C 5B B2 81    add         edx,dword ptr [ebx-7E4DA484h]
004241AF 7C 29                jl          __imp__LCMapStringA@24+2 (004241da)
004241B1 9F                   lahf
004241B2 80 7C B3 9E 80       cmp         byte ptr [ebx+esi*4-62h],80h
004241B7 7C 9B                jl          __imp__InterlockedDecrement@4 (00424154)
004241B9 E7 85                out         85h,eax
004241BB 7C E6                jl          __imp__VirtualFree@12+3 (004241a3)
004241BD 2B 81 7C 43 99 80    sub         eax,dword ptr [ecx-7F66BC84h]
004241C3 7C 2A                jl          __imp__SetStdHandle@8+3 (004241ef)
004241C5 E8 81 7C D4 05       call        0616BE4B
004241CA 93                   xchg        eax,ebx
004241CB 7C 81                jl          __imp__GetStdHandle@4+2 (0042414e)
004241CD 9A 80 7C FD 79 93 7C call        __imp__VirtualAlloc@16+2 (004241ce)

到低是什么问题啊?为什么程序要这么整我这个菜鸟.....

原来是这样:

这是你自己的写法错误,不能怨编译器。
#include <windows.h>
#include <stdio.h>

void main()
{
  char *msvcrt = "msvcrt.dll";
  __asm
  {
    mov ebp, esp /* 这句是多余的,你写上这一句将会破坏函数堆结构,因为C编译器会自动维护这个ebp和esp的,不用自己写。 */
    mov eax, msvcrt
    push eax
    call LoadLibrary /* 这一句写法也是错误的。*/
    mov esp, ebp /* 这句也是多余的 */
  }
}

修改如下:
#include <windows.h>
#include <stdio.h>

void main()
{
  char *msvcrt = "msvcrt.dll";
  __asm
  {
    mov eax, msvcrt
    push eax
    call DWORD ptr [LoadLibrary]
  }
}

谢谢虾爷的指点!

Windows 7环境下VC2005安装与运行库配置完整指南 VC2005 或许已经老去,但它承载的技术遗产仍在影响今天的世界。我们不需要抛弃它,而是要学会如何与它共存。一套完整的解决方案应包括:✅ 自动检测✅ 智能安装✅ 日志审计✅ 兼容加固✅ 渐进迁移这才是真正的工程思维:既尊重历史,也面向未来。所以,下次当客户说“我这儿打不开你的程序”,你可以微微一笑,掏出那个绿色图标的小工具,轻轻一点——“好了,试试看。😎💻✨本文还有配套的精品资源,点击获取。 阅读详情

相关推荐

assem-vc:提交了Assem-VC @ INTERSPEECH 2021的官方存储库

大会 Assem-VC:通过组合现代语音合成技术实现逼真的语音转换,朴胜元,@ @ ,SNU 论文:arXiv: ://arxiv.org/abs/2104.00931(提交给INTERSPEECH 2021) 音频样本: :

MFC下DLL/lib的调用

1、简介: dll和.lib都是程序集合,便于代码重用。都是二进制的文件。 .dll也叫动态链接库,与程序链接的方式为运行时链接(run-time linked),为PE(portable executable)格式,也就是程完整的程序。.exe、.dll、.fon、.mod、.drv、.ocx等等都是动态链接库。如.exe为系统调用的函数集合。.dll不存在同名引用,且有导出表,与导入表

tianmo2010的专栏 9473

【智能体】零代码实战:Coze多智能体协作开发全流程解析

本文详细解析了Coze平台的多智能体协作开发全流程,从入门指南到实战技巧,帮助用户零代码构建高效AI团队。通过模块化设计和专业分工,多智能体系统能显著提升任务处理速度和准确率,适用于客服、内容创作、教育培训等多个场景。文章还提供了性能优化和常见问题解决方案,助力开发者快速掌握Multi-Agent技术。

weixin_29239279的博客 336

C# 动态调用DLL

本来是想实现控制台程序运行时自动全屏,但是只找到VC下的实现方法(http://www.vckbase.com/bbs/prime/viewprime.asp?id=347)。 其中要使用两个未公开的Win32 API函数来存取控制台窗口,这就需要使用动态调用的方法,动态调用中使用的Windows API函数主要有三个,即:Loadlibrary,GetProcAddress和Freelib

Never too late to study 1182

【ECCV 2024】动态范围直方图自注意力DHSA,即插即用!

直方图自注意力机制,将空间特征按强度分段并进行分组,然后在各个分组内或分组间应用自注意力,以选择性地关注具有动态范围的空间特征,并处理长距离内相似退化的像素。

qq_43303160的博客 1846

使用DrissionPage和自动化技术实现得物鞋子信息爬取

本文介绍了一个基于DrissionPage技术的得物鞋子信息采集系统,能自动化采集商品图片、价格等数据并保存为Excel。系统采用浏览器模拟技术处理动态加载内容,通过XPath定位元素,实现智能交互和完整数据采集。关键技术包括:图片URL提取与下载、Excel数据集成与图片嵌入、文件名安全处理等。项目适用于市场分析和学术研究,强调必须遵守法律法规和平台规则,仅用于非商业用途。与API爬虫相比,浏览器自动化能更好处理现代Web应用,但需注意知识产权保护。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1667

VS封装并调用dll文件

迟迟钟鼓初长夜,耿耿星河欲曙天 有任务问题欢迎私信提问 将代码封装成dll可以隐藏代码,当作黑盒使用 1.创建 dll 工程 确定-&amp;amp;gt;选择DLL-&amp;amp;gt;完成 导出符号: 如果勾选了导出符号,怎会生成一个demo样例,介绍怎样封装变量、函数和类,在这里我们自己生成,不勾选 空项目: 所有操作都自己写,包括dllmain.cpp 得到以下结果 dllmain.c...

whu_zs的博客 4万+

使用timeROC包的compare函数比较不同标记物下两个多时间AUC值是否具有统计显著性

时间依赖的接收器操作特征曲线(time-dependent receiver operating characteristic curve, time-dependent ROC curve)是评估和比较标记物在不同时间点上预测能力的重要工具。在R语言中,timeROC包提供了丰富的函数和工具,可用于分析和比较多时间点的AUC值。时间点(timepoints)表示观察的时间点,标记物1(marker1)和标记物2(marker2)分别表示在每个时间点上的预测概率。最后,我们输出比较结果。

2301_79331387的博客 922

VC++调用dll的方法

调用DLL有两种方法:静态调用和动态调用. (一).静态调用其步骤如下: 1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下; 2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下; 3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目 录下; 4.打开你的

sunyuzhe114的专栏 4035

手把手教您如何群晖/飞牛NAS等服务器上一键部署洛雪音乐同步服务,手机电脑无缝同步歌单,支持外网访问

🎵 手机电脑歌单不同步?用Docker在群晖/飞牛NAS等服务器上搭个同步服务器, 3分钟搞定 !支持docker-compose一键部署,手机、电脑、平板收藏夹实时同步,外出也能用域名远程访问 ~ ✨

XiaoqiangClub的博客 4612

Spring AI 实战:如何使用 MCP Server 搭建 MCP 天气查询服务

MCP(Model Context Protocol)是 Anthropic 提出的一种开放协议,它定义了AI 模型与外部世界交互的标准方式。通俗地说:大模型本身只拥有训练数据中的知识,它不知道今天的天气、无法查询你的数据库、不能调用你的内部 API。MCP 就是解决这个问题的"桥梁"——它让模型能够发现并使用外部工具(Tools),就像人用手去操作工具一样。角色职责对应依赖MCP Server暴露工具(Tool),供模型调用MCP Client连接 Server,让模型发现和使用工具本文我们先聚焦。

SmartSi 763

vc调用dll 示例

其实,调用dll文件的方法很多,不一定要使用LoadLibrary函数。如果使用的话,你就要预先声明dll中的函数,很麻烦。 下面是我使用dll时的一点技巧,就是引入lib文件,可以参考: 一.Win32 动态链接库 启动VC6,创建工程,选择 Win32 Dynamic-Link Library,输入工程名称,如Win32dll。确定,进入设置界面。在当前界面选择第三项:A DLL...

weixin_30888413的博客 232

使用FPGA实现MIPI DSI接口

通过使用FPGA,我们可以实现MIPI DSI接口,并在FPGA上生成相应的时序和电平转换电路。通过使用FPGA,我们可以实现MIPI DSI接口,并在FPGA上生成相应的时序和电平转换电路。在本文中,我们将探讨如何使用FPGA实现MIPI DSI接口,并提供相应的源代码。根据不同的发送状态,我们设置相应的输出信号。请注意,这只是一个基本的示例,用于说明如何使用FPGA实现MIPI DSI接口的发送功能。请注意,这只是一个基本的示例,用于说明如何使用FPGA实现MIPI DSI接口的发送功能。

ZdqDeveloper的博客 1708

用VC写Assembly代码

各位好,最近我在研究SHELLCODE 的编写,因为需要ASM的基础,所以用VC写一些ASM代码.有兴趣的朋友可以一起讨论.我们都欢迎你. 用VC写Assembly代码(1) 用VC写Assembly代码(2) 用VC写Assembly代码(3)  用VC写Assembly代码(4) 用VC写Assembly代码(5) --字符串 用VC写Assem

小发猫 4101

【RBF预测】基于粒子群算法优化RBF神经网络实现数据回归预测含Matlab源码

1 简介 原油含水率预测对于确定油井水,油层位以及估计原油产量有着非常重要意义.BP神经网络是最近常用的原油含水率预测方法,然而,由于BP神经网络存在容易陷入局部极小值,收敛速度慢等问题,影响了其预测的实用性和准确性,对此,提出基于粒子群优化RBF神经网络(PSO-RBFNN)的原油含水率预测方法,粒子群优化算法用于RBF神经网络参数优化.在分析原油含水率预测的影响因素基础上,建立粒子群优化RBF神经网络的原油含水率预测模型.实验结果表明,在原油含水率预测中,基于粒子群优化RBF神经网络比BP神经网络有着

qq_59747472的博客 1236

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

用VC写Assembly代码(5) --函数调用(三)

没什么好说的啦,看代码就是啦#include void main(){ char *a = (char*)MessageBox; __asm {  push 0  push 0  push 0  push 0  mov ebx, 77d5050bh  call ebx } printf("%0x/n", a);} 顺便转一篇有关SHELLCODE的文章,看起来很简单,但是测试就是不成功

小发猫 1979

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

用VC写Assembly代码(5) --函数调用(二)

终于知道如何用LoadLibrary,但不知为什么!我自己写的例子是:#include int main(int argc, char* argv[]){  char *msvcrt = "msvcrt.dll";  __asm  {    mov eax, msvcrt    push eax    call dword ptr[LoadLibrary]  }  return 0;}哎,

小发猫 2029

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

用VC写Assembly代码(3)

不知为什么,对这种编程方法越来越大越有兴趣.先写个使用参数的例子(十分简单,适用于任何懂C的人)给各位参考一下吧:#include int asm(int s){ int t=0; __asm {  mov eax, DWORD PTR [ebp+8] ;把s的值传给eax  mov t, eax     ;把eax的值传给t } printf("- %d -", t);//把T显示出来}

小发猫 2456

用VC写Assembly代码(5) --循环的使用(一)

如果用C语言写循环,很简单,用for,while之类的语句就可以实现,但inline assembler就有点难,刚开始有点迷失,但找了下资料,现在会用了,先看个例子吧:#include void myfun(){ printf("aaaaaaaa/n");}void main(){ __asm {  mov ecx, 10  ttttt:  push ecx  call myfun  p

小发猫 2153

用VC写Assembly代码(5) --字符串

是有几个朋友也喜欢这种编城方法的,前几天听我一个朋友说:"真正的高手是懂C,而不是C++",想想也是.几乎所有代码最后还是有汇编代码组成的,只是效率的问题,汇编和机器语言11对应,这使汇编可以叫机器做机器能做的所有事.所以学好汇编对任何高级语言的理解很有好处.希望编程爱好者也能学习.没事做, 写了短字符串处理的代码:#include #include int main(int ar

小发猫 2961

用VC写Assembly代码(5) --一些宏的使用(二)

目前我知道vc++ inline assembler 有这几个宏 LENGTH、SIZE、TYPE,他们使用简单,下面个个例子:void main(){ int k[10]; int a,b,c; __asm {  mov eax, LENGTH k  mov ebx, SIZE k  mov ecx, TYPE k  mov a, eax  mov b, ebx  mov c, ecx } 

小发猫 2328

vc调用c#写的dll

转自:http://www.codeproject.com/csharp/ManagedCOM.asp   Download source - 5.21 Kb Preface COM Interoperability is the

wangsheng8888的专栏 2035

用VC写Assembly代码(6)--附录1[堆和栈的区别]

堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)

小发猫 2491

VC6.0 编译常见错误

 VC6.0编译常见错误第一部分 语法错误1、变量没有区分大小写    例如:变量X 与x 不同;2、关键字写错   例如:void 写成了viod等,cout写成count等3、把英文符号写成了中文符号   例如:常见的错误包括单引号、双引号、分号等4、混肴了“=”与“==”的区别5、复合语句没有使用{ }6、把“x>5 && x”写成“5” 

jianbisb的专栏 1393

VC2008 下 R6030错误

REF 一个解决方法,实验通过 #pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'

lcmssd 2075

Resolve Partial Assembly 为 Microsoft.VC90.ATL 失败。引发蓝屏

今早刚到公司,就听到同事报故障,说开机后3-5分钟就蓝屏。 还是老规矩,查看下系统日志,吓一跳。 截图如下: 这么多啊,一地的鸡皮疙瘩,进去看下。 在看下,原来如此啊。如图 原来是暴风影音在作怪,没办法,早上好事情比较多,工作要紧,只能先卸载了。 随后在网上查了一下,有人说删掉dll文件、也有人说是版...

weixin_34004750的博客 529
上一篇: 用VC写Assembly代码(5) --函数调用(二)
下一篇: 用VC写Assembly代码(6)--附录1[堆和栈的区别]
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值