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