import gradio as gr import spaces import torch from transformers import AutoTokenizer, AutoModelForCausalLM model_path = 'LLM4Binary/llm4decompile-9b-v2' # V2 Model tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16).cuda() description = f""" # LLM4Decompile 9B V2 This is a space for testing the [LLM4Decompile 9B V2 model](https://huggingface.co/LLM4Binary/llm4decompile-9b-v2). It expects to be given a decompiled function output by Ghidra. I simply copy and paste from the Ghidra GUI, but this is not the method recommended by the official model page, which could influence performance. I am not affiliated with the authors. """ @spaces.GPU(duration=120) def predict(input_asm): before = f"# This is the assembly code:\n"#prompt after = "\n# What is the source code?\n"#prompt input_prompt = before+input_asm.strip()+after inputs = tokenizer(input_prompt, return_tensors="pt").to(model.device) with torch.no_grad(): outputs = model.generate(**inputs, max_new_tokens=2048)### max length to 4096, max new tokens should be below the range c_func_decompile = tokenizer.decode(outputs[0][len(inputs[0]):-1]) return c_func_decompile demo = gr.Interface(fn=predict, description=description, examples=["""undefined4 func0(float param_1,long param_2,int param_3) { int local_28; int local_24; local_24 = 0; do { local_28 = local_24; if (param_3 <= local_24) { return 0; } while (local_28 = local_28 + 1, local_28 < param_3) { if ((double)((ulong)(double)(*(float *)(param_2 + (long)local_24 * 4) - *(float *)(param_2 + (long)local_28 * 4)) & SUB168(_DAT_00402010,0)) < (double)param_1) { return 1; } } local_24 = local_24 + 1; } while( true ); }""",""" undefined8 __cdecl FUN_004025f0(byte *param_1,int param_2) { do { *param_1 = ~*param_1; *param_1 = *param_1 - 0x37; *param_1 = *param_1 + 1; param_1 = param_1 + 1; param_2 = param_2 + -1; } while (param_2 != 0); return 0x3632000137; } """,""" void __thiscall FUN_00404f30(void *this,char param_1,uint param_2) { char *pcVar1; if ((param_1 != '\0') && (0xf < *(uint *)((int)this + 0x18))) { pcVar1 = *(char **)((int)this + 4); if (param_2 != 0) { std::_Traits_helper::copy_s<>((char *)((int)this + 4),0x10,pcVar1,param_2); } FUN_00405320(pcVar1); } *(undefined4 *)((int)this + 0x18) = 0xf; std::basic_string<>::_Eos((basic_string<> *)this,param_2); return; } """,""" char __thiscall FUN_008a28f0(void *param_1_00,FMOD_VECTOR *param_1,undefined4 ****param_2,undefined4 param_3, undefined4 param_4,float param_5) { char cVar1; undefined4 uVar2; undefined4 ****ppppuVar3; char *unaff_EBX; FMOD_VECTOR *pFVar4; char *pcVar5; undefined4 uVar6; FMOD_VECTOR *local_a8; undefined4 ***local_a4; undefined4 local_a0; uint uStack_90; basic_string<> abStack_8c [4]; basic_string<> local_88 [28]; basic_string<> abStack_6c [4]; undefined4 ***apppuStack_68 [5]; uint local_54 [8]; basic_string<> abStack_34 [28]; void *local_18; int iStack_14; undefined4 uStack_10; void *pvStack_c; undefined *puStack_8; undefined4 uStack_4; uStack_4 = 0xffffffff; puStack_8 = &LAB_009a39d4; pvStack_c = ExceptionList; if (param_1 == (FMOD_VECTOR *)0x0) { if (param_1_00 != (void *)0x0) { ExceptionList = &pvStack_c; std::basic_string<>::~basic_string<>((basic_string<> *)((int)param_1_00 + 4)); /* WARNING: Subroutine does not return */ operator_delete(param_1_00); } cVar1 = '\0'; } else { if (param_1_00 == (void *)0x0) { ExceptionList = &pvStack_c; if (0.1 < param_5) { ExceptionList = &pvStack_c; FUN_00736f20(); FUN_008a0dc0(); FMOD::Event::setCallback ((_func_FMOD_RESULT_FMOD_EVENT_ptr_FMOD_EVENT_CALLBACKTYPE_void_ptr_void_ptr_void_ ptr *)param_1,&LAB_008a0fb0); } } else { ExceptionList = &pvStack_c; uVar2 = FUN_00736f20(); uVar6 = 1; pcVar5 = "Manager::PlaySoundEvent(); attempting to register FMOD callback for 2D one-shot Event."; *(undefined4 *)((int)param_1_00 + 0x24) = uVar2; FMOD::Event::setCallback ((_func_FMOD_RESULT_FMOD_EVENT_ptr_FMOD_EVENT_CALLBACKTYPE_void_ptr_void_ptr_void_pt r *)param_1,&LAB_008a0fe0); FUN_008a0a60(param_1_00,pcVar5,uVar6); } uVar2 = 0; local_a8 = param_1; local_a4 = param_2; local_a0 = param_3; FMOD::Event::set3DAttributes(param_1,(FMOD_VECTOR *)&local_a8,(FMOD_VECTOR *)0x0); cVar1 = FUN_008a0a60("Manager::PlaySoundEvent(); attempting to set 3D attributes for a 3D one-sh ot Event." ,1,uVar2); if (cVar1 == '\0') { uVar2 = 0; FMOD::Event::getInfo((int *)param_1,(char **)0x0,(FMOD_EVENT_INFO *)&stack0xffffff4c); std::basic_string<>::basic_string<>(local_88,unaff_EBX); uStack_10 = 4; uVar2 = std::operator+<>(abStack_34, "Manager::PlaySoundEvent: unable to set3DAttributes for sound event ( " ,local_88,uVar2); uStack_10._0_1_ = 5; std::operator+<>(abStack_6c,uVar2,&DAT_00aa30ec); uStack_10._0_1_ = 7; std::basic_string<>::~basic_string<>(abStack_34); if (local_54[0] < 0x10) { apppuStack_68[0] = apppuStack_68; } FUN_008a0b10(apppuStack_68[0]); uStack_10 = CONCAT31(uStack_10._1_3_,4); std::basic_string<>::~basic_string<>(abStack_6c); uStack_10 = 0xffffffff; std::basic_string<>::~basic_string<>(local_88); cVar1 = '\0'; } else { pFVar4 = param_1; FMOD::Event::start(); cVar1 = FUN_008a0a60("Manager::PlaySoundEvent(); attempting to play 3D one-shot Event.",1, pFVar4); if (cVar1 == '\0') { uVar2 = 0; FMOD::Event::getInfo((int *)param_1,(char **)0x0,(FMOD_EVENT_INFO *)&stack0xffffff4c); std::basic_string<>::basic_string<>((basic_string<> *)local_54,unaff_EBX); iStack_14 = 0; uVar2 = std::operator+<>(abStack_8c,"Manager::PlaySoundEvent: Failed to start sound event (" ,local_54,uVar2); iStack_14._0_1_ = 1; std::operator+<>(&local_a8,uVar2,&DAT_00aa30ec); iStack_14._0_1_ = 3; std::basic_string<>::~basic_string<>(abStack_8c); ppppuVar3 = (undefined4 ****)local_a4; if (uStack_90 < 0x10) { ppppuVar3 = &local_a4; } FUN_008a0b10(ppppuVar3); iStack_14 = (uint)iStack_14._1_3_ << 8; std::basic_string<>::~basic_string<>((basic_string<> *)&local_a8); iStack_14 = 0xffffffff; std::basic_string<>::~basic_string<>((basic_string<> *)local_54); cVar1 = '\0'; } else if (0.1 < (float)param_2) { FUN_00736f20(); FUN_008a0dc0(); } } } ExceptionList = local_18; return cVar1; } """], inputs="text", outputs="text") demo.queue() demo.launch()