From 1c7c6cdeae20e824ad8447daec4dc12b3b286def Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Mon, 4 Aug 2025 21:53:58 +0200 Subject: Initial version. --- .gitignore | 5 + README.txt | 17 +++ gen-code.py | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++ killrun.sh | 6 ++ requirements.txt | 1 + run.sh | 44 ++++++++ valid/code-0000.smali | 58 ++++++++++ valid/code-0001.smali | 74 +++++++++++++ valid/code-0002.smali | 107 +++++++++++++++++++ valid/code-0003.smali | 60 +++++++++++ valid/code-0004.smali | 38 +++++++ valid/code-0005.smali | 52 +++++++++ valid/code-0006.smali | 60 +++++++++++ valid/code-0007.smali | 80 ++++++++++++++ valid/code-0008.smali | 58 ++++++++++ valid/code-0009.smali | 73 +++++++++++++ valid/code-0010.smali | 35 ++++++ valid/code-0011.smali | 82 ++++++++++++++ valid/code-0012.smali | 105 ++++++++++++++++++ valid/code-0013.smali | 98 +++++++++++++++++ valid/code-0014.smali | 82 ++++++++++++++ valid/code-0015.smali | 70 ++++++++++++ valid/code-0016.smali | 83 +++++++++++++++ valid/code-0017.smali | 63 +++++++++++ valid/code-0018.smali | 140 ++++++++++++++++++++++++ valid/code-0019.smali | 65 +++++++++++ valid/code-0020.smali | 108 +++++++++++++++++++ 27 files changed, 1954 insertions(+) create mode 100644 .gitignore create mode 100644 README.txt create mode 100644 gen-code.py create mode 100755 killrun.sh create mode 100644 requirements.txt create mode 100755 run.sh create mode 100644 valid/code-0000.smali create mode 100644 valid/code-0001.smali create mode 100644 valid/code-0002.smali create mode 100644 valid/code-0003.smali create mode 100644 valid/code-0004.smali create mode 100644 valid/code-0005.smali create mode 100644 valid/code-0006.smali create mode 100644 valid/code-0007.smali create mode 100644 valid/code-0008.smali create mode 100644 valid/code-0009.smali create mode 100644 valid/code-0010.smali create mode 100644 valid/code-0011.smali create mode 100644 valid/code-0012.smali create mode 100644 valid/code-0013.smali create mode 100644 valid/code-0014.smali create mode 100644 valid/code-0015.smali create mode 100644 valid/code-0016.smali create mode 100644 valid/code-0017.smali create mode 100644 valid/code-0018.smali create mode 100644 valid/code-0019.smali create mode 100644 valid/code-0020.smali diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3adbddd --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*~ +_env +messages.json +/code*.smali +test.dex diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..b2c10df --- /dev/null +++ b/README.txt @@ -0,0 +1,17 @@ + +References +---------- + +- https://source.android.com/docs/core/runtime/dalvik-bytecode + + +Useful Commands +--------------- + +$ < messages.json jq -r '.[] | .content, "-----------------------------------------------------"' + + +Valid codes +----------- + +- 0000 -> 0020 : initial version diff --git a/gen-code.py b/gen-code.py new file mode 100644 index 0000000..4328d2b --- /dev/null +++ b/gen-code.py @@ -0,0 +1,290 @@ + +import json +import re +import subprocess +import sys + +from ollama import chat, ChatResponse + + +__MODEL__ = 'qwen2.5-coder:7b' +#__MODEL__ = 'llama3.2:latest' +#__MODEL__ = 'qwen3:8b' +#__MODEL__ = 'mistral:7b' + +__OPTIONS__ = dict( + temperature=0.8, + #'repeat_penalty': 1.2 +) + + +__SYSTEM__PROMPT__ = ''' +You are an Android development engineer, writing low level code according to the instructions below. + +You are a powerful code editing assistant capable of writing code and creating artifacts in conversations with users, or modifying and updating existing artifacts as requested by users. + +An artifact refers to a runnable complete code snippet, you prefer to integrate and output such complete runnable code rather than breaking it down into several code blocks. + +''' +#Output only the smali-compatible code, without any additional descriptive text. + + +__SYSTEM__PROMPT__ = ''' +Act as an expert instructor with decades of experience in the Android ecosystem, low-level coding, software security, and reverse engineering. You can list all the Dalvik bytecode mnemonics. You know how to deal with all the Dalvik bytecode mnemonics and what to make the world know it. + +Your task is to write assembly code for the Dalvik Virtual Machine. The code has to be fully compatible with the smali assembler. + +# Coding and Response Practices + +- Use practical examples drawn from real-world open-source samples as inspiration to demonstrate techniques for coding complex structures. +- Encourage reasoning through original code writing before drawing conclusions and provide clear, concise explanations supported by annotated code and examples. +- After generation, please check the code execution again to ensure there are no errors in the output. + +# Output Format + +Avoid explanations and focus on code variety of Dalvik bytecode when producing code. Format the output in markdown for clarity, using only one code block for all code excerpts. + +All the generated code has to be included into one class only. +''' +# Include step-by-step reasoning where appropriate. + + + +__PREFIX__ = 'code-' + + +def send_message_to_ollama(messages, ins): + """Envoie de nouvelles instructions à ollama.""" + + ins = ins.lstrip().rstrip() + + print('--------------------') + print('<<') + print(ins) + print('<<') + + msg = { + 'role': 'user', + 'content': ins #.replace('\n', ' ') + } + + messages.append(msg) + + with open('messages.json', 'w') as fd: + json.dump(messages, fd) + + resp: ChatResponse = chat( + model=__MODEL__, + options=__OPTIONS__, + messages=messages, + ) + + #messages.append(resp.message) + + msg = { + 'role': resp.message.role, + 'content': resp.message.content + } + + messages.append(msg) + + print('--------------------') + print('>>') + print(resp.message.content) + print('>>') + print('--------------------') + + with open('messages.json', 'w') as fd: + json.dump(messages, fd) + + return resp.message.content + + +def dump_smali_code(data, index): + """Extrait le code Smali fournit par ollama.""" + + pattern = r'```(.*?)```' + code_blocks = re.findall(pattern, data, re.DOTALL) + + for blk in code_blocks: + + if blk.startswith('smali'): + blk = blk[len('smali'):] + + with open(__PREFIX__ + '%04u.smali' % index, 'w') as fd: + fd.write(blk) + + data = data.replace(blk, '') + print(data) + + print('Code written!') + + break + + +def compile_file(filename): + """Lance une compilation avec smali.""" + + cmd = 'java -jar smali-3.0.9-fat.jar a ' + filename + ' -o test.dex' + + process = subprocess.Popen( + cmd.split(' '), + stdout=subprocess.DEVNULL, + stderr=subprocess.PIPE, + text=True + ) + + # process.returncode sera toujours 0... + _, stderr = process.communicate() + + return stderr + + +def extract_errors(data): + """Liste toutes les erreurs renvoyées par l'assemblage.""" + + found = [] + + pat = re.compile("^" + __PREFIX__ + "\d+.smali\[(\d+),(\d+)] (.*)$") + + lines = data.split('\n') + + for l in lines: + + match = pat.match(l) + + if match: + + found.append({ + 'line': int(match.group(1)), + 'col': int(match.group(2)), + 'msg': match.group(3) + }) + + return found + + +def check_code(index): + """Génère au besoin une nouvelle requête pour corriger le code fourni.""" + + filename = __PREFIX__ + '%04u.smali' % index + + stderr = compile_file(filename) + + errors = extract_errors(stderr) + + next_msg = [] + + print('Errors? %d' % len(errors)) + + with open(filename, 'r') as fd: + content = fd.read().split('\n') + + for e in errors: + + if len(next_msg) == 0: + next_msg.append('The smali assembler encountered errors with the previously generated code.') + next_msg.append('') + next_msg.append('Here is the error list with location and bug origin:') + + assert(e['line'] > 0) + + next_msg.append('- at line %d column %d: %s (erroneous line content : "%s" )' \ + % (e['line'], e['col'], e['msg'], content[e['line'] - 1].lstrip())) + + if len(next_msg) > 0: + next_msg.append('') + next_msg.append('Please fix your code and provide an updated version of smali assembly code!') + next_msg.append('') + next_msg.append('Focus on name suffixes and operands while solving errors. Check if used instructions actually exist according to the Dalvik bytecode specifications. For instance, there is no mul-int/lit16 mnemonic.') + next_msg.append('') + next_msg.append('Remember to use only plain hexdecimal integers for numbers. Break long high level statements into several Dalvik instructions as much as possible.') + next_msg.append('') + next_msg.append('For instance, call to System.out.println has to translate to instructions relying on sget-object and invoke-virtual mnemonics.') + next_msg.append('') + next_msg.append('Line counter starts at 1.') + next_msg.append('') + next_msg.append('If you do not know how to fix the generated bytecode, rewrite it completely or remove the relative line. Do not hesitate to remove an entire function if there are too much issues inside it.') + + return '\n'.join(next_msg) + + +if __name__ == '__main__': + """Point d'entrée.""" + + if len(sys.argv) == 1: + + messages = [ + { + 'role': 'system', + 'content': __SYSTEM__PROMPT__ #.replace('\n', ' ') + } + ] + + messages = [] + + instructions = ''' +Write me a bunch of valid Android smali bytecode. Your goal is to write a demonstration of the Dalvik bytecode features. + +Try to use one function per instruction set category. Pick one target from the list below: +- Data handling +- Arithmetic and logic operations +- Control flow operations +- Specific instructions for highest Dex files versions (038 or 039) + +As demonstration, include some function implementing well-known algorithms such as Fibonacci sequence, FNV1a or murmuhash3 hashes, aso. + +Include all the created functions into one class only. + +Try to make sure that a lot of different Dalvik mnemonics are used. Mix as much different mnemonics as possible. + +Ensure that each instruction is used according its proper format. + +The result code HAS TO BE able to get assembled using the smali assembler without modification. +''' + instructions = ''' +Write me a bunch of valid Android smali bytecode. Your goal is to write a demonstration of the Dalvik bytecode features. + +Try to use one function per instruction set category. Pick one target from the list below: +- Data handling +- Arithmetic and logic operations +- Control flow operations +- Specific instructions for highest Dex files versions (038 or 039) + +Include all the created functions into one class only. + +Try to make sure that a lot of different Dalvik mnemonics are used. Mix as much different mnemonics as possible. + +Ensure that each instruction is used according its proper format. + +Do not write explainations. Do not write comments in generated Dalvik code. Use only plain hexdecimal integers for numbers. Break long high level statements into several Dalvik instructions as much as possible. + +For instance, call to System.out.println has to translate to instructions relying on sget-object and invoke-virtual mnemonics. + +The result code HAS TO BE able to get assembled using the smali assembler without modification. +''' + + response = send_message_to_ollama(messages, instructions) + + counter = 0 + dump_smali_code(response, counter) + + while True: + + instructions = check_code(counter) + + if len(instructions) == 0: + break + + response = send_message_to_ollama(messages, instructions) + + counter += 1 + dump_smali_code(response, counter) + + else: + + stderr = compile_file(sys.argv[1]) + + errors = extract_errors(stderr) + + sys.exit(0 if len(errors) == 0 else 1) diff --git a/killrun.sh b/killrun.sh new file mode 100755 index 0000000..4971f68 --- /dev/null +++ b/killrun.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +ps \ + | grep -E 'run.sh|time|python3' \ + | cut -d ' ' -f2 \ + | xargs -I{} kill -9 {} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..403abba --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +ollama diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..dd9c5cc --- /dev/null +++ b/run.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +mkdir -p valid + +counter=0 +valid=0 + +while true; +do + echo + echo + echo "===========================================================" + echo "========== RUN $counter (valid: $valid) ===================" + echo "===========================================================" + echo + echo + + rm -f code*smali messages.json + + timeout 25m time python3 ./gen-code.py + + if [ $? -eq 0 ]; then + + src=$( ls -t1 code*smali | head -1 ) + + dest=$( ls -1 valid/code-*smali 2> /dev/null | wc -l ) + dest=$( printf valid/code-%04u.smali $dest ) + + cp "$src" "$dest" + + valid=$(( valid + 1 )) + + fi + + counter=$(( counter + 1 )) + + for i in $( seq 10 ); + do + echo -n "." + sleep 1s + done + echo + +done diff --git a/valid/code-0000.smali b/valid/code-0000.smali new file mode 100644 index 0000000..6601296 --- /dev/null +++ b/valid/code-0000.smali @@ -0,0 +1,58 @@ + +.class public LBytecodeDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + invoke-direct {p0}, Ljava/lang/Object;->()V + return-void +.end method + +.method public static dataHandling()V + .locals 4 + const/16 v0, 0x1234 + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + new-instance v2, Ljava/lang/StringBuilder; + invoke-direct {v2}, Ljava/lang/StringBuilder;->()V + const-string v3, "Data handling: " + invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method + +.method public static arithmeticOperations()V + .locals 3 + const/4 v0, 0x7 + const/16 v1, 0xA + add-int/lit8 v2, v0, 0x3 + sub-int v3, v1, v2 + mul-int/lit8 v0, v2, 0x2 + div-int v1, v3, v0 + rem-int v2, v1, v0 + const/16 v0, 0x15 + and-int v1, v2, v0 + or-int v2, v1, v0 + xor-int v1, v2, v0 + shl-int v2, v1, v0 + shr-int v1, v2, v0 + neg-int v2, v1 + return-void +.end method + +.method public static controlFlowOperations()V + .locals 3 + const/4 v0, 0x5 + if-eqz v0, :cond_true + goto :cond_false +:cond_true + const-string v1, "Condition is true" + goto :end_if +:cond_false + const-string v1, "Condition is false" +:end_if + sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v2, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method diff --git a/valid/code-0001.smali b/valid/code-0001.smali new file mode 100644 index 0000000..3c2a375 --- /dev/null +++ b/valid/code-0001.smali @@ -0,0 +1,74 @@ + +.class public LBytecodeDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + return-void +.end method + +.method public static dataHandling()V + .locals 3 + + const/4 v0, 0x1 + const/4 v1, 0x2 + + add-int/lit8 v2, v0, 0x3 + sub-int v2, v2, v1 + mul-int/lit8 v2, v2, 0x2 + div-int v2, v2, v0 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-string v1, "Data Handling: " + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V + + iput v2, p0, LBytecodeDemo;->result:I + return-void +.end method + +.method public static arithmeticLogic()V + .locals 3 + + const/4 v0, 0x5 + const/4 v1, 0x3 + + add-int v2, v0, v1 + sub-int v2, v2, v1 + mul-int/lit8 v2, v2, 0x2 + div-int v2, v2, v0 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-string v1, "Arithmetic and Logic Operations: " + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V + + iput v2, p0, LBytecodeDemo;->result:I + return-void +.end method + +.method public static controlFlow()V + .locals 3 + + const/4 v0, 0x1 + const/4 v1, 0x5 + + if-eq v0, v1, :cond_true + goto :cond_false + +:cond_true + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-string v1, "Control Flow True" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void + +:cond_false + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-string v1, "Control Flow False" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method diff --git a/valid/code-0002.smali b/valid/code-0002.smali new file mode 100644 index 0000000..592c3ce --- /dev/null +++ b/valid/code-0002.smali @@ -0,0 +1,107 @@ + +.class public LSmaliDemo; +.super Ljava/lang/Object; + +.method static public main([Ljava/lang/String;)V + .locals 4 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-string v1, "Hello, Dalvik!" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + new-instance v2, Ljava/util/ArrayList; + invoke-direct {v2}, Ljava/util/ArrayList;->()V + sput-object v2, LSmaliDemo;->list:Ljava/util/ArrayList; + + const/4 v3, 0x1 + invoke-virtual {v2, v3}, Ljava/util/ArrayList;->add(I)V + + return-void +.end method + +.method public test_data_handling()V + .locals 5 + + new-instance v0, LSmaliDemo; + invoke-direct {v0}, LSmaliDemo;->()V + + const/16 v1, 0x10 + iput v1, v0, LSmaliDemo;->dataField:I + + iget v2, v0, LSmaliDemo;->dataField:I + add-int/lit8 v3, v2, 0x2 + iput v3, v0, LSmaliDemo;->dataField:I + + return-void +.end method + +.method public test_arithmetic_logic_operations()V + .locals 4 + + new-instance v0, LSmaliDemo; + invoke-direct {v0}, LSmaliDemo;->()V + + const/4 v1, 0x5 + const/4 v2, 0x3 + invoke-static {v1, v2}, Ljava/lang/Math;->max(II)I + move-result v3 + iput v3, v0, LSmaliDemo;->resultField:I + + return-void +.end method + +.method public test_control_flow_operations()V + .locals 3 + + new-instance v0, LSmaliDemo; + invoke-direct {v0}, LSmaliDemo;->()V + + const/4 v1, 0x1 + if-eqz v1, :cond_true + goto :cond_false + + :cond_true + sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v3, "Condition is true" + invoke-virtual {v2, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + goto :end_if + + :cond_false + sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v3, "Condition is false" + invoke-virtual {v2, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + :end_if + return-void +.end method + +.method public test_high_dex_instructions()V + .locals 4 + + new-instance v0, LSmaliDemo; + invoke-direct {v0}, LSmaliDemo;->()V + + const-string v1, "Hello" + invoke-static {v1}, Ljava/lang/String;->valueOf(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v2 + iput-object v2, v0, LSmaliDemo;->stringField:Ljava/lang/String; + + const/4 v3, 0x3 + if-eqz v3, :cond_true_2 + goto :cond_false_2 + + :cond_true_2 + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v2, "True branch" + invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + goto :end_if_2 + + :cond_false_2 + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v2, "False branch" + invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + :end_if_2 + return-void +.end method diff --git a/valid/code-0003.smali b/valid/code-0003.smali new file mode 100644 index 0000000..19b8c43 --- /dev/null +++ b/valid/code-0003.smali @@ -0,0 +1,60 @@ + +.class public LBytecodeDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + + # Constructor + return-void +.end method + +# Data handling +.method public static handleData(I[I)I + .locals 4 + + iget-object v0, p0, LBytecodeDemo;->data:I + iput-object v1, p0, LBytecodeDemo;->data:I + + return-void +.end method + +# Arithmetic and logic operations +.method public static arithLogic(I)V + .locals 4 + + const/4 v0, 0x5 + add-int/lit8 v1, v0, 0x3 + sub-int v2, v1, p1 + mul-int v3, v2, p1 + div-int v0, v3, p1 + + return-void +.end method + +# Control flow operations +.method public static controlFlow(I)V + .locals 3 + + if-eqz p1, :cond_true + + const/4 v0, 0x1 + goto :end_if + +:cond_true + const/4 v0, 0x0 + +:end_if + return-void +.end method + +# Specific instructions for highest Dex files versions (038 or 039) +.method public static specificInstructions(I)V + .locals 5 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Hello, World!" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method diff --git a/valid/code-0004.smali b/valid/code-0004.smali new file mode 100644 index 0000000..5cad6c6 --- /dev/null +++ b/valid/code-0004.smali @@ -0,0 +1,38 @@ + +.class public LExample; +.super Ljava/lang/Object; + +.method static constructor ()V + .locals 0 + + return-void +.end method + +.method public test_data_handling()V + .locals 4 + + const/16 v0, 0x1234 + sput-object v0, LExample;->data:Ljava/lang/Object; + + new-instance v0, Ljava/lang/String; + iput-object v0, p0, LExample;->stringData:Ljava/lang/String; + + return-void +.end method + +.method public test_control_flow()V + .locals 2 + + const/16 v0, 0x5 + const/16 v1, 0x8 + + if-gt v0, v1, :cond_true + + goto :end_if + +:cond_true + return-void + +:end_if + return-void +.end method diff --git a/valid/code-0005.smali b/valid/code-0005.smali new file mode 100644 index 0000000..f9b2481 --- /dev/null +++ b/valid/code-0005.smali @@ -0,0 +1,52 @@ + +.class public LMyDalvikDemo; +.super Ljava/lang/Object; + +.method public static main([Ljava/lang/String;)V + .locals 5 + + # Data handling + const/16 v0, 0x1234 + sput-object v0, LMyDalvikDemo;->myStaticField:I + + # Arithmetic and logic operations + const/16 v1, 0x5678 + add-int/lit16 v2, v1, 0x9ABC + mul-int v3, v2, v1 + neg-int v4, v3 + + # Control flow operations + if-nez v4, :cond_true + goto :cond_false + +:cond_true + const-string v4, "Condition is true" + goto :print_result + +:cond_false + const-string v4, "Condition is false" + +:print_result + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v0, v4}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method + +.method public static getStaticField()I + .locals 1 + + sget-object v0, LMyDalvikDemo;->myStaticField:I + return v0 +.end method + +.method private myPrivateMethod(I)V + .locals 1 + + add-int/lit8 v0, p1, 0x10 + iput v0, p0, LMyDalvikDemo;->myInstanceField:I + return-void +.end method + +.field public static myStaticField:I +.field private myInstanceField:I diff --git a/valid/code-0006.smali b/valid/code-0006.smali new file mode 100644 index 0000000..1b836b6 --- /dev/null +++ b/valid/code-0006.smali @@ -0,0 +1,60 @@ + +.class public LdalvikBytecodeDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + return-void +.end method + +.method public static testDataHandling()V + .locals 3 + + const/4 v0, 0x1 + add-int/lit8 v0, v0, 0x1 + sub-int v1, v0, v1 + mul-int v2, v0, v1 + div-int v3, v2, v1 + rem-int v4, v2, v1 + return-void +.end method + +.method public static testArithmeticLogicOperations()V + .locals 5 + + const/4 v0, 0x1 + or-int v1, v0, v0 + xor-int v2, v0, v0 + shl-int v3, v0, v0 + shr-int v4, v0, v0 + return-void +.end method + +.method public static testControlFlowOperations()V + .locals 2 + + const/4 v0, 0x1 + if-eqz v0, :cond_true + goto :cond_false +:cond_true + const-string v0, "True" + return-void +:cond_false + const-string v1, "False" + return-void +.end method + +.method public static testSpecificInstructions()V + .locals 3 + + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + const/4 v1, 0x1 + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + const-string v2, "Hello" + invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + return-void +.end method diff --git a/valid/code-0007.smali b/valid/code-0007.smali new file mode 100644 index 0000000..ea37054 --- /dev/null +++ b/valid/code-0007.smali @@ -0,0 +1,80 @@ + +.class public LSmaliDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + + return-void +.end method + +.method public static dataHandlingExample()V + .locals 4 + + const/16 v0, 0x1234 + const/16 v1, 0x5678 + const/16 v2, 0x9ABC + const/16 v3, 0xDEF0 + + sput-object v0, LSmaliDemo;->dataField:I + + return-void +.end method + +.method public static arithmeticAndLogicOperationsExample()V + .locals 4 + + const/4 v0, 5 + const/4 v1, 3 + + add-int v2, v0, v1 + sub-int v3, v0, v1 + mul-int v0, v2, v3 + div-int v1, v0, v2 + + return-void +.end method + +.method public static controlFlowExample()V + .locals 1 + + const/4 v0, 0 + + if-eqz v0, :cond_0 + goto :cond_1 + +:cond_0 + const/4 v0, 1 + goto :cond_2 + +:cond_1 + const/4 v0, 2 + goto :cond_2 + +:cond_2 + return-void +.end method + +.method public static highestDexVersionExample()V + .locals 3 + + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + + const/16 v1, 0x1234 + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + + const-string v1, "Hello" + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v1 + + sput-object v1, LSmaliDemo;->stringField:Ljava/lang/String; + + return-void +.end method + +.field private static dataField:I + +.field private static stringField:Ljava/lang/String; diff --git a/valid/code-0008.smali b/valid/code-0008.smali new file mode 100644 index 0000000..061cd0a --- /dev/null +++ b/valid/code-0008.smali @@ -0,0 +1,58 @@ + +.class public LSmaliDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + + return-void +.end method + +.method public static main([Ljava/lang/String;)V + .locals 12 + + const/4 v0, 0x5 + sget-object v1, Ljava/io/System;->out:Ljava/io/PrintStream; + + const-string v2, "Hello" + invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + const-string v3, "World" + invoke-virtual {v1, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + sget-object v4, LSmaliDemo;->instance:Ljava/lang/Object; + + new-instance v5, Ljava/lang/StringBuilder; + const-string v6, "Sum: " + invoke-direct {v5, v6}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V + + const/16 v7, 0x2A + iput v7, v5, Ljava/lang/StringBuilder;->value:Ljava/lang/Object; + + invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v8 + + invoke-virtual {v1, v8}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + const/4 v9, 0x7 + const/4 v10, 0x3 + + add-int v11, v9, v10 + + new-instance v12, Ljava/lang/StringBuilder; + const-string v13, "Result: " + invoke-direct {v12, v13}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V + + iput v11, v12, Ljava/lang/StringBuilder;->value:Ljava/lang/Object; + + invoke-virtual {v12}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v14 + + invoke-virtual {v1, v14}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method + +.field static instance:Ljava/lang/Object; + +.field public static final serialVersionUID:I = 0x0 diff --git a/valid/code-0009.smali b/valid/code-0009.smali new file mode 100644 index 0000000..0648e34 --- /dev/null +++ b/valid/code-0009.smali @@ -0,0 +1,73 @@ + +.class public LdalvikBytecodeDemo; + +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + return-void +.end method + +.method public dataHandling()V + .locals 2 + + const/16 v0, 0x1234 + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V + + return-void +.end method + +.method public arithmeticLogic()V + .locals 3 + + const/16 v0, 0x1234 + const/16 v1, 0x5678 + add-int v0, v0, v1 + mul-int v0, v0, v1 + xor-int v0, v0, v1 + div-int v0, v0, v1 + + return-void +.end method + +.method public controlFlow()V + .locals 1 + + const/16 v0, 0x1234 + if-eqz v0, :cond_true + + goto :cond_false + +:cond_true + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Condition true" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void + +:cond_false + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Condition false" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method + +.method public highestDexInstructions()V + .locals 4 + + const/16 v0, 0x1234 + const/16 v1, 0x5678 + add-int v0, v0, v1 + mul-int v0, v0, v1 + xor-int v0, v0, v1 + div-int v0, v0, v1 + + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v2, "Result: " + invoke-virtual {v1, v2}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V + invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V + + return-void +.end method diff --git a/valid/code-0010.smali b/valid/code-0010.smali new file mode 100644 index 0000000..7517f87 --- /dev/null +++ b/valid/code-0010.smali @@ -0,0 +1,35 @@ + +.class public LSmaliDemo; +.super Ljava/lang/Object; + +.method public static main([Ljava/lang/String;)V + .locals 7 + + # Data handling + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Hello, Smali!" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + # Arithmetic and logic operations + const v2, 5 + const v3, 3 + add-int/lit8 v4, v2, 2 + mul-int v5, v2, v3 + rem-int v6, v4, v5 + + # Control flow operations + if-eqz v6, :cond_true + goto :cond_false + +:cond_true + const-string v7, "Result is zero" + goto :print_result + +:cond_false + const-string v7, "Result is not zero" + +:print_result + invoke-virtual {v0, v7}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method diff --git a/valid/code-0011.smali b/valid/code-0011.smali new file mode 100644 index 0000000..ac50a33 --- /dev/null +++ b/valid/code-0011.smali @@ -0,0 +1,82 @@ + +.class public LSmaliDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + + return-void +.end method + +.method public static main([Ljava/lang/String;)V + .locals 4 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-string v1, "Hello, World!" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + new-instance v2, LSmaliDemo; + invoke-direct {v2}, LSmaliDemo;->()V + + iget-object v3, v2, LSmaliDemo;->data:Ljava/util/List; + + const/4 v4, 0x1 + aget-object v3, v3, v4 + invoke-virtual {v3}, Ljava/lang/Object;->toString()Ljava/lang/String; + move-result-object v3 + + invoke-virtual {v0, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method + +.method public static loadData()Ljava/util/List; + .locals 1 + + new-instance v0, Ljava/util/ArrayList; + invoke-direct {v0}, Ljava/util/ArrayList;->()V + + const-string v1, "Data" + invoke-virtual {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z + return-object v0 +.end method + +.method public static performArithmetic()V + .locals 2 + + const/4 v0, 0x5 + add-int/lit8 v0, v0, 0x2 + mul-int/lit8 v1, v0, 0x4 + return-void +.end method + +.method public static controlFlowDemo()V + .locals 1 + + const/16 v0, 0xa + const/4 v1, 0x5 + + if-gt v0, v1, :if_1 + + return-void + + :if_1 + new-instance v0, LSmaliDemo; + invoke-direct {v0}, LSmaliDemo;->()V + return-object v0 +.end method + +.method public static highVersionInstructions()V + .locals 2 + + const/4 v0, 0x1 + add-int/lit8 v0, v0, 0x2 + + const-wide/16 v1, 0x1000 + shr-long v1, v1, v0 + + invoke-static {}, LSmaliDemo;->loadData()Ljava/util/List; + + return-void +.end method diff --git a/valid/code-0012.smali b/valid/code-0012.smali new file mode 100644 index 0000000..a0f18ec --- /dev/null +++ b/valid/code-0012.smali @@ -0,0 +1,105 @@ + +.class public LDalvikDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 1 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Hello from Dalvik!" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method + +.method public dataHandling()V + .locals 3 + + const/16 v0, 0x10 + sput-object v0, LDalvikDemo;->dataField:Ljava/lang/Object; + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + sget-object v1, LDalvikDemo;->dataField:Ljava/lang/Object; + check-cast v1, Ljava/lang/String; + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + const-string v0, "Hello" + sput-object v0, LDalvikDemo;->dataField:Ljava/lang/Object; + + sget-object v0, LDalvikDemo;->dataField:Ljava/lang/Object; + check-cast v0, Ljava/lang/String; + invoke-virtual {v0}, Ljava/lang/String;->length()I + move-result v1 + + const/4 v2, 0x5 + if-lt v1, v2, :if_0 + return-void + + :if_0 + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Data is less than expected" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method + +.method public arithmeticOperations()V + .locals 3 + + sget-object v0, LDalvikDemo;->numField:I + const/4 v1, 0x2 + add-int v0, v0, v1 + move-result v0 + + sput v0, LDalvikDemo;->numField:I + + sget v0, LDalvikDemo;->numField:I + const/4 v1, 0x3 + mul-int/lit8 v0, v0, 0x5 + move-result v0 + + sput v0, LDalvikDemo;->numField:I + + return-void +.end method + +.method public controlFlowOperations()V + .locals 2 + + sget v0, LDalvikDemo;->controlField:I + const/4 v1, 0x1 + if-eqz v0, :if_0 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Control flow is working" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void + + :if_0 + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Control flow failed" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method + +.method public highestDexVersion()V + .locals 2 + + sget v0, LDalvikDemo;->highestField:I + const/4 v1, 0x5 + if-lt v0, v1, :if_0 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Highest Dex version is reached" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void + + :if_0 + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Highest Dex version is not reached" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method + +.field private dataField:Ljava/lang/Object; +.field private numField:I +.field private controlField:I +.field private highestField:I diff --git a/valid/code-0013.smali b/valid/code-0013.smali new file mode 100644 index 0000000..07297d9 --- /dev/null +++ b/valid/code-0013.smali @@ -0,0 +1,98 @@ + +.class public Lcom/example/BytecodeDemo; + +.super Ljava/lang/Object; + +# direct methods +.method constructor()V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + return-void +.end method + +# static methods +.method public static int_add(I I)I + .locals 1 + + add-int v0, p0, p1 + return v0 +.end method + +.method public static int_sub(I I)I + .locals 1 + + sub-int v0, p0, p1 + return v0 +.end method + +.method public static int_mul(I I)I + .locals 1 + + mul-int v0, p0, p1 + return v0 +.end method + +.method public static int_div(I I)I + .locals 1 + + div-int v0, p0, p1 + return v0 +.end method + +.method public static int_rem(I I)I + .locals 1 + + rem-int v0, p0, p1 + return v0 +.end method + +.method public static if_true(I)Z + .locals 1 + + add-int/lit8 v0, p0, 1 + return v0 +.end method + +.method public static if_false(I)Z + .locals 1 + + and-int/lit8 v0, p0, 2 + return v0 +.end method + +.method public static if_greater(I)Z + .locals 1 + + add-int/lit8 v0, p0, 3 + return v0 +.end method + +.method public static if_ge(I)Z + .locals 1 + + and-int/lit8 v0, p0, 4 + return v0 +.end method + +.method public static if_lesser(I)Z + .locals 1 + + add-int/lit8 v0, p0, 5 + return v0 +.end method + +.method public static if_le(I)Z + .locals 1 + + and-int/lit8 v0, p0, 6 + return v0 +.end method + +.method public static print_string(Ljava/lang/String;)V + .locals 2 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v0, p0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + return-void +.end method diff --git a/valid/code-0014.smali b/valid/code-0014.smali new file mode 100644 index 0000000..cb98fa6 --- /dev/null +++ b/valid/code-0014.smali @@ -0,0 +1,82 @@ + +.class public LBytecodeDemo; +.super Ljava/lang/Object; + +.method public static main([Ljava/lang/String;)V + .locals 4 + + const/16 v0, 0x1 + invoke-static {v0}, LBytecodeDemo;->add(I)V + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Data handling test passed" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method + +.method private static add(I)V + .locals 2 + + move-result-object p0 + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Data handling test passed" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method + +.method public static dataHandlingTest()V + .locals 3 + + const/4 v0, 0x0 + array-length v1, p0 + if-eqz v1, :cond_0 + move-result-object p0 + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Data handling test failed" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + :cond_0 + return-void +.end method + +.method public static arithmeticAndLogicOperationsTest()V + .locals 4 + + const/16 v0, 0x10 + add-int/lit8 v1, v0, 0x3 + sub-int v2, v1, v0 + mul-int/lit8 v0, v2, 0x7 + div-int/lit8 v1, v0, 0x5 + + sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v3, "Arithmetic and logic operations test passed" + invoke-virtual {v2, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method + +.method public static controlFlowOperationsTest()V + .locals 1 + + const/4 v0, 0x1 + if-eqz v0, :cond_0 + move-result-object p0 + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Control flow operations test failed" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + :cond_0 + return-void +.end method + +.method public static specificInstructionsTest()V + .locals 2 + + const-string v0, "Hello, World!" + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method diff --git a/valid/code-0015.smali b/valid/code-0015.smali new file mode 100644 index 0000000..c1cf6bd --- /dev/null +++ b/valid/code-0015.smali @@ -0,0 +1,70 @@ + +.class public LBytecodeDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + + return-void +.end method + +.method public testDataHandling()V + .locals 3 + + const/16 v0, 0x1234 + const/16 v1, 0x5678 + add-int v0, v0, v1 + iput v0, p0, LBytecodeDemo;->field:I + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + iget v1, p0, LBytecodeDemo;->field:I + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V + + return-void +.end method + +.method public testArithmeticLogic()V + .locals 3 + + const/4 v0, 0x5 + const/4 v1, 0x3 + add-int/lit8 v2, v0, 0x2 + mul-int v0, v2, v1 + div-int v0, v0, v1 + rem-int v0, v0, v1 + neg-int v0, v0 + + return-void +.end method + +.method public testControlFlow()V + .locals 1 + + const/4 v0, 0x5 + + if-eqz v0, :cond_true + goto :cond_false + +:cond_true + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Condition is true" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + goto :end_if + +:cond_false + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Condition is false" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + +:end_if + return-void +.end method + +.method public testDex38Instructions()V + .locals 2 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Hello from Dex 38" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method diff --git a/valid/code-0016.smali b/valid/code-0016.smali new file mode 100644 index 0000000..6b2b66e --- /dev/null +++ b/valid/code-0016.smali @@ -0,0 +1,83 @@ + +.class public Lcom/example/BytecodeDemo; + +.super Ljava/lang/Object; + +.method public constructor ()V + .registers 1 + + # Data handling + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Hello, World!" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method + +.method public static add(I I)I + .registers 2 + + # Arithmetic and logic operations + add-int v0, p0, p1 + return v0 +.end method + +.method public static multiply(I I)I + .registers 3 + + # Arithmetic and logic operations + mul-int v0, p0, p1 + return v0 +.end method + +.method public static compare(I I)Z + .registers 3 + + # Arithmetic and logic operations + cmp-long v0, p0, p1 + if-nez v0, :cond_0 + const/4 v0, 0x1 + return v0 + + :cond_0 + const/4 v0, 0x0 + return v0 +.end method + +.method public static loop(I)V + .registers 3 + + # Control flow operations + const/16 v0, 0x0 + :goto_0 + if-gez p0, :cond_0 + invoke-static {p0}, Lcom/example/BytecodeDemo;->add(I)I + move-result p0 + add-int/lit8 v0, v0, 1 + goto :goto_0 + + :cond_0 + return-void +.end method + +.method public static printArray([Ljava/lang/String;)V + .registers 3 + + # Control flow operations + const/4 v0, 0x0 + array-length v1, p0 + if-gez p0, :cond_0 + goto :goto_1 + + :loop_0 + aget-object v2, p0, v0 + sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + add-int/lit8 v0, v0, 1 + goto :loop_0 + + :cond_0 + return-void + + :goto_1 + return-void +.end method diff --git a/valid/code-0017.smali b/valid/code-0017.smali new file mode 100644 index 0000000..85e95af --- /dev/null +++ b/valid/code-0017.smali @@ -0,0 +1,63 @@ + +.class public LExample; +.super Ljava/lang/Object; + +.method private static handleData(I)I + .locals 3 + + # Data handling: const /16 v0, 0x1234 + const/16 v0, 0x1234 + + # Data handling: sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + + # Data handling: const-string v2, "Data handled value: " + const-string v2, "Data handled value: " + + # Data handling: invoke-virtual {v1, v2, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + invoke-virtual {v1, v2, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method + +.method private static arithmetic(I)V + .locals 3 + + # Arithmetic and logic operations: const /16 v0, 0x5678 + const/16 v0, 0x5678 + + # Arithmetic and logic operations: add-int/lit16 v1, v0, 0x1234 + add-int/lit16 v1, v0, 0x1234 + + # Arithmetic and logic operations: const-string v2, "Result of addition: " + const-string v2, "Result of addition: " + + # Arithmetic and logic operations: invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method + +.method private static controlFlow(I)V + .locals 3 + + # Control flow operations: const /16 v0, 0x9ABC + const/16 v0, 0x9ABC + + # Control flow operations: if-nez v0, :cond_true + if-nez v0, :cond_true + + goto :cond_false + + :cond_true + const-string v1, "Condition is true" + invoke-virtual {v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + goto :end + + :cond_false + const-string v1, "Condition is false" + invoke-virtual {v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + :end + return-void +.end method diff --git a/valid/code-0018.smali b/valid/code-0018.smali new file mode 100644 index 0000000..d21b9a9 --- /dev/null +++ b/valid/code-0018.smali @@ -0,0 +1,140 @@ + +.class public LDalvikBytecodeDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + return-void +.end method + +.method public dataHandlingTest()V + .locals 4 + + const/16 v0, 0x1A + const/16 v1, 0x2B + add-int v2, v0, v1 + sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(I)V + return-void +.end method + +.method public arithmeticLogicTest()V + .locals 4 + + const/16 v0, 0x1A + const/16 v1, 0x2B + sub-int v2, v0, v1 + neg-int v3, v2 + mul-int/lit8 v0, v3, 0x5 + div-int/lit8 v1, v0, 0x7 + rem-int/lit8 v2, v1, 0x3 + and-int v0, v2, v1 + or-int v1, v0, v2 + xor-int v0, v1, v2 + return-void +.end method + +.method public controlFlowTest()V + .locals 2 + + const/16 v0, 0x1A + if-eqz v0, :cond_1 + goto :label_0 + + :cond_1 + add-int/lit8 v0, v0, 0x5 + :label_0 + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V + return-void +.end method + +.method public specificInstructionsTest()V + .locals 5 + + const-wide v0, 0x12345678L + const-wide v1, 0x9ABCDEF0L + add-long v2, v0, v1 + sub-long v3, v0, v1 + neg-long v0, v2 + mul-long/lit16 v1, v3, 0x1234 + div-long/lit16 v2, v1, 0x5678 + rem-long/lit16 v3, v2, 0x9ABC + const-wide/16 v0, 0xDEF0L + shr-long/lit8 v1, v0, 0x3 + shl-long/lit8 v0, v1, 0x7 + return-void +.end method + +.method public stringOperationsTest()V + .locals 4 + + const-string v0, "Hello" + const-string v1, ", World!" + invoke-static {v0, v1}, Ljava/lang/String;->concat(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + return-void +.end method + +.method public arrayOperationsTest()V + .locals 5 + + new-array v0, 5, [I + const/16 v1, 0x1A + sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v2, v1}, Ljava/io/PrintStream;->println(I)V + aget-object v1, v0, 0 + const/4 v2, 0x2B + aput v2, v0, 1 + anewarray I, 3 + move-result-object v2 + const/16 v3, 0x3C + sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(I)V + aput v3, v2, 0 + return-void +.end method + +.method public objectOperationsTest()V + .locals 5 + + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + const-string v1, "Hello" + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + const-string v1, ", World!" + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v1 + sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v2, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + return-void +.end method + +.method public exceptionHandlingTest()V + .locals 3 + + try { + const/16 v0, 0x1A + if-eqz v0, :cond_2 + goto :label_1 + + :cond_2 + const-string v0, "Divide by zero error" + throw-verification-error v0 + + :label_1 + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V + } catch Ljava/lang/ArithmeticException; {:cond_2} { + :catchall_3 + move-exception v0 + sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; + invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + } + return-void +.end method diff --git a/valid/code-0019.smali b/valid/code-0019.smali new file mode 100644 index 0000000..9c0d8e7 --- /dev/null +++ b/valid/code-0019.smali @@ -0,0 +1,65 @@ + +.class public LSmaliDemo; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 1 + + invoke-direct {p0}, Ljava/lang/Object;->()V + return-void +.end method + +.method public static dataHandling()V + .locals 4 + const/16 v0, 0x1234 + sget-object v1, Ljava/lang/System.out;->out:Ljava/io/PrintStream; + new-instance v2, Ljava/lang/StringBuilder; + invoke-direct {v2}, Ljava/lang/StringBuilder;->()V + const-string v3, "Data handling example: " + invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + return-void +.end method + +.method public static arithmeticLogicOperations()V + .locals 5 + const/4 v0, 0x78 + const/16 v1, 0x9ABC + add-int/lit16 v2, v0, v1 + sub-int/lit16 v3, v1, v0 + mul-int/lit8 v4, v0, 0x5 + div-int/lit16 v0, v2, v3 + rem-int/lit16 v1, v2, v3 + return-void +.end method + +.method public static controlFlowOperations()V + .locals 2 + const/4 v0, 0x1 + if-eqz v0, :cond_true + goto :end_if + + :cond_true + sget-object v0, Ljava/lang/System.out;->out:Ljava/io/PrintStream; + const-string v1, "Control flow example: True" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + + :end_if + return-void +.end method + +.method public static specificInstructions()V + .locals 2 + const/4 v0, 0x1 + if-eqz v0, :cond_true + goto :end_if + + :cond_true + sget-object v0, Ljava/lang/System.out;->out:Ljava/io/PrintStream; + const-string v1, "Specific instructions example: True" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + + :end_if + return-void +.end method diff --git a/valid/code-0020.smali b/valid/code-0020.smali new file mode 100644 index 0000000..24d6118 --- /dev/null +++ b/valid/code-0020.smali @@ -0,0 +1,108 @@ + +.class public LMyDalvikCode; +.super Ljava/lang/Object; + +.method public constructor ()V + .locals 1 + + const/4 v0, 0x0 + invoke-direct {p0, v0}, Ljava/lang/Object;->()V + + return-void +.end method + +.method public test_data_handling()V + .locals 2 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-string v1, "Data handling test" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method + +.method public test_arithmetic_logic_operations()V + .locals 3 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const/4 v1, 0x10 + const/4 v2, 0x5 + + add-int/lit8 v1, v1, 0x1 + sub-int/lit8 v2, v2, 0x1 + + mul-int/lit8 v1, v1, 0x2 + div-int/lit8 v2, v2, 0x2 + + rem-int/lit8 v1, v1, 0x3 + neg-int v2, v2 + + const-string v3, "Arithmetic logic operations: " + invoke-virtual {v0, v3}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V + + move-object v3, v0 + + invoke-virtual {v3, v1}, Ljava/io/PrintStream;->println(I)V + invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(I)V + + return-void +.end method + +.method public test_control_flow_operations()V + .locals 4 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const/4 v1, 0x5 + const/4 v2, 0x3 + + if-nez v1, :cond_true + goto :cond_false + + :cond_true + const-string v1, "Control flow: True" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + goto :end_if + + :cond_false + const-string v1, "Control flow: False" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + :end_if + + return-void +.end method + +.method public test_high_dex_version()V + .locals 3 + .registers 4 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-string v1, "High Dex version test" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + const/4 v2, 0x10 + const/4 v3, 0x5 + + add-int/lit8 v2, v2, 0x1 + sub-int/lit8 v3, v3, 0x1 + + mul-int/lit8 v2, v2, 0x2 + div-int/lit8 v3, v3, 0x2 + + rem-int/lit8 v2, v2, 0x3 + neg-int v3, v3 + + const-string v1, "Result: " + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V + + move-object v1, v0 + + invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(I)V + invoke-virtual {v1, v3}, Ljava/io/PrintStream;->println(I)V + + return-void +.end method -- cgit v0.11.2-87-g4458