若何清理虚拟机代码{Themida虚拟机代码}
2

若何清理虚拟机代码{Themida虚拟机代码}

沐鸣2连锁ym871622021-12-27 10:11170A+A-
👽💼👽【algo】官方指定负责人【野马】猎杰集团旗下实力雄厚、大户首选平台。【服务内容】开户注册、平台登陆、app下载、代理咨询、事务处理。【algo平台】野马团队让一亿人先富起来!最近在百度搜索里面数据急剧飙升,截止2021-12-27 10:11:19为止,搜索algo等关键词用户数量已累计多达百万之众,👽💼👽为满足搜索引擎用户需求帮助搜索引擎留住粉丝,特将若何清理虚拟机代码{Themida虚拟机代码}-首页野马联盟_页面打造成专业的平台活动资讯站,接下来就跟跟着小编一起去看看本篇文章内容吧!

algo公司企业文化


🙀目标使命🙀

algo的使命:帮助中小企业实现网络营销化🙀👽

algo的目标:打造专业互联网基础服务提供商👿👽

algo的愿景:成为中国IT服务的领导品牌,做百年公司🙀👽👿👽💼

🙀价 值 观🙀

诚信为本、承担责任、成就客户、合作共赢

诚信为本:恪守诚信为先的商业准则,全体员工在工作中、生活中、社会交往中恪守诚信的行为准则

🙀👽爱岗敬业、以诚信为立身之本👿👽💼

承担责任:一个企业如果要健康成长,一定要坚持对用户负责,坚持不懈的为用户提供更多、更好的服务。

🙀👽这样才能赢得用户的信赖与支持,促进自身的发展!👿👽💼

成就客户:意味着为客户提供满意的产品和服务,通过这些产品和服务为客户造新的价值

合作共赢:双方合作过程中互惠互利、相得益彰,能够实现双共同收益。

阵外,白眉老祖回头看了一眼圣城,眼中难掩失落、悲哀。

🙀职业精神🙀

激情:持续,不断,发掘自身潜能!

创新:学习,改变,不断完善自我!

团结:忠诚,热爱,打造共赢结果!

感恩:感激,赠与,坚信世界阳光!

🙀经营理念🙀

用心服务,诚信服务,长期服务🙀👽👿👽💼

🙀👽👿👽💼实实在在做人,踏踏实实做事。企业伦理是 algo调处各种关系的基本行为准则,集中在对人对事两个方面。

🙀👽👿👽💼

🙀👽👿👽💼凡超科技信奉诚实守信的道德标准,对人真诚坦诚热诚,谦和低调,不自欺,不欺人👽👿👽💼

言而有信,襟怀坦白,光明磊落;🙀👽👿👽💼

