首页
社区
课程
招聘
Myshell.asm的错误更正及在VC中融合masm32编译的方法
发表于: 2005-3-14 23:24 21651

Myshell.asm的错误更正及在VC中融合masm32编译的方法

2005-3-14 23:24
21651

有朋友来信说:Myshell.asm用TestVC测试时候,报告找不到文件,出错原因如下:

;----------------------------------------------
WJQ_PUSHA        MACRO
                push        ebx
                push        ecx
                push        edx
                push        esi
                push        edi
                push        ebp
                pushfd                                ;;;这里原来是pushf,是16为的标志入栈,产生了错误
                        ENDM
;----------------------------------------------
WJQ_POPA        MACRO
                popfd                                ;;;这里原来是popf,是16为的标志出栈,产生了错误
                pop                ebp
                pop                edi
                pop                esi
                pop                edx
                pop                ecx
                pop                ebx
                        ENDM
;----------------------------------------------

在此对各位朋友深表歉意!

另外:
    介绍一种VC工程直接融合了MASM32汇编编译的方法:
    这样可以直接在这个工程中对myshell.asm进行编译了连接了,而且也可以直接追踪到myshell.asm的源码中了。

方法如下:
1、将myshell.asm填加到VC工程的Source files中;
2、将Source files中的myshell.obj删除;
3、在Source files中的myshell.asm上:右键->Setting->选中Custom Build页
   在Commands中输入:
   如果是DEBUG模式,则输入:
   c:\masm32\bin\ml /c /coff /Zi /FoDEBUG\$(InputName).obj $(InputPath)

   如果是RELEASE模式,则输入:
   c:\masm32\bin\ml /c /coff /FoRELEASE\$(InputName).obj $(InputPath)

   在Outputs中输入:
   如果是DEBUG模式,则输入:
   DEBUG\$(InputName).obj

   如果是RELEASE模式,则输入:
   RELEASE\$(InputName).obj

   如果您的没有把masm安装在c盘,则要作相应的修改。

之后,您可以直接对TestVC工程编译连接了。
------------------------------------------------------------------------

   再次谢谢各位朋友的来信!
      
                                 Spring.W
                                 2005.3.15


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 47147
活跃值: (20380)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
谢谢Spring.W!
按你的VC工程直接融合了MASM32汇编编译的方法,成功地在VC中直接对调用的.asm文件进行编译了,真是省事,VC和ASM的特长都能发挥起来。
2005-3-19 16:31
0
雪    币: 216
活跃值: (370)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
如果是vc6装vcpp5,如果是vs2003或2005自带ml.exe
这样不用指定什么c:\masm32\ml了,直接写ml就行。
这些微软官方都有介绍的,
其实大家注意的话应该都会看过。
2005-4-9 12:46
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我试用Myshell.exe(Myshell.asm编译的运行文件) 加壳,xp sp2上面的notepad.exe 加壳运行出错,而有些exe 文件则正常。
是否是 Bound import 处理的问题?
2005-12-14 11:55
0
雪    币: 302
活跃值: (410)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
5
最初由 wwwddd 发布
我试用Myshell.exe(Myshell.asm编译的运行文件) 加壳,xp sp2上面的notepad.exe 加壳运行出错,而有些exe 文件则正常。
是否是 Bound import 处理的问题?


是Bound import 处理的问题,解决方法是你可以将Bound import移动到后面的节中(需要注意应该要在双字边界上),也可以加壳前将Bound import删除。
2005-12-15 23:45
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
1. 链接出错
在原来的工程文件中,链接有问题。出错信息是:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/TestUseVC.exe : fatal error LNK1120: 1 unresolved externals

我用的自己编译的myShell.obj文件。编译命令是
\masm32\bin\ml /c /coff /Cp myShell.asm

用光盘里面的则可以链接通过。

如果用 \masm32\bin\ml /c /Cp myShell.asm  编译,虽然有coff的信息出现,但也可以链接成功。

用“VC工程直接融合了MASM32汇编编译的方法”也是一样的结果。

可能是masm 版本的问题吧?我的是
Microsoft (R) Macro Assembler Version 6.14.8444

2. 找不到文件

