CN110673899B - 一种程序处理方法及相关设备 - Google Patents

一种程序处理方法及相关设备 Download PDF

Info

Publication number
CN110673899B
CN110673899B CN201810720086.3A CN201810720086A CN110673899B CN 110673899 B CN110673899 B CN 110673899B CN 201810720086 A CN201810720086 A CN 201810720086A CN 110673899 B CN110673899 B CN 110673899B
Authority
CN
China
Prior art keywords
code
jump
stub
hook
program
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201810720086.3A
Other languages
English (en)
Other versions
CN110673899A (zh
Inventor
周志刚
张文明
陈少杰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tibet Fengzikai Industrial Co ltd
Original Assignee
Wuhan Douyu Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201810720086.3A priority Critical patent/CN110673899B/zh
Publication of CN110673899A publication Critical patent/CN110673899A/zh
Application granted granted Critical
Publication of CN110673899B publication Critical patent/CN110673899B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明实施例公开了一种程序处理方法及相关设备,用于提高在进行hook操作时,不被安全程序检测到的几率。本发明实施例方法包括:编写无作用汇编指令,该无作用汇编指令为不影响程序的执行功能的指令;根据该无作用汇编指令编写跳转代码和跳转桩代码,该跳转代码包括第一跳转代码和第二跳转代码;备份该待hook原始代码,将该待hook原始代码修改为该第一跳转代码;当执行到该待hook原始代码时,根据该第一跳转代码从该待hook原始代码跳转到该跳转桩代码,并暂停该程序中所有的线程;执行完成该跳转桩代码后,根据该第二跳转代码从该跳转桩代码跳转到备份的该待hook原始代码;恢复该程序中所有的线程,以继续执行该待hook原始代码。

Description

一种程序处理方法及相关设备
技术领域
本发明涉及控制技术领域,尤其涉及一种程序处理方法及相关设备。
背景技术
目前,对于基于Windows平台开发的一些软件来说,其功能也越来越丰富。同时,基于Windows平台的强大支撑,可以开发一些特殊功能的软件,如监控某个程序的所有读写文件,监控键盘输入,监控网络流量等等。然而对于Windows平台来说,很多功能都需要通过hook的方式来实现,例如监控一个程序打开的所有文件,则可以通过hook该打开文件的应用程序编程接口(application programming interface,API)函数,从而可以得到该打开文件的所有文件名。目前来说,hook的方式有很多种,而通过inlinehook则可以实现的功能更多,所谓inlinehook,指通过修改代码,来增加jump指令修改执行流程跳转到hook功能逻辑中。
然而,对于游戏程序或者其他安全程序来说,为了阻止hook,通常都会对程序是否有进行hook来检测。因此,如何绕过游戏程序或者安全程序的检测以提高hook的成功率,是一个值得探究的问题。
发明内容
本发明实施例提供了一种程序处理方法及相关设备,用于提高在进行hook操作时,不被安全程序检测到的几率。
本发明实施例的第一方面提供了一种程序处理方法,包括:编写无作用汇编指令,所述无作用汇编指令为不影响程序的执行功能的指令;根据所述无作用汇编指令编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述程序中待hook原始代码跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述待hook原始代码,所述跳转桩代码包括需插入的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;备份所述待hook原始代码,将所述待hook原始代码修改为所述第一跳转代码;当执行到所述待hook原始代码时,根据所述第一跳转代码从所述待hook原始代码跳转到所述跳转桩代码,并暂停所述程序中所有的线程;执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述待hook原始代码;恢复所述程序中所有的线程,以继续执行所述待hook原始代码。
在一种可能的实施例中,所述根据所述无作用汇编指令编写跳转代码和跳转桩代码包括:根据所述跳转桩的内存地址和所述待hook原始代码的内存地址计算跳转的偏移地址;根据所述跳转的偏移地址和所述无作用汇编指令编写所述跳转代码;根据所述inlinehook逻辑代码和所述inlinehook逻辑代码的内存地址生成初始跳转桩代码;调用系统的API函数byTrpJmpPadCode存储所述初始跳转桩代码;将所述无作用汇编指令插入所述初始跳转桩代码,以得到所述跳转桩代码。
在一种可能的实施例中,所述将所述待hook原始代码修改为所述第一跳转代码包括:调用系统API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过系统API函数WriteProcessMemory将所述待hook原始代码修改为所述第一跳转代码。
在一种可能的实施例中,所述暂停所述程序中所有的线程包括:
调用系统API函数CreatToolhelp32Snapshot获取所述程序的进程线程快照信息,所述进程线程快照信息包括进程快照句柄;根据所述进程快照句柄获取所述进程线程快照中的第一个线程;通过do while循环从所述第一个线程遍历完所述程序中所有的进程,以暂停所述所有的进程。
本发明实施例的第二方面提供了一种程序处理设备,包括:编写单元,用于编写无作用汇编指令,所述无作用汇编指令为不影响程序的执行功能的指令;所述编写单元还用于根据所述无作用汇编指令编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述程序中待hook原始代码跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述待hook原始代码,所述跳转桩代码包括需插入的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;修改单元,用于备份所述待hook原始代码,将所述待hook原始代码修改为所述第一跳转代码;暂停单元,当执行到所述待hook原始代码时,用于根据所述第一跳转代码从所述待hook原始代码跳转到所述跳转桩代码,并暂停所述程序中所有的线程;跳转单元,还用于执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述待hook原始代码;恢复单元,用于恢复所述程序中所有的线程,以继续执行所述待hook原始代码。
在一种可能的实施例中,所述编写单元包括:计算模块,用于根据所述跳转桩的内存地址和所述待hook原始代码的内存地址计算跳转的偏移地址;编写模块,用于根据所述跳转的偏移地址和所述无作用汇编指令编写所述跳转代码;生成模块,用于根据所述inlinehook逻辑代码和所述inlinehook逻辑代码的内存地址生成初始跳转桩代码;存储模块,用于调用系统的API函数byTrpJmpPadCode存储所述初始跳转桩代码;获取模块,用于将所述无作用汇编指令插入所述初始跳转桩代码,以得到所述跳转桩代码。
在一种可能的实施例中,所述修改单元具体用于:调用系统API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过系统API函数WriteProcessMemory将所述待hook原始代码修改为所述第一跳转代码。
在一种可能的实施例中,所述暂停单元包括:获取模块,用于调用系统API函数CreatToolhelp32Snapshot获取所述程序的进程线程快照信息,所述进程线程快照信息包括进程快照句柄;根据所述进程快照句柄获取所述进程线程快照中的第一个线程;暂停模块,用于通过do while循环从所述第一个线程遍历完所述程序中所有的进程,以暂停所述所有的进程。
本发明第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述任意一项所述的程序处理方法的步骤。
本发明第四方面提供了一种计算机可读存储介质,其上存储有计算机管理类程序,其特征在于:所述计算机管理类程序被处理器执行时实现如上述任意一项所述的程序处理方法的步骤。
从以上技术方案可以看出,本发明实施例具有以下优点:编写无作用汇编指令,所述无作用汇编指令为不影响程序的执行功能的指令;根据所述无作用汇编指令编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述程序中待hook原始代码跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述待hook原始代码,所述跳转桩代码包括需插入的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;备份所述待hook原始代码,将所述待hook原始代码修改为所述第一跳转代码;当执行到所述待hook原始代码时,根据所述第一跳转代码从所述待hook原始代码跳转到所述跳转桩代码,并暂停所述程序中所有的线程;执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述待hook原始代码;恢复所述程序中所有的线程,以继续执行所述待hook原始代码。本发明实施例中,每次hook时,根据无作用汇编指令编写的跳转代码和跳转桩代码都不一样,可以提高在进行hook操作时,不被安全程序检测到的几率。
附图说明
图1为本发明实施例提供的一种可能的程序处理方法的流程图;
图2为本发明实施例提供的一种可能的程序处理设备的结构示意图;
图3为本发明实施例提供的一种可能的程序处理设备的硬件结构示意图;
图4为本发明实施例提供的另一可能的程序处理设备的硬件结构示意图。
具体实施方式
本发明实施例提供了一种程序处理方法及相关设备,用于提高在进行hook操作时,不被安全程序检测到的几率。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
请参阅图1,为本发明实施例提供的一种可能的程序处理方法的流程图,具体包括:
101、编写无作用汇编指令;
本发明实施例中,在对程序进行hook前,编写一些无作用汇编指令,其中该无作用汇编指令为不影响程序的执行功能的指令,即无作用的指令是指其不会影响程序的任何功能,执行之后等于没有执行的指令。为便于理解,例如对于一个变量进行加法操作,然后进行同样操作数的减法操作,从而变量的值并没有发生变化。这些无作用汇编指令的目的是为了后续产生随机可变的inlinehook的跳转桩的指令。本发明实施例中,对于inlinehook只能使用汇编指令,因此本发明实施例中都是基于汇编指令。
需要说明的是,无作用汇编指令可以包括以下方法:
1.空操作:nop指令,表示空操作,那么则可以是任意多条nop指令。可以是:nop,即一条指令。也可以是多条:nop nop nop等等,nop指令的条数具体此处不做限定。
2.加减指令操作:
add eax,5;将寄存器EAX值加5;
sub eax,5;将寄存器EAX值减5;
那么这对指令则是属于无作用指令。
需要说明的是,也可以采用其他的寄存器,操作数5也可以是其他数据,如操作数8等。
3.赋值指令操作:将寄存器的值赋值给自己。
mov edi,edi
mov eax,eax
mov ebx,ebx
以上3条指令则是将寄存器自己的值赋值给自己,所以相当于无作用指令。
4.跳转指令操作:通过跳转指令,从而跳转指令后的指令不被执行:
jz label跳转指令,判断ZF标志位为0则跳转到label处开始执行;
jnz label跳转指令,判断ZF标志位为1则跳转到label处开始执行;
mov eax,5
add eax,ebx
sub eax,ecx
label:
mov eax,3
由于在指令开头处编写了跳转指令,并且编写了2条跳转指令,因此不管ZF标志位为0还是为1都会跳转到label标签处。那么处在jnz和label标签处的代码,包括mov eax,5;add eax,ebx;sub eax,ecx,这几条指令都不会被执行,因此可以在此之间增加任意的指令。
5.通过堆栈操作:
push ecx将ecx寄存器压入堆栈;
pop ecx从堆栈中弹出数据到ecx寄存器;
push eax将eax寄存器压入堆栈;
pop eax从堆栈中弹出数据到eax寄存器。
本发明实施例中,提供了多种无作用汇编指令的举例,并且可以随意的进行组合,同时也可以随意的增加任意多条指令。那么构造无作用汇编指令则可以构造出任意多条,并且基本不会重复。因此,编写无作用汇编指令的方式具体此处不做限定。
102、编写循环来遍历所有的线程以暂停所有线程;
对于inlinehook来说,是对现有代码进行修改,修改成jump跳转指令,从而可以跳转到hook功能的逻辑中。而如果在程序运行时来对代码进行修改,可能会导致正好中央处理器(Central Processing Unit,CPU)执行到一半时被修改,从而导致程序崩溃。因此考虑到程序安全问题,在hook之前,先暂停进程中所有的线程,然后再执行inlinehook,执行完hook后,再恢复所有的线程,从而保障inlinehook时其他线程都是暂停的,不会产生指令执行一半被修改的情况。
本发明实施例中,暂停进程所有线程的实现方式具体如下:
1.获取进程线程快照。
通过调用系统API函数CreateToolhelp32Snapshot来获取线程的快照信息。
HANDLE_WINAPI CreateToolHelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
dwFlags:用于表示获取系统进程快照的类型;
th32ProcessID:用于表示要获取进程快照的ID,获取系统内所有进程快照时是0
HANDLE hThreadSnap=
CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,etCurrentProcessId());
其中,TH32CS_SNAPTHREAD,用于表示获取线程的快照;GetCurrentProcessId()表示只获取本进程的所有线程快照。
2.获取进程线程快照中第一个线程。
首先定义一个结构te32来存储线程快照信息。
THREADENTRY32te32;
te32.dwSize=sizeof(THREADENTRY32);
然后调用系统API函数来获取线程的第一个快照信息。
Thread32First(hThreadSnap,&te32);
其中第一个参数hThreadSnap则是步骤1获取的进程快照句柄;第二个参数te32则是用于存储获取到的线程快照的线程信息,从而得到了线程信息存储在te32变量中。
3.编写循环来遍历所有的线程并暂停所有线程。
本发明实施例中,可通过编写一个do while循环来遍历所有的线程。
首先需要从线程结构信息中取出该线程的所属进程ID,如果是本进程则将线程暂停,如果不是本进程则不做处理。
if(te32.th32OwnerProcessID==dwCurProcessId)
通过判断th32OwnerProcessID和当前进程句柄dwCurProcessId是否一致则可以。进一步的需要判断当前线程ID不是现在正在执行的hook逻辑的线程ID。
if(te32.th32ThreadID!=GetCurrentThreadId())
其中GetCurrentThreadId()用于表示获取当前正在执行的线程ID。
再调用系统API函数OpenThread来打开当前线程句柄。
系统API函数OpenThread的函数原型如下:
HANDLE WINAPI OpenThread(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwThreadId
);
第一个参数传入需要获取线程局部的权限,本文则是暂停线程,则传入THREAD_SUSPEND_RESUME;第二个参数传入False表示不继承该句柄。第三个参数则传入线程ID,本文则传入之前获取的线程ID。
本发明实施例中,调用如下:
HANDLE hThread=OpenThread(THREAD_SUSPEND_RESUME,FALSE,te32.th32ThreadID);
从而获取了线程局部并获取了相应暂停恢复的权限。
得到句柄后则需要暂停线程。
通过调用系统API函数SuspendThread来暂停线程。
系统API函数SuspendThread的函数原型如下:
WINAPI SuspendThread(
__in HANDLE hThread
);
其中只需要传入线程的局部参数。调用如下:
DWORD dwRet=SuspendThread(hThread);
即实现了暂停该线程的目的。
接下来则不断的取下一个线程句柄Thread32Next。函数原型如下:
BOOL WINAPI Thread32First(
HANDLE hSnapshot,
LPTHREADENTRY32lpte
);
其中,参数hSnapshot为获取的线程快照的句柄;参数lpte则是存储获取到的线程信息。
整个遍历循环过程的实现方式如下:
Figure BDA0001718458040000091
103、编写循环来遍历所有的线程以恢复所有线程;
需要说明的是,本发明实施例中,步骤103中编写循环来遍历所有的线程以恢复所有线程的方式与步骤102编写循环来遍历所有的线程以暂停所有线程的方式类似,此处不再赘述。
另外,与暂停所有线程不同的是,在恢复所有进程时,最终的调用暂停线程的函数换成恢复线程的函数。具体地,则是替换SuspendThread为ResumeThread。从而实现了恢复所有线程的执行。
104、根据无作用汇编指令编写跳转桩代码;
在得到无作用汇编指令后,根据该无作用汇编指令编写跳转桩代码,跳转桩代码包括需插入的inlinehook逻辑代码,跳转桩代码用于保存所述程序中待hook原始代码的执行环境。具体地,对于inlinehook来说,会将需要hook的代码修改成一个jump指令,而对于jump的位置,则是需要先跳转到跳转桩代码,然后从跳转桩来跳转到inlinehook逻辑代码,inlinehook逻辑代码执行完成后,再执行待hook原始代码,然后再跳转到hook后的位置。从而实现了在原始代码执行流程中,插入了一段自己编写的逻辑代码功能。那么跳转桩的代码则需要完成保存当前执行的待hook原始代码的执行环境,包括所有寄存器的保存,标志寄存器的保存,同时为了方便在inlinehook逻辑代码中执行相应的逻辑,需要传入参数,本文则考虑传入3个参数给hook逻辑代码。同时在跳转代码中需要调用hook逻辑代码,执行完成后则恢复寄存器的保存到寄存器中。其中,跳转桩代码实现如下:
Figure BDA0001718458040000101
Figure BDA0001718458040000111
需要说明的是,代码使用一个变量byTrpJmpPadCode来存储。此段代码中保存的是汇编指令对应的机器码。其中左边的16进制数据是机器码。而右边的则是对应的汇编代码助记符。例如0x60则对应的汇编代码是pushad;pushad用于表示将所有寄存器压入到堆栈中;Pushfd用于表示将标志寄存器压入到堆栈中;其中push arg3用于表示将参数3压入堆栈中;push arg2用于表示将参数2压入堆栈中;push arg1用于表示将参数1压入堆栈中;call0x90909090用于表示调用hook的逻辑代码,0x90909090用于表示填入hooklogicfunc函数的内存地址;add esp,0xc用于表示堆栈平衡,将之前压入的3个参数从堆栈中弹出来;popfd用于表示从堆栈中之前保存的值还原到标志寄存器中;popad用于表示从堆栈中之前保存的所有寄存器的值还原到寄存器中。需要说明的是,这些代码则是最基本的代码,能够正常的完成功能。
本发明实施例中,需要做到每次hook的跳转桩的代码是不一样的,产生更多的随机性,从而给安全厂商无法找到任何规律,或者无法计算hash值,可以在上述代码中插入在步骤101中编写的无作用汇编指令。需要说明的是,该无作用汇编指令可以包括但不限于上述步骤101中列举的一种或者多种,,且该无作用汇编指令可以插入任意条和任意位置,具体本发明实施例不做限定。
例如可以在
0x60,//pushad
0x9c,//pushfd
插入步骤101编写的无作用指令,从而使得跳转桩的代码多样化和多变化。
105、根据无作用汇编指令编写跳转代码;
需要说明的是,跳转代码包括第一跳转代码和第二跳转代码,该第一跳转代码用于从程序中待hook原始代码跳转到跳转桩代码,第二跳转代码用于从跳转桩代码跳转到待hook原始代码,
对于第一跳转代码,具体实现如下:
BYTE byJmpPadCode[HOOKFUNC_JMP_TRP_CODE_SIZE]={
0xe9,0x90,0x90,0x90,0x90//jmp xxxx
};
其中该第一跳转代码的核心代码是一条跳转指令,用于从待hook原始代码跳转到跳转桩代码中。而在此跳转代码中则可以插入步骤101编写的无作用汇编指令,用于得到无规律、随机的第一跳转代码。
同时对于第一跳转代码需要计算跳转的偏移地址。
具体实现则是通过如下公式:
Offset=dwJumpPad-dwHookAddr-0x5;
其中偏移offset则是由第一跳转桩的代码地址减去待hook原始代码的内存地址再减去5个字节,需要说明的是,由于跳转指令本身是5个字节,如果对于插入了随机代码,则跳转指令本身的5个字节也要随着增加)。
对于第二跳转代码的具体实现,即用于从跳转桩代码跳转至待hook原始代码。在执行完成从待hook原始代码跳转到跳转桩后,再执行完成inlinehook逻辑代码,则接着会从第二跳转桩跳转到待hook原始代码处,以继续执行该待hook原始代码处的代码。对于第二跳转代码的具体实现如下:
BYTE byJmpSrcCode[HOOK_JMP_SRC_CODE_SIZE]={
0xe9,0x90,0x90,0x90,0x90//jmp xxxx
};
其代码核心代码也是一条跳转指令,用于从待hook原始代码跳转到第二跳转桩代码中。而在此第二跳转代码中也可以插入步骤101编写的无作用汇编指令,用于得到无规律、随机的第二跳转代码。同时对于第二跳转代码需要计算跳转的偏移地址,具体计算方式与第一跳转代码的偏移地址的计算方式类似,具体此处不再赘述。
106、备份待hook原始代码,将该待hook原始代码修改为第一跳转代码;
在上述步骤中,编写了进行inlinehook所需要的基本功能的代码,当需要对待hook原始代码执行hook操作时,备份该待hook原始代码,并将该待hook原始代码修改为第一跳转代码。
具体的,本发明实施例中,由于待hook原始代码会被修改成第一跳转代码,所以在修改前先需要进行备份该待hook原始代码,从而执行完成跳转桩代码后继续执行该待hook原始代码。具体则可以通过系统API函数ReadProcessMemory来读取内存。
BOOL bRet=ReadProcessMemory(hProcess,(LPVOID)dwHookAddr,&bySrcCode,dwHookLen,&nRead);
其中参数hProcess表示本进程的句柄。
其中参数dwHookAddr表示hook的内存地址。
其中参数bySrcCode则用于存储原始代码。
其中参数dwHookLen则表示读取的长度。
需要说明的是,为将该待hook原始代码修改为第一跳转代码,必须修改待hook处原始代码的代码属性。由于程序中代码都是只读可执行的内存属性,如果需要对待hook原始代码进行hook那么则需要修改成可以写可以执行的内存属性,系统API函数提供了修改内存属性的方法VirtualProtectEx。
VirtualProtectEx(hProcess,(LPVOID)dwHookAddr,dwHookLen,PAGE_EXECUTE_READWRITE,&dwOld);
其中修改的地址是待hook原始代码的地址dwHookAddr,dwHookLen则待hook原始代码其长度。其中修改的属性则是PAGE_EXECUTE_READWRITE,用于表示可以读写可以执行。
107、当执行到待hook原始代码时,根据第一跳转代码从待hook原始代码跳转到跳转桩代码,并暂停程序中所有的线程;
在程序的运行过程中,当执行到待hook原始代码时,根据第一跳转代码从待hook原始代码跳转到跳转桩代码,并暂停程序中所有的线程。具体的,本发明实施例中,跳转桩的代码是动态分配可以执行的内存,因此跳转桩代码是一种动态代码,没有固定位置,随着系统内存的空闲内存变化而变化。
具体可以通过系统API函数来分配内存,并且需要分配可以读写可以执行的内存属性。
BYTE*VirtualMem=VirtualAlloc(NULL,dwVirtualSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
其中参数dwVirtualSize则是跳转桩代码的大小。
其中返回值则是分配的具体内存地址。
在为跳转桩代码分配内存后,跳转到该跳转桩代码,并基于步骤102来暂停程序中所有其他的线程。
另外,本发明实施例中,通过系统函数WriteProcessMemory则可以修改待hook原始代码为第一跳转代码。
WriteProcessMemory(hProcess,(LPVOID)dwHookAddr,&byJmpPadCode,HOOK_JMP_SRC_CODE_SIZE,&nWrite);
即本发明实施例中,在待hook原始代码处写入第一跳转代码,就会根据该第一跳转代码跳转到编写的跳转桩代码。
108、执行完成跳转桩代码后,根据第二跳转代码从跳转桩代码跳转到备份的待hook原始代码;
执行完成跳转桩代码后,根据步骤104编写的第二跳转代码从跳转桩代码跳转到已备份的待hook原始代码中。
109、恢复程序中所有的线程,以继续执行待hook原始代码。
在从跳转桩代码跳转到备份的待hook原始代码时,根据步骤103中编写的循环来遍历所有的线程来恢复所有线程,以继续执行待hook原始代码。
上面从程序处理方法的角度对本发明实施例进行了描述,下面从程序处理设备的角度对本发明实施例进行描述。
请参阅图2,图2为本发明实施例提供的一种可能的程序处理设备的实施例示意图,该程序处理设备,具体包括:
编写单元201,用于编写无作用汇编指令,所述无作用汇编指令为不影响程序的执行功能的指令;
所述编写单元201还用于根据所述无作用汇编指令编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述程序中待hook原始代码跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述待hook原始代码,所述跳转桩代码包括需插入的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;
修改单元202,用于备份所述待hook原始代码,将所述待hook原始代码修改为所述第一跳转代码;
暂停单元203,当执行到所述待hook原始代码时,用于根据所述第一跳转代码从所述待hook原始代码跳转到所述跳转桩代码,并暂停所述程序中所有的线程;
跳转单元204,还用于执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述待hook原始代码;
恢复单元205,用于恢复所述程序中所有的线程,以继续执行所述待hook原始代码。
可选的,在一些可能的实现方式中,所述编写单元201包括:
计算模块2011,用于根据所述跳转桩的内存地址和所述待hook原始代码的内存地址计算跳转的偏移地址;
编写模块2012,用于根据所述跳转的偏移地址和所述无作用汇编指令编写所述跳转代码;
生成模块2013,用于根据所述inlinehook逻辑代码和所述inlinehook逻辑代码的内存地址生成初始跳转桩代码;
存储模块2014,用于调用系统的API函数byTrpJmpPadCode存储所述初始跳转桩代码;
获取模块2015,用于将所述无作用汇编指令插入所述初始跳转桩代码,以得到所述跳转桩代码。
可选的,在一些可能的实现方式中,所述修改单元202具体用于:
调用系统API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过系统API函数WriteProcessMemory将所述待hook原始代码修改为所述第一跳转代码。
可选的,在一些可能的实现方式中,所述暂停单元203包括:
获取模块2031,用于调用系统API函数CreatToolhelp32Snapshot获取所述程序的进程线程快照信息,所述进程线程快照信息包括进程快照句柄;根据所述进程快照句柄获取所述进程线程快照中的第一个线程;暂停模块2032,用于通过do while循环从所述第一个线程遍历完所述程序中所有的进程,以暂停所述所有的进程。
请参阅图3,图3为本发明实施例提供的电子设备的实施例示意图。
如图3所示,本发明实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:编写无作用汇编指令,所述无作用汇编指令为不影响程序的执行功能的指令;根据所述无作用汇编指令编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述程序中待挂钩hook原始代码跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述待hook原始代码,所述跳转桩代码包括需插入的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;备份所述待hook原始代码,将所述待hook原始代码修改为所述第一跳转代码;当执行到所述待hook原始代码时,根据所述第一跳转代码从所述待hook原始代码跳转到所述跳转桩代码,并暂停所述程序中所有的线程;执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述待hook原始代码;恢复所述程序中所有的线程,以继续执行所述待hook原始代码。
可选的,在一种可能的实施例中,所述处理器具体用于:根据所述跳转桩的内存地址和所述待hook原始代码的内存地址计算跳转的偏移地址;根据所述跳转的偏移地址和所述无作用汇编指令编写所述跳转代码;根据所述inlinehook逻辑代码和所述inlinehook逻辑代码的内存地址生成初始跳转桩代码;调用系统的API函数byTrpJmpPadCode存储所述初始跳转桩代码;将所述无作用汇编指令插入所述初始跳转桩代码,以得到所述跳转桩代码。
可选的,在一种可能的实施例中,所述处理器具体用于:调用系统API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过系统API函数WriteProcessMemory将所述待hook原始代码修改为所述第一跳转代码。
可选的,在一种可能的实施例中,所述处理器具体用于:调用系统API函数CreatToolhelp32Snapshot获取所述程序的进程线程快照信息,所述进程线程快照信息包括进程快照句柄;根据所述进程快照句柄获取所述进程线程快照中的第一个线程;通过dowhile循环从所述第一个线程遍历完所述程序中所有的进程,以暂停所述所有的进程。
在具体实施过程中,处理器320执行计算机程序311时,可以实现图1对应的实施例中任一实施方式。
由于本实施例所介绍的电子设备为实施本发明实施例中一种程序处理设备所采用的设备,故而基于本发明实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本发明实施例中的方法不再详细介绍,只要本领域所属技术人员实施本发明实施例中的方法所采用的设备,都属于本发明所欲保护的范围。
请参阅图4,图4为本发明实施例提供的一种计算机可读存储介质的实施例示意图。
如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,该计算机程序411被处理器执行时实现如下步骤:编写无作用汇编指令,所述无作用汇编指令为不影响程序的执行功能的指令;
根据所述无作用汇编指令编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述程序中待挂钩hook原始代码跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述待hook原始代码,所述跳转桩代码包括需插入的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;备份所述待hook原始代码,将所述待hook原始代码修改为所述第一跳转代码;当执行到所述待hook原始代码时,根据所述第一跳转代码从所述待hook原始代码跳转到所述跳转桩代码,并暂停所述程序中所有的线程;执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述待hook原始代码;恢复所述程序中所有的线程,以继续执行所述待hook原始代码。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:根据所述跳转桩的内存地址和所述待hook原始代码的内存地址计算跳转的偏移地址;根据所述跳转的偏移地址和所述无作用汇编指令编写所述跳转代码;根据所述inlinehook逻辑代码和所述inlinehook逻辑代码的内存地址生成初始跳转桩代码;调用系统的API函数byTrpJmpPadCode存储所述初始跳转桩代码;将所述无作用汇编指令插入所述初始跳转桩代码,以得到所述跳转桩代码。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:调用系统API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过系统API函数WriteProcessMemory将所述待hook原始代码修改为所述第一跳转代码。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:调用系统API函数CreatToolhelp32Snapshot获取所述程序的进程线程快照信息,所述进程线程快照信息包括进程快照句柄;根据所述进程快照句柄获取所述进程线程快照中的第一个线程;通过do while循环从所述第一个线程遍历完所述程序中所有的进程,以暂停所述所有的进程。
需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。

Claims (10)

1.一种程序处理方法,其特征在于,包括:
编写无作用汇编指令,所述无作用汇编指令为不影响程序的执行功能的指令;
根据所述无作用汇编指令编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述程序中待挂钩hook原始代码跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述待hook原始代码,所述跳转桩代码包括需插入的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;
备份所述待hook原始代码,将所述待hook原始代码修改为所述第一跳转代码;
当执行到所述待hook原始代码时,根据所述第一跳转代码从所述待hook原始代码跳转到所述跳转桩代码,并暂停所述程序中所有的线程;
执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述待hook原始代码;
恢复所述程序中所有的线程,以继续执行所述待hook原始代码。
2.根据权利要求1所述的方法,其特征在于,所述根据所述无作用汇编指令编写跳转代码和跳转桩代码包括:
根据所述跳转桩的内存地址和所述待hook原始代码的内存地址计算跳转的偏移地址;
根据所述跳转的偏移地址和所述无作用汇编指令编写所述跳转代码;
根据所述inlinehook逻辑代码和所述inlinehook逻辑代码的内存地址生成初始跳转桩代码;
调用系统的API函数byTrpJmpPadCode存储所述初始跳转桩代码;
将所述无作用汇编指令插入所述初始跳转桩代码,以得到所述跳转桩代码。
3.根据权利要求1所述的方法,其特征在于,所述将所述待hook原始代码修改为所述第一跳转代码包括:
调用系统API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;
通过系统API函数WriteProcessMemory将所述待hook原始代码修改为所述第一跳转代码。
4.根据权利要求1至3中任一项所述的方法,其特征在于,所述暂停所述程序中所有的线程包括:
调用系统API函数CreatToolhelp32Snapshot获取所述程序的进程线程快照信息,所述进程线程快照信息包括进程快照句柄;
根据所述进程快照句柄获取所述进程线程快照中的第一个线程;
通过do while循环从所述第一个线程遍历完所述程序中所有的进程,以暂停所述所有的进程。
5.一种程序处理设备,其特征在于,包括:
编写单元,用于编写无作用汇编指令,所述无作用汇编指令为不影响程序的执行功能的指令;
所述编写单元还用于根据所述无作用汇编指令编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述程序中待hook原始代码跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述待hook原始代码,所述跳转桩代码包括需插入的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;
修改单元,用于备份所述待hook原始代码,将所述待hook原始代码修改为所述第一跳转代码;
暂停单元,当执行到所述待hook原始代码时,用于根据所述第一跳转代码从所述待hook原始代码跳转到所述跳转桩代码,并暂停所述程序中所有的线程;
跳转单元,还用于执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述待hook原始代码;
恢复单元,用于恢复所述程序中所有的线程,以继续执行所述待hook原始代码。
6.根据权利要求5所述的程序处理设备,其特征在于,所述编写单元包括:
计算模块,用于根据所述跳转桩的内存地址和所述待hook原始代码的内存地址计算跳转的偏移地址;
编写模块,用于根据所述跳转的偏移地址和所述无作用汇编指令编写所述跳转代码;
生成模块,用于根据所述inlinehook逻辑代码和所述inlinehook逻辑代码的内存地址生成初始跳转桩代码;
存储模块,用于调用系统的API函数byTrpJmpPadCode存储所述初始跳转桩代码;
获取模块,用于将所述无作用汇编指令插入所述初始跳转桩代码,以得到所述跳转桩代码。
7.根据权利要求5所述的程序处理设备,其特征在于,所述修改单元具体用于:
调用系统API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过系统API函数WriteProcessMemory将所述待hook原始代码修改为所述第一跳转代码。
8.根据权利要求5至7中任一项所述的设备 ,其特征在于,所述暂停单元包括:
获取模块,用于调用系统API函数CreatToolhelp32Snapshot获取所述程序的进程线程快照信息,所述进程线程快照信息包括进程快照句柄;根据所述进程快照句柄获取所述进程线程快照中的第一个线程;
暂停模块,用于通过do while循环从所述第一个线程遍历完所述程序中所有的进程,以暂停所述所有的进程。
9.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1-4任意一项所述的方法。
10.一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行如权利要求1-4任意一项所述的方法。
CN201810720086.3A 2018-07-03 2018-07-03 一种程序处理方法及相关设备 Active CN110673899B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810720086.3A CN110673899B (zh) 2018-07-03 2018-07-03 一种程序处理方法及相关设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810720086.3A CN110673899B (zh) 2018-07-03 2018-07-03 一种程序处理方法及相关设备

Publications (2)

Publication Number Publication Date
CN110673899A CN110673899A (zh) 2020-01-10
CN110673899B true CN110673899B (zh) 2022-06-21

Family

ID=69065598

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810720086.3A Active CN110673899B (zh) 2018-07-03 2018-07-03 一种程序处理方法及相关设备

Country Status (1)

Country Link
CN (1) CN110673899B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115543586B (zh) * 2022-11-28 2023-03-17 成都安易迅科技有限公司 应用层系统进程的启动方法、装置、设备及可读存储介质

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1838074A (zh) * 2006-02-22 2006-09-27 北京金山软件有限公司 一种64位视窗操作系统下获取函数参数的方法及系统
US7472384B1 (en) * 2003-12-02 2008-12-30 Swsoft Holdings, Ltd. System, method and computer program product for on-the-fly patching of executable code
CN102156661A (zh) * 2010-02-11 2011-08-17 华为技术有限公司 在线补丁的激活方法、装置及系统
CN102314561A (zh) * 2010-07-01 2012-01-11 电子科技大学 基于api hook的恶意代码自动分析方法和系统
CN103077332A (zh) * 2012-12-28 2013-05-01 飞天诚信科技股份有限公司 一种运行含有自校验的加壳程序的方法和装置
CN103632087A (zh) * 2012-08-21 2014-03-12 腾讯科技(深圳)有限公司 保护进程的方法和装置
CN105446806A (zh) * 2014-09-28 2016-03-30 广州市动景计算机科技有限公司 一种应用程序无响应的处理方法及装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9678747B2 (en) * 2011-02-08 2017-06-13 Openspan, Inc. Code injection and code interception in an operating system with multiple subsystem environments
US9639343B2 (en) * 2014-08-29 2017-05-02 Nxp Usa, Inc. Method for altering execution of a program, debugger, and computer-readable medium

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7472384B1 (en) * 2003-12-02 2008-12-30 Swsoft Holdings, Ltd. System, method and computer program product for on-the-fly patching of executable code
CN1838074A (zh) * 2006-02-22 2006-09-27 北京金山软件有限公司 一种64位视窗操作系统下获取函数参数的方法及系统
CN102156661A (zh) * 2010-02-11 2011-08-17 华为技术有限公司 在线补丁的激活方法、装置及系统
CN102314561A (zh) * 2010-07-01 2012-01-11 电子科技大学 基于api hook的恶意代码自动分析方法和系统
CN103632087A (zh) * 2012-08-21 2014-03-12 腾讯科技(深圳)有限公司 保护进程的方法和装置
CN103077332A (zh) * 2012-12-28 2013-05-01 飞天诚信科技股份有限公司 一种运行含有自校验的加壳程序的方法和装置
CN105446806A (zh) * 2014-09-28 2016-03-30 广州市动景计算机科技有限公司 一种应用程序无响应的处理方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
android inline hook;mmmmar;《https://www.bbsmax.com/A/A7zgmLQK54/》;20180106;全文 *

Also Published As

Publication number Publication date
CN110673899A (zh) 2020-01-10

Similar Documents

Publication Publication Date Title
JP7377812B2 (ja) トランザクションにおける例外ハンドリング
Jeong et al. Generic unpacking using entropy analysis
US9766958B2 (en) Runtime emulating static thread local storage of portable executable software code
CN109471697B (zh) 一种监控虚拟机中系统调用的方法、装置及存储介质
WO2015020722A1 (en) Automatic algorithm discovery using reverse dataflow analysis
CA3152837A1 (en) Simulator detection method and system
CN109086183B (zh) 一种应用程序的监控方法、装置、电子设备及存储介质
CN110737892A (zh) 一种针对apc注入的检测方法和相关装置
Kalysch et al. VMAttack: Deobfuscating virtualization-based packed binaries
JP6984710B2 (ja) コンピュータ装置およびメモリ管理方法
CN111913742B (zh) 一种程序处理方法及相关设备
US8683450B2 (en) Systems, methods, and media for testing software patches
US20180025158A1 (en) System and method for detecting malware in a stream of bytes
CN102422299A (zh) 信息设备、程序、防止执行不正当程序代码的方法、及计算机能够读取的记录介质
CN110673899B (zh) 一种程序处理方法及相关设备
Karande et al. BCD: Decomposing binary code into components using graph-based clustering
KR101624387B1 (ko) 소프트웨어 버스마크에 기반한 소프트웨어 자산 관리 방법 및 그 장치
US9436575B2 (en) Selective profiling of applications
CN116361153A (zh) 固件代码的测试方法、装置、电子设备、存储介质
KR101842263B1 (ko) 어플리케이션에 대한 역공학 차단 방법 및 장치
CN114996955A (zh) 一种云原生混沌工程实验的靶场环境构建方法及装置
CN104008049A (zh) 用于监控机动车控制器工作系统中的堆栈存储器的方法
CN112965842A (zh) 一种云编译方法、装置、电子设备及存储介质
CN110750782B (zh) 一种程序退出的方法及相关设备
CN115391793B (zh) 一种基于FlowDroid工具的实时漏洞检测系统、方法与存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20231221

Address after: Room 3605, Floor 5, Building 3, Micro World, No. 23, Century Avenue, Liuwu New District, Lhasa, Xizang Autonomous Region, 850000

Patentee after: Tibet Fengzikai Industrial Co.,Ltd.

Address before: 430000 East Lake Development Zone, Wuhan City, Hubei Province, No. 1 Software Park East Road 4.1 Phase B1 Building 11 Building

Patentee before: WUHAN DOUYU NETWORK TECHNOLOGY Co.,Ltd.

TR01 Transfer of patent right