反汇编中的硬编码地址 我在C++中编写了优化的基于Windows的SeleCal码,并且在C++中把硬编码的地址传递给函数时,我有问题。

反汇编中的硬编码地址 我在C++中编写了优化的基于Windows的SeleCal码,并且在C++中把硬编码的地址传递给函数时,我有问题。,c++,assembly,shellcode,C++,Assembly,Shellcode,e、 g: 在反汇编中,它显示CreateThread(…,cardcoded_地址,…); 相反,我想传递这个地址,比如“从这个位置到线程回调” 有什么办法可以避免吗?(因为外壳代码应该是地址独立的?) 问候。无论如何,我在搜索/做一些事情,我能做的最后一件事是,你可以用增量偏移量来解决这个问题 说明:在代码的第一个函数中,应该有如下函数: DWORD delta; __asm { call GetBasePointer GetBasePointer: pop eax

e、 g:

在反汇编中,它显示CreateThread(…,cardcoded_地址,…); 相反,我想传递这个地址,比如“从这个位置到线程回调”

有什么办法可以避免吗?(因为外壳代码应该是地址独立的?)


问候。

无论如何,我在搜索/做一些事情,我能做的最后一件事是,你可以用增量偏移量来解决这个问题

说明:在代码的第一个函数中,应该有如下函数:

DWORD delta;

__asm {
    call GetBasePointer
    GetBasePointer:
    pop eax
    sub eax, GetBasePointer
    mov [delta], eax
}
My_CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)((DWORD)thread_callback + (DWORD)delta), NULL, NULL, NULL);

DWORD WINAPI thread_callback(LPVOID lpParam)
{
    // stuff..
}
您还可以通过谷歌搜索delta offset以了解更多详细信息。 之后,您可以执行以下操作:

DWORD delta;

__asm {
    call GetBasePointer
    GetBasePointer:
    pop eax
    sub eax, GetBasePointer
    mov [delta], eax
}
My_CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)((DWORD)thread_callback + (DWORD)delta), NULL, NULL, NULL);

DWORD WINAPI thread_callback(LPVOID lpParam)
{
    // stuff..
}
它会很好的工作


注意。

如果您使用的是gcc系列编译器,请使用-fPICI。我使用的是Visual Studio 2012。编辑:为什么我应该得到否决票?但是
delta
是内存中的一个位置,有一个绝对地址,所以你也有同样的问题。我不知道你指的是哪个绝对地址,但每当我在随机位置测试时,线程都会正常执行。指令
mov[delta],eax
生成移动到绝对地址的操作。@mcleod_ideafix:它不应该。。。它应该被编入索引,特别是为什么?它是局部变量吗?哦,那么它是从EBP索引的