mfc程序反编译
‘壹’ 怎样知道一个EXE文件是用什么语言编写的怎样写的
通过看它和什么库链接可以猜测出用过哪些语言。
比如 Java 语言写的程序一般不会不与 Java 运行时的 DLL 链接(名字好像叫jre.dll),Objective-C 和 Swift 语言写的程序往往是和objc运行时链接的。
C语言链接的DLL包括Unix/BSD/Linux系统上的 libc、libxnet 等,和 Windows 上的 Kernel.dll 等。C++也是如此,但链接的包括有 libstdcxx,和 Windows 上的 mfc*.dll。
至于是怎样写的,就要通过反编译来看了。
‘贰’ 有关于Visual Studio 2005 EXE程序反编译成可用代码的问题~!~
你应该选择使用静态库啊。动态库你要运行必须连相关的dll一起拷贝到别人电脑上去!
还有一些特别的情况,虽然是针对VC2005的,但是对VC6也有参考价值。
前面一些是我在网上找的,后面的有些是我自己现添加的,希望对你有帮助!
报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"
//------------------------------------------------------
这个问题主要出现在XP环境下运行由Visual C++2003/2005编译的MFC程序时
问题现象是XP运行此类程序时,报错"由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题"
这个问题似乎许多人遇见过.在CSDN和微软社区里面都有人提到.但是没有完整的解决方案
这个问题的解决一共会遇见2个子问题
最早出现这个错误我和许多人认为的一样
认为是缺乏DLL库文件导致.但是在测试机复制了DLL甚至安装了.net framework 2.0以后
都无法解决问题,最后确认不是由缺乏DLL所致
因为程序是纯win32的应用程,非托管代码,所以也无需.net framework
Visual C++2003/2005默认的MFC程序是使用动态MFC库(Use MFC in a Shared DLL)来链接的
而动态MFC库使用的是Multi-threaded DLL (/MD)
由于XP对于PE文件格式监测更加严格.
就会导致部分使用多线程DLL的可执行文件在调用的时候出错
修改项目属性的编译开关
Project->Property->configuration Properties->C/C++->Code Generation->Runtime Library
修改成Multi-threaded (/MT)
修改了Runtime类型以后
需要将MFC的编译类型也改成静态库
Project->Property->configuration Properties->General->Use of MFC
修改成Use MFC in a Static Library
一部分情况下在这步就能解决问题
另外一部分情况会遇见如下情况
编译器报错
CODE:
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
[Copy to clipboard]
产生这个问题的原因是库依赖关系
在Project->Property->configuration Properties->Linker->Command Line
加入编译开关/verbose:lib可以显示详细的库链接顺序
CODE:
------ Build started: Project: PerfMonDemo, Configuration: Release Win32 ------
Linking...
Searching libraries
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
Finished searching libraries
Searching libraries
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\kernel32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\uuid.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oledlg.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\urlmon.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atls.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleacc.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\pdh.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\DelayImp.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\lib\libcpmt.lib:
Searching d:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\nafxcw.lib:
Finished searching libraries
.\Release/PerfMonDemo.exe : fatal error LNK1169: one or more multiply defined symbols found
Build log was saved at "file://d:\Dev\Performance Monitor\Release\BuildLog.htm"
PerfMonDemo - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
[Copy to clipboard]
我们发现在libcpmt.lib声明过的operator new在nafxcw.lib中再次定义
解决方法如下
Project->Property->configuration Properties->Linker->Input->Additional Dependencies
加入
nafxcw.lib
libcpmt.lib
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
加入
nafxcw.lib
libcpmt.lib
这样链接程序就不会先按照默认顺序来连接这两个库文件
而是在最后在加入对他们的引用.这样就避免了这个问题
下面是一张可能发生冲突的列表
若要使用此运行时库 请忽略这些库
单线程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
多线程 (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
使用 DLL 的多线程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
调试单线程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
调试多线程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
使用 DLL 的调试多线程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
//本人曾经对上面的方法进行测试,修改后可能出现XX无法解析的情况,请大家使用MSDN查找该函数,并且找到该函数对应的lib库文件。将其添加到附加依赖项或者是用#pragma comment(lib,"xxx.lib")将其添加到代码中!
‘叁’ MFC下如何关闭外部程序,例如关闭一个以notepad.exe D:\\text.txt打开的进程
STARTUPINFOsi;
PROCESS_INFORMATIONpi;
LPTSTRszCmdline=_tcsp(TEXT("notepad.exeD:\text.txt"));
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);
ZeroMemory(&pi,sizeof(pi));
//Startthechildprocess.
if(!CreateProcess(NULL,//Nomolename(usecommandline)
szCmdline,//Commandline
NULL,//Processhandlenotinheritable
NULL,//Threadhandlenotinheritable
FALSE,//SethandleinheritancetoFALSE
0,//Nocreationflags
NULL,//Useparent'senvironmentblock
NULL,//Useparent'sstartingdirectory
&si,//PointertoSTARTUPINFOstructure
&pi)//PointertoPROCESS_INFORMATIONstructure
)
{
printf("CreateProcessfailed(%d). ",GetLastError());
return;
}
//Waituntilchildprocessexits.
WaitForSingleObject(pi.hProcess,INFINITE);
//这里就是关闭
//Closeprocessandthreadhandles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
后,子进程就与父进程彻底脱离关系了,在Windows下进程之间的关系比较弱,不仅没有父进程收割子进程退出状态这一回事,甚至连getppid这样的API也没有。这又导致了两个现象,
1)Windows下不用当心Linux下的僵死进程问题。
2.)当失去句柄仅仅知道进程ID时,Windows下甚至无法判断此进程是否就是原有进程,(用OpenProcess打开的句柄无法判定是否就是原来的进程)假如此进程已经结束,也无法获取到进程的退出状态。(在Windows下获取进程退出状态必须得保留进程的句柄,然后调用GetExitCodeProcess)
3.现在一般的游戏都已经不允许直接运行了,这点的目的很简单,加大别人用反编译软件调试游戏主程序的难度。按照CreateProcess的默认参数的直接创建原游戏主程序时,会碰到一个问题,及当发生原程序发生缺少动态库等情况时,原有系统弹出的提示对话框会被调用CreateProcess的进程吞掉,使得这类错误被掩盖,因为此时CreateProcess返回值实际是成功的。这时候,将CreateProcess的参数Process Creation Flags设为CREATE_DEFAULT_ERROR_MODE就可以让原有的提示窗口弹出来。
4. Process Creation Flags设为CREATE_SUSPENDED时,可以将欲创建进程挂起,这时想对新进程干啥都行,甚至可以尝试更改其代码段以影响程序运行,(但是大部分带监控的杀毒软件会有警告)。然后用ResumeThread API去让原进程的主线程运行起来。
5.CreateProcess创建的进程句柄实际代表的是一个Windows核心对象,适用于Windows核心对象的操作都可以对进程句柄进行,(核心对象的概念请参考《WIndows核心编程》,其中包括WaitForSingleObject等同步API。
‘肆’ 如何修改exe程序
你好,很高兴为你解答问题,希望我下面的回答对你有所帮助。
修改程序的版本可以使用资源修改器做到,常用的有Rescope,HackResource等等。这些软件我可提供给你。如果自己不太会使用的话我可不知道您是不是学编程的。由于我的编程经验有限,我知道程序发行时的版本是在编写软件时在version里面直接声明的,实际也就是写进去的。这就是为什么windows XP过后可以是windows7而不是windows YP的原因。如果使用函数实现,那么其版本号命名一定有规律,而你发现几个软件的版本更新之后命名是有规律的呢?
以上说的修改方法,需要你拥有程序的源代码。没有程序的源代码,只能用黑客资源修改器等软件来修改。不知道您是否明白了。
而你的要求似乎是写一个非常简单的资源修改器,只需要修改程序版本即可。这个我也不是太清楚,因为我的MFC才刚刚起步,你可以到编程论坛求助看看。以帮你修改。
希望对你有所帮助
建议好的话请采纳吧!
‘伍’ c++代码反编译
进入.Net之后,VC可以用来开发本地的win32程序,还有托管的.Net程序
其中win32程序,比如mfc程序,使用传统C++语言,是直接编译为机器指令的,最多反汇编到汇编代码
但是.net程序,使用微软为.net平台扩展的C++/CLI语言(.net 1.1时代有一种托管C++语言,是微软的早期作品,因为稳定性欠佳,已被C++/CLI取代),编译之后的是.net平台的IL语言,因为IL汇编语言较传统汇编指令远为“高级”,通过简单的反汇编器就可以得到几乎一摸一样的源代码,楼主实际看到的是这种.net程序,这才是通过Reflector能够看到的反汇编代码
‘陆’ 如何看MFC程序代码
反编译,反编译为c++代码
‘柒’ 怎么查看dll文件啊 我菜鸟!不是菜鸟知道的赶紧进来~!
DLL文件(Dynamic Linkable Library 即动态链接库文件),是一种不能单独运行的文件,它允许程序共享执行特殊任务所必需的代码和其他资源
比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。
Windows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的 DLL 文件,并可对它们单独编译和测试。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用。Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现。
一般来说,DLL 是一种磁盘文件,以.dll、.DRV、.FON、.SYS 和许多以 .EXE 为扩展名的系统文件都可以是 DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。如果与其它 DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL 模块中包含各种导出函数,用于向外界提供服务。DLL 可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个 DLL 在内存中只有一个实例;DLL 实现了代码封装性;DLL 的编制与具体的编程语言及编译器无关。
在 Win32 环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows 在加载 DLL 模块时将进程函数调用与 DLL 文件的导出函数相匹配。Windows 操作系统对 DLL 的操作仅仅是把 DLL 映射到需要它的进程的虚拟地址空间里去。DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。
调用方式:
1、静态调用方式:由编译系统完成对 DLL 的加载和应用程序结束时 DLL 卸载的编码(如还有其它程序使用该 DLL,则 Windows 对 DLL 的应用记录减1,直到所有相关程序都结束对该 DLL 的使用时才释放它,简单实用,但不够灵活,只能满足一般要求。
隐式的调用:需要把产生动态连接库时产生的 .LIB 文件加入到应用程序的工程中,想使用 DLL 中的函数时,只须说明一下。隐式调用不需要调用 LoadLibrary() 和 FreeLibrary()。程序员在建立一个 DLL 文件时,链接程序会自动生成一个与之对应的 LIB 导入文件。该文件包含了每一个 DLL 导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB 文件作为 DLL 的替代文件被编译到应用程序项目中。
当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与 LIB 文件中导出符号相匹配,这些符号或标识号进入到生成的 EXE 文件中。LIB 文件中也包含了对应的 DL L文件名(但不是完全的路径名),链接程序将其存储在 EXE 文件内部。
当应用程序运行过程中需要加载 DLL 文件时,Windows 根据这些信息发现并加载 DLL,然后通过符号名或标识号实现对 DLL 函数的动态链接。所有被应用程序调用的 DLL 文件都会在应用程序 EXE文件加载时被加载在到内存中。可执行程序链接到一个包含 DLL 输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载 DLL。可执行程序直接通过函数名调用 DLL 的输出函数,调用方法和程序内部其 它的函数是一样的。
2、动态调用方式:是由编程者用 API 函数加载和卸载 DLL 来达到调用 DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
显式的调用:
是指在应用程序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用 GetProcAddress() 获取想要引入的函
‘捌’ 怎么看软件用什么语言编写的
现在的软件有的不纯是用一种语言编写,可以用spy++,vc6自带的,然后用它判断,如果类名是thunder,则为vb程序,为t开头,一般是delphi程序,有afx的,一般为mfc程序,比较正常的,则为win32程序,用c或32位汇编编写
想简单的判断,可以用查壳软件,peid等,一般你可以去下载破解工具包即可
‘玖’ 如何查看exe文件是用什么语言写的
一般没有办法可以保证获取EXE文件是什么语言写的,只是对于编译后没有进行任何处理的EXE文件,可以去看它是否符合常见的DELPHI、VB、VC++等编译器的规律,然后猜测其是什么语言编写的。
对于高级语言的反编译,理论上就是不可能的,除非是对于PHP、FOXPRO这些伪编译系统。虽然EXE都可以反汇编,但是真正想反汇编之后做个什么大的手足,是非常非常困难的。
用名为PEiD的这个软件把这个,exe查一下,如果它没有加壳的话,就可以看出是用什么语言写的,如果它加了壳,要把它脱壳以后,才能看得出是用什么语言写的。
从一些细节,例如需要那些DLL库,需要的其它配置,有无配置文件。 当然,还有更鸟的办法——反编译! Foxpro、VFP、Delphi都可以。PB、VB都有特定的文件;BCB可以用某个软件打开,虽然看不道源代码,但足以判断,另外的大概是VC了。至于C和汇编,WIN9X下无图标。
(9)mfc程序反编译扩展阅读:
通过看它和什么库链接可以猜测出用过哪些语言。比如Java语言写的程序一般不会不与Java运行时的DLL链接(名字好像叫jre.dll),Objective-C 和Swift语言写的程序往往是和objc运行时链接的。
C语言链接的DLL包括Unix/BSD/Linux系统上的libc、libxnet等,和Windows上的Kernel.dll等。C++也是如此,但链接的包括有libstdcxx,和Windows上的 mfc*.dll。
虽说几乎任何高级语言编译的exe文件都可以通过反编译的方法获得源代码,但到目前为止,还没有一种反编译的方法可以获得百分百完整、准确的源代码。
而学过编程的都知道,源程序中有时候哪怕错一个字符,运行结果都有可能完全出人预料。因此反编译获得的源代码,重新编译为exe文件后,要么就是无法运行,要么就是面目全非了。
‘拾’ 怎么在没有源代码的情况下修改一个软件用的MFC。反编译还是有别的办法
不用反编译,用钩子函数就可以。windows系统打补丁就是用这种技术。大概是设计一个新的dll库文件挂在原来的程序上,实现一些功能的替换