Hi Folks..
Actually I am new to this dll injection n api hooking
implementations but have zeal to learn. I wrote a small code but it is
failing in createremotethread. Can anyone help me plz..

I think
reading my unindented code would be a bit hectic. So I would like to
tell you my intention. I have written a dll called sum.dll . I have
written one exe which used this dll.
Now my I want to write one app and keep a hook in this exe and call a method 
from sum.dll .
I
know that hooking kernel apis is nice try as kernel32.dll will be
loaded in the same base memory address in all processes. But as I am
trying for other Dll , I have called LoadLibrary and GetProcAdress in
exe in which I want to call.
WriteProcessmemory and
Readprocessmemory apis are working fine as I could read the data which
I have written . But execution of createremotethread is not working
fine. I copy pasted my code . Plz check it.


#include<stdio.h>
#include<conio.h>
#include<windows.h>

typedef FARPROC (__stdcall *PGetProcAddress)(HMODULE, char*);
typedef HMODULE (__stdcall *PLoadLibrary)(char *);
typedef DWORD (__stdcall *PGetLastError)();
typedef DWORD (__stdcall *sumfunc)(int , int);
struct data
{
HMODULE processHModule;
PGetProcAddress procGetProcAddress;
PLoadLibrary procLoadLibrary;
sumfunc procAddition;
char dllPath[512];
PGetLastError procGetLastError;
char lpFunctionName[256];
DWORD result;
int param1;
int param2;
DWORD procLastError1;
DWORD procLastError2;
}mydata;
void myfunc(struct data *mydata);
DWORD err;
int ret;
int main()
{

DWORD processID = 516;
DWORD SIZE_PAGE = 4096;
HANDLE processhandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID );
err = GetLastError();
LUID priviliges;
TOKEN_PRIVILEGES tkp;


HANDLE handleToken;

HANDLE processtokenhandle;

ret = OpenProcessToken(processhandle,TOKEN_ALL_ACCESS,&processtokenhandle);

err = GetLastError();

PTOKEN_GROUPS ptg = NULL;

DWORD process_token_len;

ret = 
GetTokenInformation(processtokenhandle,TokenGroups,(LPVOID)ptg,0,&process_token_len);

err = GetLastError();

SetLastError(0);

ptg = (PTOKEN_GROUPS)malloc(process_token_len*sizeof(TOKEN_GROUPS));

err = GetLastError();

ret = 
GetTokenInformation(processtokenhandle,TokenGroups,(LPVOID)ptg,process_token_len,&process_token_len);

err = GetLastError();

LUID luid;

TOKEN_PRIVILEGES tp;

ret = LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid);

err = GetLastError();

tp.PrivilegeCount = 1;

tp.Privileges[0].Luid = luid;

tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

ret = 
AdjustTokenPrivileges(processtokenhandle,false,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

err = GetLastError();


void *func;
func = 
VirtualAllocEx(processhandle,0,SIZE_PAGE,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
err = GetLastError();
struct data *funcdata;
funcdata = (struct data 
*)VirtualAllocEx(processhandle,0,SIZE_PAGE,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
err = GetLastError();
SetLastError(0);
ret = WriteProcessMemory(processhandle,func,&myfunc,SIZE_PAGE,0);
err = GetLastError();

struct data func_data , ret_func_data;
strcpy(func_data.dllPath,"C:\\CpProj\\sumDll\\Debug\\sumDll.dll");
err = GetLastError();

strcpy(func_data.lpFunctionName,"addition");
err = GetLastError();

HMODULE hkernel32;
hkernel32 = LoadLibrary("kernel32.dll");
err = GetLastError();

func_data.procLoadLibrary = (PLoadLibrary 
)GetProcAddress(hkernel32,"LoadLibraryW");
err = GetLastError();

func_data.procGetProcAddress = (PGetProcAddress 
)GetProcAddress(hkernel32,"GetProcAddress");
err = GetLastError();

func_data.procGetLastError = 
(PGetLastError)GetProcAddress(hkernel32,"GetLastError");

func_data.param1 = 10;
func_data.param2 = 20;

ret = WriteProcessMemory(processhandle,funcdata,&func_data,SIZE_PAGE,0);
err = GetLastError();

HANDLE thid;
DWORD rc;
thid = 
CreateRemoteThread(processhandle,0,0,(LPTHREAD_START_ROUTINE)func,funcdata,0,&rc);

err = GetLastError();


rc = WaitForSingleObject(thid,5000); // even I tried keeping Infinite //instead 
of 5 secs.

err = GetLastError();




ret = 
ReadProcessMemory(processhandle,funcdata,&ret_func_data,sizeof(ret_func_data),0);
err = GetLastError();




return 1;
}
void myfunc(struct data *mydata)
{
mydata->processHModule = (HMODULE )(mydata->procLoadLibrary)(mydata->dllPath);
mydata->procLastError1 = (mydata->procGetLastError)();


mydata->procAddition = (sumfunc 
)(mydata->procGetProcAddress)(mydata->processHModule,mydata->lpFunctionName);
mydata->procLastError2 = (mydata->procGetLastError)();

mydata->result = (mydata->procAddition)(mydata->param1,mydata->param2);
err = GetLastError();

}



Thx
--Gopi





      Unlimited freedom, unlimited storage. Get it now, on 
http://help.yahoo.com/l/in/yahoo/mail/yahoomail/tools/tools-08.html/

[Non-text portions of this message have been removed]

Reply via email to