bool runwithdll(char * pruncmd, char * pdllpath)
{
char * pcmd = null;
char * pcurdir = null;
bool bpart = false;
char szcurdir[1024];
dword dwlen;
dword i;
while(*pruncmd == ' ') pruncmd++;
dwlen = (dword)strlen(pruncmd);
for(i=0; i<dwlen; i++)
{
if(pruncmd[i] == ' ' && bpart == false)
{
pcmd = pruncmd + i;
break;
}
if(pruncmd[i] == '"')
{
if(bpart) bpart = false;
else bpart = true;
}
}
if(pcmd == null)
{
pcmd = pruncmd;
}
for(; i>0; i--)
{
if(pruncmd[i] == '\\')
{
memset(szcurdir, 0, sizeof(szcurdir));
if(pruncmd[0] == '"')
{
strncpy(szcurdir, pruncmd+1, i-1);
szcurdir[i-1] = 0;
}
else
{
strncpy(szcurdir, pruncmd , i );
szcurdir[i] = 0;
}
pcurdir = szcurdir;
break;
}
}
// msga("pcmd:%s\r\npcurdir:%s", pcmd, pcurdir);
process_information processinfo;
startupinfoa startupinfo;
zeromemory(&startupinfo, sizeof(startupinfo));
startupinfo.cb = sizeof(startupinfo); //only compulsory field
startupinfo.wshowwindow = sw_show; //windows media player not show
startupinfo.dwflags = startf_useshowwindow;
if(createprocessa(null, pruncmd, null, null, false, create_suspended, null,
pcurdir, &startupinfo, &processinfo) == false)
{
return false;
}
if(procremtloaddll(processinfo.hprocess, pdllpath) == false)
{
::resumethread(processinfo.hthread);
closehandle(processinfo.hthread);
closehandle(processinfo.hprocess);
return false;
}
::resumethread(processinfo.hthread); //create_suspended for wait the dll load done
closehandle(processinfo.hthread);
closehandle(processinfo.hprocess);
return true;
}
hmodule procremtloaddll(handle hproc, char * pdllpath)
{
byte code[0x20]; //00
hmodule hmodule; //20
int nerror; //24 //28 :pdllpath
dword dwsize = 0x20+4+4+1024, dwnedsize;
char * plibstr;
bool bret;
fun1 pfunloadlib;
handle thd_hd;
pfunloadlib = (fun1)::getprocaddress(::getmodulehandle(_t("kernel32")), "loadlibrarya");
if(pfunloadlib == null)
return null;
plibstr =(char *)virtualallocex(hproc, 0, dwsize, mem_commit, page_EXECute_readwrite);
if(plibstr == null)
return null;
createthreadfun1(code, (dword)plibstr, (dword)pfunloadlib, (lpdword)(plibstr+0x20), (lpdword)(plibstr+0x24));
dwnedsize = 0x20;
bret = writeprocessmemory(hproc, plibstr, code, dwnedsize, &dwsize); //复制代码
if(bret == false || dwsize != dwnedsize )
{
virtualfreeex(hproc, plibstr, 0, mem_release );
return null;
}
dwnedsize = (dword)strlen(pdllpath) + 1;
bret = writeprocessmemory(hproc, plibstr+0x28, pdllpath, dwnedsize, &dwsize); //复制参数
if(bret == false || dwsize != dwnedsize )
{
virtualfreeex(hproc, plibstr, 0, mem_release );
return null;
}
thd_hd = ::createremotethread(hproc, 0, 0, (lpthread_start_routine)plibstr, (void *)(plibstr+0x28), null, null);
if(thd_hd == null)
{
virtualfreeex(hproc, plibstr, 0, mem_release);
return null;
}
waitforsingleobject(thd_hd,infinite);
closehandle(thd_hd);
dwnedsize = 4;
bret = ::readprocessmemory(hproc, plibstr+0x20, &hmodule, dwnedsize, &dwsize);
if(bret == false || dwsize != dwnedsize )
{
virtualfreeex(hproc, plibstr, 0, mem_release);
return null;
}
if(hmodule == null)
{
bret = ::readprocessmemory(hproc, plibstr+0x24, &nerror , dwnedsize, &dwsize);
if(bret == false || dwsize != dwnedsize )
{
virtualfreeex(hproc, plibstr, 0, mem_release);
return null;
}
::setlasterror(nerror);
}
bret = virtualfreeex(hproc, plibstr, 0, mem_release);
if(bret == false)
return null;
return hmodule;
}
lpbyte createthreadfun1(lpbyte pcode, dword dwcodeadr, dword dwcallfunadr, lpdword pfunretval, lpdword perror)
{
dword dwfunerror;
dwfunerror = (dword)&getlasterror;
*(dword *)(pcode + 0x00) = 0x042474ff; //push d,[esp+04]
*( byte *)(pcode + 0x04) = 0xe8; //call *(dword *)(pcode + 0x05) = dwcallfunadr - (4+5); // fun相对地址
*(dword *)(pcode + 0x05) = dwcallfunadr - (dwcodeadr+0x04+5);// dwcallfunadr相对地址
*( byte *)(pcode + 0x09) = 0xa3; //mov [ ],eax
*(dword *)(pcode + 0x0a) = (dword)pfunretval; // funretval
*( byte *)(pcode + 0x0e) = 0xe8; //call
*(dword *)(pcode + 0x0f) = dwfunerror - (dwcodeadr+0x0e+5);// getlasterror相对地址
*( byte *)(pcode + 0x13) = 0xa3; //mov [ ],eax
*(dword *)(pcode + 0x14) = (dword)perror; // perror
*( byte *)(pcode + 0x18) = 0xc2; //retn
*( word *)(pcode + 0x19) = 0x0004; // 04 //一个参数返回
*( word *)(pcode + 0x1b) = 0xcc; //int 3
return pcode;
}