Dann versuchs mal mit Windows+M, Alt+F4, Enter. :rtfm:Quote:
Originally Posted by erh4nDann schließt sich nur mein internet-.-
/*
* Coded by: Doktor.
* Language: C / ASM
* -----------------
* Reworked by: aiimsh0ckz
* Language: C++ / ASM
* Added declarations,
* attached some {}'s to have a clean text
*/
/* Shut compilers mouth .. */
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <iostream>
bool DetourFunc(BYTE *, BYTE *, DWORD);
bool DetourFunc(BYTE *oldFunc, BYTE *newFunc, DWORD len)
{
BYTE *newMem4base = NULL;
DWORD dwOld;
newMem4base = (BYTE *)malloc(5 + len);
if (newMem4base == NULL) {
return (false);
}
for (DWORD i = 0; i < (len + 5); ++i) {
newMem4base[i] = 0x90;
}
VirtualProtect(oldFunc, len, PAGE_READWRITE, &dwOld);
memcpy(newMem4base, oldFunc, len);
oldFunc[0] = 0xE8;
* (DWORD *)(oldFunc + 0x01) = DWORD(newFunc - oldFunc - 5);
oldFunc[5] = 0xE9;
* (DWORD *)(oldFunc + 0x06) = DWORD(newMem4base - (oldFunc + 0x5) - 5);
newMem4base += len;
newMem4base[0] = 0xE9;
* (DWORD *)(newMem4base + 0x01) = DWORD((oldFunc + 10) - newMem4base - 5);
for (DWORD i = 10; i < len; ++i) {
oldFunc[i] = 0x90;
}
return (true);
}
bool bDataCompare(const unsigned char *, const unsigned char *, const char *);
bool bDataCompare(const unsigned char *pData, const unsigned char *bMask, const char *szMask)
{
for (; *szMask; ++szMask, ++pData, ++bMask) {
if (*szMask == 'x' && *pData != *bMask) {
return (false);
}
return ((*szMask) == 0);
}
}
DWORD dwFindPattern(BYTE *, char *);
DWORD dwFindPattern(BYTE *bMask, char *szMask)
{
DWORD dw_Address = 0x00400000;
DWORD dw_Len = 0x00436000;
for (DWORD i = 0; i < dw_Len; ++i) {
if (bDataCompare((unsigned char *)(dw_Address + i), bMask, szMask)) {
return ((DWORD)(dw_Address + i));
}
}
return (0);
}
void hkSend(void);
void hkSend(void)
{
char *packet;
_asm
{
pushad
pushfd
MOV packet, EDX
}
std::cout << "Send: " << packet << std::endl;
_asm
{
popfd
popad
}
}
void hkRecv(void);
void hkRecv(void)
{
char *packet;
_asm
{
pushad
pushfd
MOV packet, EDX
}
std::cout << "Recv: " << packet << std::endl;
_asm
{
popfd
popad
}
}
DWORD WINAPI tThread(LPVOID);
DWORD WINAPI tThread(LPVOID param)
{
AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
/* Send */
BYTE s_bPatter[] = { 0x53, 0x56, 0x8B, 0xF2, 0x8B, 0xD8, 0xEB, 0x04 };
char *s_cPatter = "xxxxxxxx";
DWORD dSend = dwFindPattern(s_bPatter, s_cPatter);
/* Recv */
BYTE r_bPatter[] = { 0x55, 0x8B, 0xEC, 0x83, 0xC4, 0xF4, 0x53, 0x56,
0x57, 0x33, 0xC9, 0x89, 0x4D, 0xF4, 0x89, 0x55,
0xFC, 0x8B, 0xD8, 0x8B, 0x45, 0xFC };
char *r_cPatter = "xxxxxxxxxxxxxxxxxxxxxx";
DWORD dRecv = dwFindPattern(r_bPatter, r_cPatter);
DetourFunc((BYTE *)dSend, (BYTE *)&hkSend, 14);
DetourFunc((BYTE *)dRecv, (BYTE *)&hkRecv, 11);
return (0x0);
}
BOOL APIENTRY DllMain(HMODULE, DWORD, LPVOID);
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(nullptr, 0, tThread, nullptr, 0, nullptr);
DisableThreadLibraryCalls(hModule);
break;
}
return (TRUE);
}
Das war ihm wohl ein Fremdwort zu dieser Zeit.Quote:
Originally Posted by aiimsh0ckzAhja, Strukturierung ist dir auch ein Fremdwort? Ebenso wie DEKLARATION der Funktionen? Soll jetzt kein Werturteil sein Mich hat's nur gewundert.
Btw - irgendwie so - C++?
void _main();
void _main() {
}
Ohh shit, danke für den Tipp! Is'ne Win32-Application.Quote:
Originally Posted by BladeTiger12Was wieder rum vielleicht heißt, das du kein Dll-Projekt erstellt hast.
bool bDataCompare(const unsigned char *pData, const unsigned char *bMask, const char *szMask)
{
for (; *szMask; ++szMask, ++pData, ++bMask) {
if (*szMask == 'x' && *pData != *bMask) {
return (false);
}
} // <-- Hier die Schleife zu machen
return ((*szMask) == 0);
// } <-- ... und nicht hier
}
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <iostream>
bool DetourFunc(BYTE *, BYTE *, DWORD);
bool bDataCompare(const unsigned char *, const unsigned char *, const char *);
DWORD dwFindPattern(BYTE *, char *);
void hkSend(void);
void hkRecv(void);
DWORD WINAPI tThread(LPVOID);
BOOL APIENTRY DllMain(HMODULE, DWORD, LPVOID);
bool DetourFunc(BYTE *oldFunc, BYTE *newFunc, DWORD len)
{
BYTE *newMem4base = NULL;
DWORD dwOld;
newMem4base = (BYTE *)malloc(5 + len);
if (newMem4base == NULL) {
return (false);
}
for (DWORD i = 0; i < (len + 5); ++i) {
newMem4base[i] = 0x90;
}
VirtualProtect(oldFunc, len, PAGE_READWRITE, &dwOld);
memcpy(newMem4base, oldFunc, len);
oldFunc[0] = 0xE8;
* (DWORD *)(oldFunc + 0x01) = DWORD(newFunc - oldFunc - 5);
oldFunc[5] = 0xE9;
* (DWORD *)(oldFunc + 0x06) = DWORD(newMem4base - (oldFunc + 0x5) - 5);
newMem4base += len;
newMem4base[0] = 0xE9;
* (DWORD *)(newMem4base + 0x01) = DWORD((oldFunc + 10) - newMem4base - 5);
for (DWORD i = 10; i < len; ++i) {
oldFunc[i] = 0x90;
}
return (true);
}
bool bDataCompare(const unsigned char *pData, const unsigned char *bMask, const char *szMask)
{
for (; *szMask; ++szMask, ++pData, ++bMask) {
if (*szMask == 'x' && *pData != *bMask) {
return (false);
}
return ((*szMask) == 0);
}
}
DWORD dwFindPattern(BYTE *bMask, char *szMask)
{
DWORD dw_Address = 0x00400000;
DWORD dw_Len = 0x00436000;
for (DWORD i = 0; i < dw_Len; ++i) {
if (bDataCompare((unsigned char *)(dw_Address + i), bMask, szMask)) {
return ((DWORD)(dw_Address + i));
}
}
return (0);
}
void hkSend(void)
{
char *packet;
_asm
{
pushad
pushfd
MOV packet, EDX
}
std::cout << "Send: " << packet << std::endl;
_asm
{
popfd
popad
}
}
void hkRecv(void)
{
char *packet;
_asm
{
pushad
pushfd
MOV packet, EDX
}
std::cout << "Recv: " << packet << std::endl;
_asm
{
popfd
popad
}
}
DWORD WINAPI tThread(LPVOID param)
{
AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
/* Send */
BYTE s_bPatter[] = { 0x53, 0x56, 0x8B, 0xF2, 0x8B, 0xD8, 0xEB, 0x04 };
char *s_cPatter = "xxxxxxxx";
DWORD dSend = dwFindPattern(s_bPatter, s_cPatter);
/* Recv */
BYTE r_bPatter[] = { 0x55, 0x8B, 0xEC, 0x83, 0xC4, 0xF4, 0x53, 0x56,
0x57, 0x33, 0xC9, 0x89, 0x4D, 0xF4, 0x89, 0x55,
0xFC, 0x8B, 0xD8, 0x8B, 0x45, 0xFC };
char *r_cPatter = "xxxxxxxxxxxxxxxxxxxxxx";
DWORD dRecv = dwFindPattern(r_bPatter, r_cPatter);
DetourFunc((BYTE *)dSend, (BYTE *)&hkSend, 14);
DetourFunc((BYTE *)dRecv, (BYTE *)&hkRecv, 11);
return (0x0);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(nullptr, 0, tThread, nullptr, 0, nullptr);
DisableThreadLibraryCalls(hModule);
break;
}
return (TRUE);
}
Ich mach's öfters so ...vor der Funktion die Deklaration. :oQuote:
Originally Posted by Doktor.Funktionen so zu deklarieren hat auch wenig Sinn, da kann man die gleich definieren.
Oder man macht es halt so und deklariert sie ganz oben:
Hoffe ich bringe deklarieren und definieren mal wieder nicht durcheinander...
/* CODE */
Soweit ich weis ist der Pattern für Recv outdated, also möglich das er nicht funktioniert, außer du hast die in deinem Code geupdated. :D
Mfg.
Doktor.
unsigned int myFunkt(unsigned int); // Deklaration
/* Implementation */
unsigned int myFunkt(unsigned int para) {
...
return(rgw_watever);
}
void dieFunk(int,int);
void dieAndereFunk(int x, int y) {
dieFunk(x,y); // <--- Funktion kann hier schon aufgerufen werden
}
void dieFunk(int x, int y) {
// Do something....
}
void dieAndereFunk(int x, int y);
void dieAndereFunk(int x, int y) {
dieFunk(x,y); // <--- Funktion kann hier NICHT aufgerufen werden
}
void dieFunk(int x,int y);
void dieFunk(int x, int y) {
// Do something....
}
Jaa is ja klar. C-Basics.Quote:
Dadurch hast du aber halt keine weiteren Vorteile, außer wenn du die Funktion weiter oben deklarierst und dann eine andere Funktion schreibst kann du dort die vorher deklarierte Funktion schon nutzen.
z.B.:
Was bei deiner Variante nicht möglich wäre:Code:void dieFunk(int,int); void dieAndereFunk(int x, int y) { dieFunk(x,y); // <--- Funktion kann hier schon aufgerufen werden } void dieFunk(int x, int y) { // Do something.... }
Code:void dieAndereFunk(int x, int y); void dieAndereFunk(int x, int y) { dieFunk(x,y); // <--- Funktion kann hier NICHT aufgerufen werden } void dieFunk(int x,int y); void dieFunk(int x, int y) { // Do something.... }