另外在TestUseVCDlg.cpp中是否改
        strcpy(pStr,"c:\test.exe");
为:
        strcpy(pStr,"c:\\test.exe");
2005-12-21 12:15
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最初由 wwwddd 发布
1. 链接出错
在原来的工程文件中,链接有问题。出错信息是:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/TestUseVC.exe : fatal error LNK1120: 1 unresolved externals
........


刚才又重新看了一下,是我疏漏了。在代码中改这个值就可以了。


_WJQ_USE_COMMAND_LINE                EQU                1                ; 1=编译成命令行方式,否则编译成函数方式
2005-12-30 01:37
0
雪    币: 302
活跃值: (410)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
8
王景泉:
    你好!
    有问题请教,先谢谢了!
    在附件中我建了一个工程,用c调用用汇编实现的加壳(myshell.asm),编译连接都通过了,在运行时运行到c调用用汇编时报错,谢谢帮我看一下,看该如何实现。                                                                     周江

答复:
======================================================================
我做的修改:
----------
1、修改WJQ_PUSHA 和 WJQ_POPA 宏定义bug

2、_WJQ_USE_COMMAND_LINE   EQU 0 ;这里应该为0,否则成了命令行方式

3、关闭了调试器检查处理部分宏开关,建议自己完善后使用
_WJQ_CHECK_DEBUGER               EQU        0        ; 1=检测Softice,trw2000等调试器
_WJQ_CHECK_TRW_USE_PROCESS EQU        0        ; 1=增加进程枚举内存搜索查找TRW,影响速度
_WJQ_DISP_TEST_DEBUGER           EQU        0        ; 1=有调试器时,提示错误
_CHECK_BUT_IGNORE_DEBUGER  EQU        0        ; 1=检测,但是忽略调试器(即检测到调试器也能正常使用)

4、修改了Restore_Shell_Init_data 函数没有彻底释放内存的bug
        Restore_Shell_Init_data        proc
                WJQ_PUSHA
                ;------恢复初始化数据-----
                mov                ecx,Sheller_End - My_Import
                mov                esi,mem_offset
                mov                edi,offset My_Import
                cld
                rep                movsb
                                       
                ;回收内存
                push        MEM_DECOMMIT
                push        (Sheller_End - My_Import)+100h
                push        mem_offset
                call        VirtualFree
                .if eax == 0
                        mov                eax,ERR_FREE_MEM
                .else
                        mov                eax,ERR_SUCESS
                .endif
                ;
                ;彻底释放
                push        MEM_RELEASE
                push        0        ;//muse be zero!!
                push        mem_offset
                call        VirtualFree
                ;
                WJQ_POPA
                ret
        Restore_Shell_Init_data        endp

5、使用VC++融合masm汇编的编译连接方式(参看论坛『《软件加密技术内幕》』中我的介绍)

6、VC++工程的Link选项,增加.text节可读写属性
    在Link选项卡中加入:/SECTION:.text,ERW

                                           (结束)
                                           2006.3.20 by wjq
2006-3-20 11:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
正在链接...
LINK : warning LNK4075: 忽略“/EDITANDCONTINUE”(由于“/INCREMENTAL:NO”规范)
libcmtd.lib(a_env.obj) : error LNK2019: 无法解析的外部符号 __imp__GetEnvironmentStrings@0 ,该符号在函数 ___crtGetEnvironmentStringsA 中被引用
.\Debug/TestUseVC.exe : fatal error LNK1120: 1 个无法解析的外部命令

我都改了,就有这样的错误,我的是vc2003的
2006-8-2 12:44
0
雪    币: 302
活跃值: (410)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
10
sorry,vc2003我没有测试,只有你自己调试看看了。
2006-8-26 07:20
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 wwwddd 发布:
我试用Myshell.exe(Myshell.asm编译的运行文件) 加壳,xp sp2上面的notepad.exe 加壳运行出错,而有些exe 文件则正常。
Spring.W:
是Bound import 处理的问题,解决方法是你可以将Bound import移动到后面的节中(需要注意应该要在双字边界上),也可以加壳前将Bound import删除。

请问:如何删除Bound import
2007-1-8 16:29
0
游客
登录 | 注册 方可回帖
返回
//