现在把目光投向CreateThread
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//安全性,一般填0(NULL)
SIZE_T dwStackSize,//初始栈的大小,一般填0(使用与调用该函数的线程相同的栈空间大小)
LPTHREAD_START_ROUTINE lpStartAddress,//线程起始地址
LPVOID lpParameter,//向线程传递的参数,一般为0
DWORD dwCreationFlags,//线程标志,0为创建后立即激活,也一般填0
LPDWORD lpThreadId//保存新线程的id(返回值)。若不想保存到eax中,设置为0即可。
)
它有6个参数,但大多填0
于是直接套公式
mugen.exe+B40A4 - push 00(参数6)
mugen.exe+B40A6 - push 00(参数5)
mugen.exe+B40A8 - push 00(参数4)
mugen.exe+B40AA - push 004B40C1(最重要的参数3)
mugen.exe+B40AF - push 00 (参数2)
mugen.exe+B40B1 - nop
mugen.exe+B40B2 - nop
mugen.exe+B40B3 - nop
mugen.exe+B40B4 - push 00(参数1)
mugen.exe+B40B6 - call eax(eax已经是CreateThread的基址)
我们用之前的【主程序强制解体】阻止代码试一试
于是我们把代码写到004B40C1去
如下图

最后加上ret,这样保证用ce自带的创建功能调试我们自己的创建线程代码。
然后试试吧!
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//安全性,一般填0(NULL)
SIZE_T dwStackSize,//初始栈的大小,一般填0(使用与调用该函数的线程相同的栈空间大小)
LPTHREAD_START_ROUTINE lpStartAddress,//线程起始地址
LPVOID lpParameter,//向线程传递的参数,一般为0
DWORD dwCreationFlags,//线程标志,0为创建后立即激活,也一般填0
LPDWORD lpThreadId//保存新线程的id(返回值)。若不想保存到eax中,设置为0即可。
)
它有6个参数,但大多填0
于是直接套公式
mugen.exe+B40A4 - push 00(参数6)
mugen.exe+B40A6 - push 00(参数5)
mugen.exe+B40A8 - push 00(参数4)
mugen.exe+B40AA - push 004B40C1(最重要的参数3)
mugen.exe+B40AF - push 00 (参数2)
mugen.exe+B40B1 - nop
mugen.exe+B40B2 - nop
mugen.exe+B40B3 - nop
mugen.exe+B40B4 - push 00(参数1)
mugen.exe+B40B6 - call eax(eax已经是CreateThread的基址)
我们用之前的【主程序强制解体】阻止代码试一试
于是我们把代码写到004B40C1去
如下图

最后加上ret,这样保证用ce自带的创建功能调试我们自己的创建线程代码。
然后试试吧!



cloudy









