void CDynamicCodeDlg::OnBnClickedCreate()
{
// TODO: 在此添加控件通知处理程序代码
m_num = 0;
m_Code =(BYTE *) VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_EXECUTE_READWRITE); //prepare
AddCode(0x8b);
AddCode(0xF4);
//push MB_OK
AddCode(0x6A);
AddCode(0x01);
//push the lpCaption, push lpCaption
char * temp = new char[10];
strcpy(temp,"caption");
AddCode(0x68);
AddCode((long)temp & 0xff);
AddCode(((long)temp & 0xff00) >> 8);
AddCode(((long)temp & 0xFF0000) >> 16);
AddCode(((long)temp & 0xFF000000) >> 24);
//push lpText;
AddCode(0x68);
if (m_str != NULL) delete[] m_str;
m_str = new char[20];
strcpy(m_str,"Hello world");
AddCode((long)m_str & 0xff);
AddCode(((long)m_str & 0xff00) >> 8);
AddCode(((long)m_str & 0xFF0000) >> 16);
AddCode(((long)m_str & 0xFF000000) >> 24);
////push the handle
AddCode(0x6a);
AddCode(0x00);
//Call
AddCode(0xE8);
HMODULE handle = LoadLibrary("User32.dll");
m_Data = (LONG)GetProcAddress(handle,"MessageBoxaA");
AddCode(m_Data & 0xff);
AddCode((m_Data & 0xff00) >>8);
AddCode((m_Data & 0xff0000) >>16);
AddCode((m_Data & 0xff000000) >>24); //cmp esp
AddCode(0x3B);
AddCode(0xF4);
AddCode(0xE8);
AddCode(0x67);
AddCode(0xE0);
AddCode(0xFF);
AddCode(0xFF);
m_Code -= m_num;
}void CDynamicCodeDlg::AddCode(BYTE CodeByte)
{
*m_Code = CodeByte;
m_Code++;
m_num++;
}void CDynamicCodeDlg::OnBnClickedAdd()
{
// TODO: 在此添加控件通知处理程序代码
LONG a = (LONG)m_Code;
_asm
{
Call a
}}我调到汇编状态下 看了一下 自己生成的code是正确的 但是 一执行到call messageboxa的时候就会异常 不知道为什么
{
// TODO: 在此添加控件通知处理程序代码
m_num = 0;
m_Code =(BYTE *) VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_EXECUTE_READWRITE); //prepare
AddCode(0x8b);
AddCode(0xF4);
//push MB_OK
AddCode(0x6A);
AddCode(0x01);
//push the lpCaption, push lpCaption
char * temp = new char[10];
strcpy(temp,"caption");
AddCode(0x68);
AddCode((long)temp & 0xff);
AddCode(((long)temp & 0xff00) >> 8);
AddCode(((long)temp & 0xFF0000) >> 16);
AddCode(((long)temp & 0xFF000000) >> 24);
//push lpText;
AddCode(0x68);
if (m_str != NULL) delete[] m_str;
m_str = new char[20];
strcpy(m_str,"Hello world");
AddCode((long)m_str & 0xff);
AddCode(((long)m_str & 0xff00) >> 8);
AddCode(((long)m_str & 0xFF0000) >> 16);
AddCode(((long)m_str & 0xFF000000) >> 24);
////push the handle
AddCode(0x6a);
AddCode(0x00);
//Call
AddCode(0xE8);
HMODULE handle = LoadLibrary("User32.dll");
m_Data = (LONG)GetProcAddress(handle,"MessageBoxaA");
AddCode(m_Data & 0xff);
AddCode((m_Data & 0xff00) >>8);
AddCode((m_Data & 0xff0000) >>16);
AddCode((m_Data & 0xff000000) >>24); //cmp esp
AddCode(0x3B);
AddCode(0xF4);
AddCode(0xE8);
AddCode(0x67);
AddCode(0xE0);
AddCode(0xFF);
AddCode(0xFF);
m_Code -= m_num;
}void CDynamicCodeDlg::AddCode(BYTE CodeByte)
{
*m_Code = CodeByte;
m_Code++;
m_num++;
}void CDynamicCodeDlg::OnBnClickedAdd()
{
// TODO: 在此添加控件通知处理程序代码
LONG a = (LONG)m_Code;
_asm
{
Call a
}}我调到汇编状态下 看了一下 自己生成的code是正确的 但是 一执行到call messageboxa的时候就会异常 不知道为什么
HMODULE handle = LoadLibrary("User32.dll");
m_Data = (LONG)GetProcAddress(handle,"MessageBoxaA");
AddCode(m_Data & 0xff);
AddCode((m_Data & 0xff00) >>8);
AddCode((m_Data & 0xff0000) >>16);
AddCode((m_Data & 0xff000000) >>24);
这段是产生
call 地址
的程序吧,能这么直接写么?出来的代码,call的地址都不对呀;
我把所有数据改为成员数据就好了。
int m_num;
BYTE* m_Code;
BYTE code[4096];
char m_str[20];
LONG m_Data;
char temp[10];
2、call m_Data // 找MessageBoxA根据汇编代码,有错误
改为:
mov eax,m_Data
call eax
//Call
//AddCode(0xE8);
HMODULE handle = LoadLibrary("User32.dll");
m_Data = (LONG)GetProcAddress(handle,"MessageBoxW");
// mov eax,m_Data
AddCode(0xB8);
AddCode(m_Data & 0xff);
AddCode((m_Data & 0xff00) >>8);
AddCode((m_Data & 0xff0000) >>16);
AddCode((m_Data & 0xff000000) >>24); //call eax
AddCode(0xff);
AddCode(0xd0);
即可
写错了,应为:
m_Data = (LONG)GetProcAddress(handle,"MessageBoxA");
AddCode(0x3B);
AddCode(0xF4);
AddCode(0xE8);
AddCode(0x67);
AddCode(0xE0);
AddCode(0xFF);
AddCode(0xFF);
以上几句我不知是什么意思,改为: // mov esp,esi 清空堆栈
AddCode(0x8B);
AddCode(0xE6); // ret
AddCode(0xC3);就可以正确运行了。
实际上翻译成机器码为:
实际上是把地址放入堆栈上,然后调用其地址。
call dword ptr [bsp - 4}
其实没有call 0x00112245这样的指令
m_Data = (LONG)GetProcAddress(handle,"MessageBoxaA");
---m_Data = (LONG)GetProcAddress(handle,"MessageBoxA");
2、
AddCode(0x3B);
AddCode(0xF4);
AddCode(0xE8);
AddCode(0x67);
AddCode(0xE0);
AddCode(0xFF);
AddCode(0xFF);
________ m_Code -= m_num;
3BF4 cmp si,sp
E867E0ffff call ffffe067
ffffe067:你要跳到的函数地址 - 当前指令下一条指令的地址(就是我用横线标的这条语句的地址)
这里肯定有问题,把这几句删掉就可以了,楼上已经有人证明了
3BF4 cmp si,sp
E867E0ffff call ffffe067
改为:
3BF4 cmp si,sp
E867E0ffff call xxxxxxxx
ffffe067:xxxxxxxx - 当前指令下一条指令的地址(就是我用横线标的这条语句的地址)
{
Call a
}
call a ---这里,没有用段间调用的形式,如果还有错,不妨改成:call fword ptr [a]
1、
m_Data = (LONG)GetProcAddress(handle,"MessageBoxaA");
---m_Data = (LONG*)GetProcAddress(handle,"MessageBoxA");
楼主,能运行后,在这个贴上通知我一下,因为我也觉得这样调,地址有问题,我用softice跟了一下,地址不对,应该不能成功的呀,难道是符号地址的问题?记着告诉大家一下,现在我要回家了,没有时间试了
大家新年快乐
mov eax,m_Data
call eax类似于vc程序的符号跳转,直接调不知道有无问题,但是这样做比较安全,符合逻辑