Code Injection Problem

01/01/2009 11:32 Gunnar1986#1
Der Original Code im Assembler ist "mov esi, [ecx+esi*8+4]"(read) und müsste auf die Adresse der Aktuell aktivierten Waffe zeigen. Der Wert esi hat für jede Waffe einen festgelegten Wert während ecx eine Adresse(verändert sich bei waffenwechsel nicht) beinhaltet. Mir geht es darum den Wert während die Schleife durchläuft wieder um 1 zu erhöhen wobei ich ein kleines Problem mit dem Syntax habe. Wie ändere ich den Code so um das er den Wert an der Adresse (esi, [ecx+esi*8+4]) um 1(oder mehr) erhöht?

Der Interpreter in T-Search gibt bei folgendem Code Fehler zurück:

add esi, [ecx+esi*8+4], 0x01 ;too many operands

add esi, [ecx+esi*8+4] [0x01] ;keine Fehlermeldung und auch nicht der gewünschte Effekt

Vermutlich liegt der Fehler im add, nur weis ich nicht wie ich den Code sonst schreiben soll da ich mich mit der Syntax nicht so auskenne. Es muss nicht unbedingt die Lösung sein, ein Tip mit dem ich das Problem selber lösen kann würde genügen.

EDIT: ich hab mal testweise "mov esi, [ecx+esi*8+4]" in "mov [ecx+esi*8+4], esi" umgeändert

Die Munition wurde zwar nichtmehr verbraucht aber dafür sind auch jede menge andere merkwürdigkeiten passiert.

2. EDIT: "http://www.itm.uni-luebeck.de/teaching/ws0607/info3/uebung/Info3-WS0607-Assembler-3.pdf?lang=de" hilft weiter, die Lösung fehlt noch

3. EDIT: "http://www.itm.uni-luebeck.de/teaching/ws0607/info3/uebung/Info3-WS0607-Assembler-1.pdf?lang=de"
"http://www.itm.uni-luebeck.de/teaching/ws0607/info3/uebung/Info3-WS0607-Assembler-2.pdf?lang=de"
"http://www.itm.uni-luebeck.de/teaching/ws0607/info3/uebung/Info3-WS0607-Assembler-3.pdf?lang=de"
"http://www.itm.uni-luebeck.de/teaching/ws0607/info3/uebung/Info3-WS0607-Assembler-4.pdf?lang=de"
Assembler-Syntax sehr gut erklärt.

4. EDIT: Hier die Subroutine fals jmd etwas damit anfangen kann.

.text:004BD7CC mov eax, [esp+1Ch+var_8]
.text:004BD7D0 test eax, eax
.text:004BD7D2 jz loc_4BD8D6
.text:004BD7D8 mov ecx, [ebx+18h]
.text:004BD7DB mov edx, [esp+1Ch+arg_0]
.text:004BD7DF mov esi, [ecx+esi*8+4] ;der Wert vom T-Searchdebugger(read)
.text:004BD7E3 mov ecx, [edx+0Ch]
.text:004BD7E6 lea eax, [edx+0Ch]
.text:004BD7E9 lea edx, [esp+1Ch+var_8]
.text:004BD7ED push esi
.text:004BD7EE push edx
.text:004BD7EF push eax
.text:004BD7F0 mov [esp+28h+var_C], esi
.text:004BD7F4 call dword ptr [ecx+10h]
.text:004BD7F7 mov eax, [esp+1Ch+arg_8]
.text:004BD7FB mov [esp+1Ch+arg_0], 0
.text:004BD803 push eax
.text:004BD804 call sub_52D370
.text:004BD809 mov ebp, [ebx+4]
.text:004BD80C xor edx, edx
.text:004BD80E mov ecx, eax
.text:004BD810 xor esi, esi
.text:004BD812 div ebp
.text:004BD814 cmp ebp, esi
.text:004BD816 mov [esp+1Ch+var_4], ecx
.text:004BD81A mov [esp+1Ch+arg_C], esi
.text:004BD81E mov edi, edx
.text:004BD820 jle short loc_4BD879
01/03/2009 02:38 Loonatec420#2
ich habs selber nich getestet, aber versuch doch mal was in der art:

mov esi, [ecx+esi*8+4] //in esi hast die adresse die auf den wert der waffe zeigt

(so hab ich das zumindest verstanden^^)

push eax
mov eax,1
add [esi],eax
pop eax

musst mal schauen ob das klappt mit dem umweg über ein hilfsregister
01/03/2009 16:31 link#3
ESI enthält den Wert aus der Adresse, aber nicht diese.
Also würde "add [esi],eax" wahrscheinlich wegen Zugriffsverletzung das Programm zum Absturz bringen.
Es müsste wohl eher "inc [ecx+esi*8+4]" lauten.
01/03/2009 19:43 Loonatec420#4
für mich hat sich das angehört als ob ESI eine adresse enthält nach dem befehl
mov esi, [ecx+esi*8+4]

sollte ESI aber schon den wert enthalten und nich die adresse an welcher der wert im speicher steht dann greift man halt gleich auf "ESI" zu und nich auf "[ESI]".

das mit dem weg über das register und dem add hab ich mir so angewöhnt um sicher zu stellen, dass mit dword grössen gearbeitet wird. wenn man direkt auf dem speicher "inced" wird wohl zwar in diesem fall nix passieren, da der speicher defaultmässig mit dword arbeitet, aber damals mit MASM und 16bit register gabs bei mir schonmal probs mit variablen als DB angelegt und dann mit word pointern arbeiten kam nich so gut ^^
01/03/2009 21:20 Gunnar1986#5
Leider funktioniert das nicht da ESI auch andere Adressen beinhaltet(genauso wie die anderen Teile im Code die auf die Adresse zugreifen). Kennt jmd zufällig ein gutes Tutorial(am besten verschiedene) zum Thema Basiswert? Am einfachsten währe es ja die errechnete Adresse an einen Offset zu schreiben und von dort auszulesen, nur wird dann ständig eine neue Adresse reinkopiert.