首页
社区
课程
招聘
未解决 [求助]求助!C++编写外壳代码常量地址是硬编码怎么办!
2023-9-14 01:48 2710

未解决 [求助]求助!C++编写外壳代码常量地址是硬编码怎么办!

2023-9-14 01:48
2710

各位大佬好,我最近在研究一个给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都没有以上问题.搞了很久了。求大佬解惑,小白感激不尽。


[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 0
打赏
分享
最新回复 (5)
雪    币: 808
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_xnchcbqv 2023-9-14 01:49
2
0
图中贴的代码是64位的。。但是32位的也没啥区别,就ULONGLONG 改DWORD。不知道啥情况呢。
雪    币: 210
活跃值: (2819)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
yeyeshun 2 2023-9-14 09:16
3
0
不要写成字符串,拆开换算成数值进行赋值,并且要关闭优化
雪    币: 364
活跃值: (1481)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wujimaa 1 2023-9-14 10:32
4
0

建议学习一下shellcode。函数名可以用hash替代。

最后于 2023-9-14 10:34 被wujimaa编辑 ,原因:
雪    币: 808
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_xnchcbqv 2023-9-14 15:04
5
0
yeyeshun 不要写成字符串,拆开换算成数值进行赋值,并且要关闭优化
我已经这样做过了。。。但是字符串的确实没问题了,但是我还有一些全局变量,地址也是硬编码
雪    币: 210
活跃值: (2819)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
yeyeshun 2 2023-9-15 08:50
6
0
我的建议是去掉全局变量,通过参数的方式在shellcode间传递。如果必须有全局的,可以考虑内存映射等手段
游客
登录 | 注册 方可回帖
返回