踏踏实实做事:👽💼野马团队🙀👽秉持勤勉务实的工作态度,对工作不辞劳苦,不懈努力,不计得失,不扯皮推诿, 不邀功摆好。

  变形代码清理:Mission Impossible?

  那是汇编语言

  1. 变形代码长啥样?

  变形代码在壳里用得越来越多,那种源于病毒的技巧被用来掩盖代码的实在目标,

  以及对cracker停止身心服磨:-(algo。变形代码不象通俗的花指令那样,用简单的字

  符串婚配即可清理(其生成过程也差别,花指令一般以在编程时插入宏的体例创建)algo。

  下面的实例来自Themida虚拟机代码:

  01596EXF jmp edx /

  01596EEF push edx

  01596EF0 add ebx, ecx *

  01596EF2 mov edx, 0

  01596EF7 mov bh, 35h *

  01596EF9 add edx, edi

  01596EFB shr al, 3 *

  01596EFE push ecx

  01596EFF sub eax, ebx *

  01596F01 jmp loc_14F562A

  014F562A mov ecx, 7445h

  014F562F neg ecx

  014F5631 not ecx

  014F5633 not ecx

  014F5635 or ecx, 629Ah

  014F563B jmp loc_14FA94D

  014FA94D sub al, dl *

  014FA94F or ecx, 205Ch

  014FA955 xor ecx, 0FFFFEBFFh

  014FA95B mov bl, 8Ah *

  014FA95D add ecx, edx

  014FA95F add ah, dh *

  014FA961 jmp loc_1594A3C

  01594A3C mov esi, [ecx]

  01594A3E mov bl, ch *

  01594A40 pop ecx

  01594A41 mov ebx, 7570h *

  01594A46 mov edx, [esp]

  01594A49 add esp, 4

  那段代码十分典型,我们能够测验考试手工清理algo。此中的3个jmp是所谓的置换jmp,即报酬将

  代码分块,打乱其物理存放位置,再用JMP指令链接algo。

  除了JMP指令,此中还同化了一些垃圾指令(带*号的行,从代码的逻辑能够识别),拿掉那

  些JMP和垃圾指令后剩下:

  01596EEF push edx

  01596EF2 mov edx, 0

  01596EF9 add edx, edi

  01596EFE push ecx

  014F562A mov ecx, 7445h

  014F562F neg ecx

  014F5631 not ecx

  014F5633 not ecx

  014F5635 or ecx, 629Ah

  014FA94F or ecx, 205Ch

  014FA955 xor ecx, 0FFFFEBFFh

  014FA95D add ecx, edx

  01594A3C mov esi, [ecx]

  01594A40 pop ecx

  01594A46 mov edx, [esp]

  01594A49 add esp, 4

  014F562A - 014FA955对ecx的赋值及计算,其成果为0,能够压缩为1句,如今很容易

  看出代码的实正含义了:

  01596EEF push edx ----------------------\

  01596EF2 mov edx, 0 \

  01596EF9 add edx, edi \

  01596EFE push ecx -------\ \

  014F562A mov ecx, 0 \ \

  014FA95D add ecx, edx mov esi,[edx] mov esi,[edi]

  01594A3C mov esi, [ecx] / /

  01594A40 pop ecx -------/ /

  01594A46 mov edx, [esp]--- pop edx ----/

  01594A49 add esp, 4 -----/

  那里现实利用了2种代码形式:

  MOV Reg,[ESP]/ADD ESP,4 -> POP Reg

  PUSH Reg1/MOV Reg1,Imm/ADD Reg1,Reg2/Operate Reg3,Mem/POP Reg1 -> Operate Reg3,[Reg2+Imm]

  (那里Reg1用来生成内存地址)

  2. 如何生成变形代码?

  置换JMP的生成过程如下,将代码随机划分为片段,例如每段1-10行,用数据构造

  (如List)办理代码块信息,然后混洗,以下为伪码:

  ESI = Initial address of instructions

  EDI = Address of last instruction

  ; 用第1-60h行代码创建若干代码片段,每段8-16行

  Given ESI = 00000000h,

  EDI = 00000060h

  while(ESI < EDI)

  Store ESI

  ESI += Random(8)+8

  Store ESI

  if((ESI+0F > EDI)

  Store ESI,EDI

  break;

  end if

  end while

  Result (for example):

  DD 00000000h,0000000Ah <- 1 (第0-10行)

  DD 0000000Ah,00000017h <- 2

  DD 00000017h,00000023h <- 3

  DD 00000023h,00000032h <- 4

  DD 00000032h,0000003Dh <- 5

  DD 0000003Dh,00000049h <- 6

  DD 00000049h,00000052h <- 7

  DD 00000052h,00000060h <- 8

  洗完后的成果:

  DD 00000032h,0000003Dh <- 5

  DD 00000023h,00000032h <- 4

  DD 0000000Ah,00000017h <- 2

  DD 00000000h,0000000Ah <- 1

  DD 00000017h,00000023h <- 3

  DD 00000052h,00000060h <- 8

  DD 0000003Dh,00000049h <- 6

  DD 00000049h,00000052h <- 7

  按洗完的挨次物理摆放代码,每块代码在末尾用jmp跳到逻辑上的下一块,连结代码本来的

  施行挨次,因为代码物理位置的变革,有些指令需要批改(call,jmp,jcc等)algo。

  法式施行时,eip会跟着施行天然落到物理位置的第1块(但那并非法式逻辑的第1块,详细

  说是第5块,第1块如今排在第4),所以在混洗后的第1个物理块前,应该有1句:

  JMP EntryPoint(处置前代码的首句,在第1块内)

  变形代码可按预定义的形式生成algo。随机选择适宜的形式对代码停止扩展,那是前面压缩过程

  的逆反algo。那个过程是递归的,需要定义停行前提(如递归深度)。如:

  push eax -> sub esp,4 -> push ebp -> ...

  mov [esp],eax mov ebp,esp

  add ebp,4

  sub ebp,4

  xchg ebp,[esp]

  pop esp

  mov [esp],eax

  代码的物理膨胀同样需要批改指令algo。显然,变形代码的生成过程必需有反汇编引擎的撑持。

  仅仅有那些是不敷的algo。cracker同样能够借助反汇编引擎重建代码,只要识别出婚配的代码序列

  即可对扩展后的代码停止压缩algo。然而,若是在有效的代码中同化入垃圾代码,重建难度就曲线上

  升了algo。例如:

  sub esp,4

  shl ebp,2 <- 垃圾指令

  mov [esp],eax

  中间的1句是垃圾指令,那用肉眼很容易识别,但用法式来做就没那么简单了algo。那意味着在检测代

  码序列,与预定义形式停止比对时,允许对不持续指令停止婚配,而如许做误判几乎是无法制止的algo。

  或许更好的处理体例是利用emulator,从代码的算法(而不是详细的指令)来阐发,类似启发式反

  病毒algo。

  留意,在上面的例子中,参加shl ebp,2(或者此外什么指令,如add ebp,1234),前提是当前ebp是

  空闲存放器,可随意利用algo。简单的处置能够是对空闲存放器停止约定,好比约定某段代码不利用

  ebp,但如许做强度不敷,更好的法子是能判断出当前位置可用的空闲存放器algo。

  z0mbie的XDE反汇编引擎就带有如许的功用(现实上那大要是其最重要的设想目标之一)algo。XDE中最

  重要的概念是对象集(object set),即指令读写的registers,memory等,暗示为1个DWORD中的对应

  位algo。被反汇编的指令,成果数据构造中包罗了该指令读取的源对象集(src_set)与写入的目标对象

  集(obj_set)algo。详细细节可参考XDE源码及z0mbie的<Permutation conditions>。下面的代码是

  XDE v1.02带的例子,演示了获取空闲对象集(英文正文是原代码带的)algo。

  int AnalyzeRegs(/* IN/OUT */ CMistfall* M)

  {

  HOOY* h; // current element of the file, instruction or anything else

  // step 1/3 -- mark all registers as "used"

  // 对List内的每条指令,初始化为所有对象都被占用

  ForEachInList(M->HooyList, HOOY, h)

  {

  h->regused = XSET_UNDEF; // XSET_UNDEF=0xFFFFFFFF

  }

  // step 2/3 -- for each instruction, clear dst_set&~src_set

  ForEachInList(M->HooyList, HOOY, h)

  {

  if(h->flags & FL_OPCODE)

  if((h->flags & FL_ERROR) == 0)

  {

  xde_instr instr;

  xde_disasm(h->dataptr, &instr);

  // update h->regused

  // 对链表上的每个指令节点,计算出对应的空闲对象集algo。认真看看那个位运算:

  //

  // 1. ~instr.src_set:

  // 不做为当前指令src_set利用的obj_set

  //

  // 2. instr.dst_set & (~instr.src_set):

  // 取1的成果与当前指令目标对象集的堆叠algo。1取到的onj_set只是当前指令未用,但后续的

  // 指令可能会利用,其实不能判断为空闲algo。与的成果是,未做为当前指令src利用,同时被用做

  // 当前指令的dst,那个成果就是从当前指令能够判断出的空闲obj_set

  //

  // 那种战略很守旧,取到的成果可靠,但能取到的obj_set很有限,大部门时候为空algo。

  // 如add eax,ebx:

  //

  // ~instr.src_set = {ecx|edx|esp|ebp|esi|edi|memory}

  // dst_set = {eax|flags}

  // 与的成果为0,即仅凭那条指令,取不到任何空闲obj_set数据algo。

  //

  // 那么什么指令能取到空闲obj_set? 能够立即想到1个;-)

  // mov eax,12345678

  // 此时eax为空闲存放器,即在那条指令之前,能够插入指令,随意利用eax

  // (add eax,ebx/shl eax,cl/...)

  //

  // 3. ~(instr.dst_set & (~instr.src_set))

  // 取反的成果对应不克不及判断为空闲的obj_set,那个成果可能比指令实正利用的obj_set大algo。

  h->regused &= ~(instr.dst_set & (~instr.src_set));

  //

  // incorrect, need to be replaced with recursive subroutine analysis.

  // however, the following means:

  //inerr,need to be and no find ok

  // "CALL'ed subroutines doesnt use FLAGS as a source_object"

  //

  if (XDE_CMD(instr.flag) == C_CMD_CALL)

  h->regused &= ~XSET_FL;

  }

  }

  // step 3/3 -- propagate zero bits within freeset, until possible;

  // works similar to "wave" algo

  // 从2得到的空闲obj_set是很少的,那里利用"海浪"算法传递free set

  for(;;)

  {

  int modified = 0;

  ForEachInList(M->HooyList, HOOY, h)

  {

  if (h->flags & FL_OPCODE) // 当前节点为代码

  if ((h->flags & FL_ERROR) == 0)

  if (h->next) // 存在后续节点,也为代码

  if (h->next->flags & FL_OPCODE)

  if ((h->next->flags & (FL_LABEL|FL_ERROR)) == 0)

  {

  xde_instr instr;

  xde_disasm(h->dataptr, &instr);

  if (((instr.src_set|instr.dst_set) & (~h->next->regused)) == 0)

  {

  // 1. instr.src_set|instr.dst_set为当前指令读写的obj_set

  //

  // 2. ~h->next->regused 为下一句指令的空闲obj_set(来自第2步)

  //

  // 那个前提为true的含义是: 当前指令利用的obj_set(包罗src和dst)

  // 与下一句指令的空闲obj_set不存在穿插,即下一条指令的空闲obj_set

  // 当前指令没有利用

  //

  // 前提满足,会施行h->regused &= h->next->regused

  // 即h->next->regused内对应为0的位(空闲obj_set)被传递到当前指令

  //

  // ForEachInList轮回遍历所有指令,每次只影响了相邻的2条指令

  //

  // 由for(;;)和ForEachInList构成的2重轮回的目标,在于尽可能地传递

  // 空闲obj_set信息,在每条指令位置提取出尽可能多的空闲obj_set

  if ((h->regused & h->next->regused) != h->regused)

  {

  // h->regused的某位为1,h->next->regused的对应位为0时前提为

  // true,即某个obj,对下一条指令确定为空闲,对当前指令不克不及判断

  // 为空闲algo。留意那个查抄是在修改当前指令的regused(即下面的

  // h->regused &= h->next->regused)之前做的algo。

  // 有了外面的if做包管,那个本来对当前指令"可能利用"的obj可明

  // 确判断为空闲algo。

  // 留意对1条指令,src_set,dst_set是通过反汇编得到确实切数据,

  // 即当前指令必定要利用的obj_setalgo。那和regused是差别的概念。

  // regused中为0的位代表空闲obj,为1的位代表不克不及切当断定为空

  // 闲obj(当前指令纷歧定利用)algo。regused涵盖的范畴>= src_set|dst_set。

  // regused预置为0xFFFFFFFF(全数占用),通过第2步的阐发及前后

  // 指令空闲obj_set的传递来剔除空闲obj_setalgo。

  // 当前提为true,增加modified,暗示相邻指令间呈现了空闲obj_set

  // 传递algo。完毕ForEachInList后进入下一轮for(;;)再次遍历指令链表

  modified++;

  }

  h->regused &= h->next->regused;

  }

  }

  }

  if (!modified) break;

  }

  return 1;

  } // AnalyzeRegs

若何清理虚拟机代码{Themida虚拟机代码}》由《沐鸣2娱乐|沐鸣2注册登录》整理呈现,请在转载分享时带上本文链接,谢谢!

申明:algo案例展示仅仅为部分关键词,为保障客户利益及排名效果,小编不提供algo相关的联系方式,也不承接已经承接过霸屏的关键词,同一关键词首页业务不超过3个客户。接下来请看客户案例展示,本着友好合作原则,请勿对本页面进行快照投诉。谢谢!

相关搜索
algo招代理吗   algo工资多少   algo怎么样   algo图片   algo开户
algo好不好   algo黑不黑   algo挂机软件   algoapp下载   algo是不是骗人的
algo主管是谁   algo工资是多少   algo新闻   algo地图   algo开户地址

以上就是algo的全部内容,转载原文标题及地址请保留本文链接:http://www.akstzs.com/?id=7217

支持Ctrl+Enter提交
 
2002-2020 沐鸣2平台版权所有 TXT地图 HTML地图 XML地图