-
-
未解决
[求助]求助!C++编写外壳代码常量地址是硬编码怎么办!
-
发表于:
2023-9-14 01:48
2765
-
未解决 [求助]求助!C++编写外壳代码常量地址是硬编码怎么办!
各位大佬好,我最近在研究一个给PE文件加壳的代码.从<加密与解密>那本书上看的例子.C++编写外壳代码那一节.我是将dll的代码与目标PE的合并,把dll的代码放在PE文件新增的节里,先运行我的代码,然后再跳转回原OEP执行.我使用c++编写dll部分的代码,部分代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | void Start() {
fnGetProcAddress pfnGetProcAddress = (fnGetProcAddress)MyGetProcAddress();
ULONGLONG dwBase = GetKernel32Addr();
/ / 获取API地址
fnGetModuleHandleA pfnGetModuleHandleA = (fnGetModuleHandleA)pfnGetProcAddress((HMODULE)dwBase, "GetModuleHandleA" );
HMODULE hKernel32 = (HMODULE)pfnGetModuleHandleA( "kernel32.dll" );
fnExitProcess pfnExitProcess = (fnExitProcess)pfnGetProcAddress(hKernel32, "ExitProcess" );
pfnGetLastError = (fnGetLastError)pfnGetProcAddress(hKernel32, "GetLastError" );
fnVirtualQueryEx pfnVirtualQueryEx = (fnVirtualQueryEx)pfnGetProcAddress(hKernel32, "VirtualQueryEx" );
fnGetCurrentProcess pfnGetCurrentProcess = (fnGetCurrentProcess)pfnGetProcAddress(hKernel32, "GetCurrentProcess" );
|
这里面有很多字符串常量比如"GetModuleHandleA"这些.问题来了,我将dll编译后,将dll的代码写进PE文件,然后我用x64dbg调试,发现这些常量的地址居然都指向的是硬编码!也就是直接把地址写死了,按道理应该是按照相对位置这种来吧?!所以我的程序就会直接异常,然后退出.
而且更奇怪的是,我先编写的64位dll与64位PE合并的,已经成功实现了.现在是32位的dll和32位的PE合并才出现的这个问题.我仔细看了我的32位dll的编译的设置:比如说:关闭C/C++优化,代码生成设置MT.这些我也搞了.可还是不行,地址还是硬编码直接写死的.
如果只有这些字符串地址是硬编码还好,我定义局部变量就行,但是我全局变量一样是硬编码,包括我在h文件中定义的类型都是..
但是64位dll都没有以上问题.搞了很久了。求大佬解惑,小白感激不尽。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)