找回密码
 注册
搜索
热搜: 回贴

脱壳技术,Blaze Media Pro5.05脱壳+基本修复CC(int3)+破解(二),修复

2010-1-30 18:19| 发布者: admin| 查看: 96| 评论: 0|原作者: 小寳寳


脱壳技术,Blaze Media Pro5.05脱壳+基本修复CC(int3)+破解(二),修复
2008年06月23日 星期一 下午 04:11
(二)cc修复



下面我尝试着来修复CC。cc实际上就是int3指令,armadillo把程序中的一些跳转指令改成int3。子进程运行到int3时发生异常,父进程可以捕捉到,然后计算出子进程该不该跳转,如果跳转,跳转量是多少,如果不跳转,下一条指令应从哪里开始。通过getthreadcontext和setthreadcontext函数来干预子进程的运行。因此程序脱壳后,里面的int3指令不修复成原本的跳转指令,程序是不可能运行起来的。



但问题是:脱壳程序中哪些cc是int3指令,哪些cc是数据呢?原先版本的armardillo可以完全区分开来,但现在的版本好像不能够区分,至少我没有找到方法,不知高手们是采用什么办法的。从技术角度来讲,armadillo可以不用区分。我们试想一下:armardillo可以把原程序中所有跳转指令都改成int3,然后连同程序中的cc数据一起进行计算得到一张总表。在加壳时却只随机选一些跳转指令改成int3,但使用的还是那张总表。程序完全可以运行。但我们怎么才能知道总表中哪些是跳转指令呢?我觉得不能,因此也就很难完美修复。



我想到修复的方法有两种,一是在OD中运行加壳程序,设置条件记录断点,然后把程序所有的功能都运行一遍,得到子进程发生int3的地址。二是设计一代码分析器,分析脱壳程序中哪些是int3指令,哪些不是。这两种方法都不能算是完美修复。我的方法是借用OD来找到int3。





我们的目标是得到四个表:int3地址表、跳转类型表、跳转量表及跳转指令长度表。有了这四个表,我们就可以修复cc了。





我们先看第一张int3地址表。在od中打开脱壳程序,从401000~98cfff都是程序的内容,包括代码和资源。armadillo把它们放在同一节中。查找二进制55 8b ec(PUSH EBP MOV EBP, ESP)找到代码开始的部分在5fe660。把5fe660~98cfff选上然后复制到文件中,用ultraedit打开文件,选上“列出包含字符串的行”,查找文本int3。ok,找到如下形式的int3:



0060063E CC INT3

0060063F CC INT3

0060D481 CC INT3

0060D482 CC INT3

0060D483 CC INT3

.....



使用ultraedit的列编辑功能编辑成:



3E 06 60 00

3F 06 60 00

81 D4 60 00

82 D4 60 00

83 D4 60 00

84 D4 60 00

.....



当然这里面有很多都是不符合条件的,是int3原始表。先保存好,下面要用。





在OD中重新打开BMP.exe。下he GetThreadContext,运行,第二次停住时,看堆栈窗:



0012DA78 009EBC88 /CALL to GetThreadContext from BMP.009EBC82

0012DA7C 00000050 |hThread = 00000050 (window)

0012DA80 0012E10C \pContext = 0012E10C



在follow in dump 来到0012E10C。按alt+f9回到用户空间。





0012E1AC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

0012E1BC 00 00 00 00 64 EE 12 00 DC 37 79 00 1B 00 00 00 ....d?.?y. ...

0012E1CC 46 02 00 00 24 EE 12 00 23 00 00 00 00 00 00 00 F ..$?.#.......



12e1c4处的7937dc就是子进程发生的第一个int3地址+1,我们可以用OD把脱壳程序打开看看,运行出的第一个错也是那。 0012E1CC处的246是子进程的Flag寄存器内容。





009EBC82 CALL DWORD PTR DS:[<&KERNEL32.GetThreadC>;

009EBC88 PUSH EAX //停在这,这条指令到009EBCCA都是垃圾指令

009EBC89 NOT EAX

009EBC8B BSWAP EAX

009EBC8D POP EAX

009EBC8E JNB SHORT BMP.009EBC90

009EBC90 PUSHFD

009EBC91 PUSHAD





009EBCC1 MOV EAX, C80F9D61

009EBCC6 NOT ECX

009EBCC8 BSWAP EAX

009EBCCA NOT ECX

009EBCCC MOV DWORD PTR SS:[EBP-1468], 0

009EBCD6 PUSH -1

009EBCD8 PUSH 4

009EBCDA LEA EDX, DWORD PTR SS:[EBP-13AC] ; [12e1c4]=7937dc,子进程发生int3的地址 1

009EBCE0 PUSH EDX

009EBCE1 CALL BMP.009D4F90 ; 对int3地址运算

009EBCE6 ADD ESP, 0C

009EBCE9 MOV DWORD PTR SS:[EBP-1194], EAX ; 运算结果

009EBCEF MOV EAX, DWORD PTR SS:[EBP-1194]

009EBCF5 XOR EDX, EDX

009EBCF7 MOV ECX, 10

009EBCFC DIV ECX ; 运算结果除以10

009EBCFE MOV DWORD PTR SS:[EBP-1198], EDX ; 取余数

009EBD04 MOV EDX, DWORD PTR SS:[EBP-13AC] ; int3地址 1

009EBD0A PUSH EDX

009EBD0B MOV EAX, DWORD PTR SS:[EBP-1198] ; 前面得到的余数

009EBD11 CALL DWORD PTR DS:[EAX*4 A15838] ; 再次运算。

009EBD18 ADD ESP, 4

009EBD1B MOV DWORD PTR SS:[EBP-1468], EAX ; 运算结果,将用于在table1(int3地址计算结果表)中查找

009EBD21 >MOV DWORD PTR SS:[EBP-146C], 0

009EBD2B MOV ECX, DWORD PTR SS:[EBP-1198]

009EBD31 MOV EDX, DWORD PTR DS:[ECX*4 A176D4]

009EBD38 MOV DWORD PTR SS:[EBP-118C], EDX

009EBD3E MOV EAX, DWORD PTR SS:[EBP-146C]

009EBD44 CMP EAX, DWORD PTR SS:[EBP-118C]

009EBD4A JGE SHORT BMP.009EBDA8

009EBD4C MOV EAX, DWORD PTR SS:[EBP-118C]

009EBD52 SUB EAX, DWORD PTR SS:[EBP-146C]

009EBD58 CDQ

009EBD59 SUB EAX, EDX

009EBD5B SAR EAX, 1

009EBD5D MOV ECX, DWORD PTR SS:[EBP-146C]

009EBD63 ADD ECX, EAX

009EBD65 MOV DWORD PTR SS:[EBP-1470], ECX

009EBD6B MOV EDX, DWORD PTR SS:[EBP-1198] ; 前面得到的余数

009EBD71 MOV EAX, DWORD PTR DS:[EDX*4 A1768C] ; [A1768C]开始的是table1地址表,根据前面得到的余数找到table1的地址

009EBD78 MOV ECX, DWORD PTR SS:[EBP-1470]

009EBD7E MOV EDX, DWORD PTR SS:[EBP-1468]

009EBD84 CMP EDX, DWORD PTR DS:[EAX ECX*4]

009EBD87 JBE SHORT BMP.009EBD9A

009EBD89 MOV EAX, DWORD PTR SS:[EBP-1470]

009EBD8F ADD EAX, 1

009EBD92 MOV DWORD PTR SS:[EBP-146C], EAX

009EBD98 JMP SHORT BMP.009EBDA6

009EBD9A MOV ECX, DWORD PTR SS:[EBP-1470]

009EBDA0 MOV DWORD PTR SS:[EBP-118C], ECX

009EBDA6 JMP SHORT BMP.009EBD3E

009EBDA8 PUSHAD ; eax=查表结果(前面运算结果在table1中的序号)

009EBDA9 NOP



....... //nop掉垃圾指令



009EBDCB NOP

009EBDCC NOP

009EBDCD POPAD

009EBDCE MOV EDX, DWORD PTR SS:[EBP-1198] 前面的余数

009EBDD4 MOV EAX, DWORD PTR DS:[EDX*4 A1768C] ; table1地址

009EBDDB MOV ECX, DWORD PTR SS:[EBP-146C]

009EBDE1 MOV EDX, DWORD PTR DS:[EAX ECX*4]

009EBDE4 CMP EDX, DWORD PTR SS:[EBP-1468] ; 再比较一下,看是否相等

009EBDEA JNZ BMP.009EC102



........ // 垃圾指令





009EBE47 MOV EAX, DWORD PTR SS:[EBP-1198] 前面的余数

009EBE4D MOV ECX, DWORD PTR DS:[EAX*4 A17714] ; table2(跳转类型代号表)

009EBE54 MOV EDX, DWORD PTR SS:[EBP-146C]

009EBE5A XOR EAX, EAX

009EBE5C MOV AL, BYTE PTR DS:[ECX EDX] ; 得到跳转类型代号

009EBE5F MOV DWORD PTR SS:[EBP-1488], EAX

009EBE65 MOV EAX, DWORD PTR SS:[EBP-1488]

009EBE6B CDQ

009EBE6C AND EDX, 0F

009EBE6F ADD EAX, EDX

009EBE71 SAR EAX, 4

009EBE74 MOV DWORD PTR SS:[EBP-1480], EAX

009EBE7A MOV ECX, DWORD PTR SS:[EBP-1488]

009EBE80 AND ECX, 8000000F

009EBE86 JNS SHORT BMP.009EBE8D

009EBE88 DEC ECX

009EBE89 OR ECX, FFFFFFF0

009EBE8C INC ECX

009EBE8D MOV DWORD PTR SS:[EBP-1484], ECX

009EBE93 MOV EDX, DWORD PTR SS:[EBP-1480]

009EBE99 CMP EDX, DWORD PTR SS:[EBP-1484]

009EBE9F JNZ SHORT BMP.009EBEBC

009EBEA1 MOV EAX, DWORD PTR SS:[EBP-1484]

009EBEA7 ADD EAX, 1

009EBEAA AND EAX, 8000000F

009EBEAF JNS SHORT BMP.009EBEB6

009EBEB1 DEC EAX

009EBEB2 OR EAX, FFFFFFF0

009EBEB5 INC EAX

009EBEB6 MOV DWORD PTR SS:[EBP-1484], EAX

009EBEBC MOV ECX, DWORD PTR SS:[EBP-1488]

009EBEC2 MOV EDX, DWORD PTR SS:[EBP-1480]

009EBEC8 MOV EAX, DWORD PTR DS:[ECX*4 A16ED0]

009EBECF XOR EAX, DWORD PTR DS:[EDX*4 A1125C]

009EBED6 MOV ECX, DWORD PTR SS:[EBP-1484]

009EBEDC XOR EAX, DWORD PTR DS:[ECX*4 A1125C]

009EBEE3 MOV DWORD PTR SS:[EBP-1478], EAX

009EBEE9 MOV EDX, DWORD PTR SS:[EBP-13A4] ; 子进程context的flag寄存器内容

009EBEEF AND EDX, 0FD7

009EBEF5 PUSH EDX

009EBEF6 MOV EAX, DWORD PTR SS:[EBP-1488] ; 跳转类型代号

009EBEFC MOVSX ECX, BYTE PTR DS:[EAX A15730]

009EBF03 CALL DWORD PTR DS:[ECX*4 A15838]

009EBF0A ADD ESP, 4

009EBF0D MOV DWORD PTR SS:[EBP-1474], EAX

009EBF13 MOV EDX, DWORD PTR SS:[EBP-13B8] 子进程context的ecx内容

009EBF19 PUSH EDX

009EBF1A MOV EAX, DWORD PTR SS:[EBP-1474]

009EBF20 PUSH EAX

009EBF21 CALL DWORD PTR SS:[EBP-1478]

009EBF27 ADD ESP, 8

009EBF2A PUSH EAX

009EBF2B MOV ECX, DWORD PTR SS:[EBP-1488]

009EBF31 MOVSX EDX, BYTE PTR DS:[ECX A15730]

009EBF38 CALL DWORD PTR DS:[EDX*4 A15878]

009EBF3F ADD ESP, 4

009EBF42 MOV DWORD PTR SS:[EBP-147C], EAX

009EBF48 MOV EAX, DWORD PTR SS:[EBP-147C]

009EBF4E AND EAX, 1

009EBF51 TEST EAX, EAX //经过若干次复杂计算最后得到子进程在7937dc处是跳呢(eax=1),还是不跳(eax=0)

009EBF53 JE BMP.009EC007

009EBF59 PUSHAD





009EBF7E POPAD

009EBF7F MOV ECX, DWORD PTR SS:[EBP-1198] //如果eax=1,到这

009EBF85 MOV ECX, DWORD PTR DS:[ECX*4 A1764C]

009EBF8C MOV EAX, DWORD PTR SS:[EBP-146C]

009EBF92 XOR EDX, EDX

009EBF94 MOV ESI, 10

009EBF99 DIV ESI

009EBF9B MOV EAX, DWORD PTR SS:[EBP-146C]

009EBFA1 MOV ECX, DWORD PTR DS:[ECX EAX*4]

009EBFA4 XOR ECX, DWORD PTR SS:[EBP EDX*4-1170] //得到跳转量

009EBFAB MOV EDX, DWORD PTR SS:[EBP-13AC]

009EBFB1 ADD EDX, ECX

009EBFB3 MOV DWORD PTR SS:[EBP-13AC], EDX //重新设置context







009EC012 MOV EAX, DWORD PTR SS:[EBP-1198] //如果eax=0,到这

009EC018 MOV ECX, DWORD PTR DS:[EAX*4 A17758]

009EC01F MOV EDX, DWORD PTR SS:[EBP-146C]

009EC025 XOR EAX, EAX

009EC027 MOV AL, BYTE PTR DS:[ECX EDX] //得到下一条指令的距离

009EC02A MOV ECX, DWORD PTR SS:[EBP-13AC]

009EC030 ADD ECX, EAX

009EC032 MOV DWORD PTR SS:[EBP-13AC], ECX //重新设置context





好,知道这些后,我们要对上段代码进行大修改。



下面是修改好的代码:



××××××

009EBC88 PUSH ESP //下面代码修改401000开始的空间读写属性,使得可写。

009EBC89 PUSH 4

009EBC8B PUSH BMP.00578000

009EBC90 PUSH BMP.00401000

009EBC95 CALL DWORD PTR DS:[<&KERNEL32.VirtualPro>; kernel32.VirtualProtect

009EBC9B NOP



009EBC9F NOP

009EBCA0 MOV EAX, DWORD PTR DS:[500000] //[500000]中是原始int3表计数器

009EBCA5 MOV EAX, DWORD PTR DS:[EAX*4 401000] //401000开始放置int3原始表

009EBCAD TEST EAX, EAX

009EBCAF JE BMP.009EC045 //int3原始表到最后?是则结束。

009EBCB5 LEA EDX, DWORD PTR SS:[EBP-13AC]

009EBCBB INC EAX

009EBCBC MOV DWORD PTR DS:[EDX], EAX

009EBCBE INC DWORD PTR DS:[500000]

009EBCC4 NOP

××××××





009EBCCB NOP

009EBCCC MOV DWORD PTR SS:[EBP-1468], 0

009EBCD6 PUSH -1

009EBCD8 PUSH 4

009EBCDA LEA EDX, DWORD PTR SS:[EBP-13AC] ;

009EBCE0 PUSH EDX

009EBCE1 CALL BMP.009D4F90 ;

009EBCE6 ADD ESP, 0C

009EBCE9 MOV DWORD PTR SS:[EBP-1194], EAX ;

009EBCEF MOV EAX, DWORD PTR SS:[EBP-1194]

009EBCF5 XOR EDX, EDX

009EBCF7 MOV ECX, 10

009EBCFC DIV ECX ;

009EBCFE MOV DWORD PTR SS:[EBP-1198], EDX ;

009EBD04 MOV EDX, DWORD PTR SS:[EBP-13AC] ;

009EBD0A PUSH EDX

009EBD0B MOV EAX, DWORD PTR SS:[EBP-1198] ;

009EBD11 CALL DWORD PTR DS:[EAX*4 A15838] ;

009EBD18 ADD ESP, 4

009EBD1B MOV DWORD PTR SS:[EBP-1468], EAX ;

009EBD21 MOV DWORD PTR SS:[EBP-146C], 0

009EBD2B MOV ECX, DWORD PTR SS:[EBP-1198]

009EBD31 MOV EDX, DWORD PTR DS:[ECX*4 A176D4]

009EBD38 MOV DWORD PTR SS:[EBP-118C], EDX

009EBD3E MOV EAX, DWORD PTR SS:[EBP-146C]

009EBD44 CMP EAX, DWORD PTR SS:[EBP-118C]

009EBD4A JGE SHORT BMP.009EBDA8

009EBD4C MOV EAX, DWORD PTR SS:[EBP-118C]

009EBD52 SUB EAX, DWORD PTR SS:[EBP-146C]

009EBD58 CDQ

009EBD59 SUB EAX, EDX

009EBD5B SAR EAX, 1

009EBD5D MOV ECX, DWORD PTR SS:[EBP-146C]

009EBD63 ADD ECX, EAX

009EBD65 MOV DWORD PTR SS:[EBP-1470], ECX

009EBD6B MOV EDX, DWORD PTR SS:[EBP-1198] ;

009EBD71 MOV EAX, DWORD PTR DS:[EDX*4 A1768C] ;

009EBD78 MOV ECX, DWORD PTR SS:[EBP-1470]

009EBD7E MOV EDX, DWORD PTR SS:[EBP-1468]

009EBD84 CMP EDX, DWORD PTR DS:[EAX ECX*4]

009EBD87 JBE SHORT BMP.009EBD9A

009EBD89 MOV EAX, DWORD PTR SS:[EBP-1470]

009EBD8F ADD EAX, 1

009EBD92 MOV DWORD PTR SS:[EBP-146C], EAX

009EBD98 JMP SHORT BMP.009EBDA6

009EBD9A MOV ECX, DWORD PTR SS:[EBP-1470]

009EBDA0 MOV DWORD PTR SS:[EBP-118C], ECX

009EBDA6 JMP SHORT BMP.009EBD3E

009EBDA8 NOP ;

009EBDA9 NOP

009EBDAA MOV EDX, DWORD PTR SS:[EBP-1198]

009EBDB0 MOV EAX, DWORD PTR DS:[EDX*4 A1768C]

009EBDB7 MOV ECX, DWORD PTR SS:[EBP-146C]

009EBDBD MOV EDX, DWORD PTR DS:[EAX ECX*4]

009EBDC0 CMP EDX, DWORD PTR SS:[EBP-1468]

009EBDC6 JNZ BMP.009EBCA0 //这段代码我把它的位置朝前挪了,修改了跳转量

009EBDCC NOP

009EBDCD NOP





××××××

009EBDCE MOV EAX, DWORD PTR DS:[500004] //符合条件的int3计数器

009EBDD3 LEA EDX, DWORD PTR SS:[EBP-13AC]

009EBDD9 MOV EDX, DWORD PTR DS:[EDX]

009EBDDB MOV DWORD PTR DS:[EAX*4 405F00], EDX //符合条件的int3地址从405F00开始放

009EBDE3 NOP



//下面这段代码是为了得到跳转类型而增加的,目的是得到009EBF75处我自编函数需要的东西

009EBDEA NOP

009EBDEB MOV EAX, BMP.0050000C //50000C中是计数器

009EBDF0 XOR ECX, ECX

009EBDF2 MOV DWORD PTR DS:[EAX], ECX //计数器置0

009EBDF4 MOV DWORD PTR DS:[EAX 4], ECX //context的ecx=0

009EBDF7 MOV DWORD PTR DS:[EAX C], ECX //context的flag=0

009EBDFA INC ECX

009EBDFB MOV DWORD PTR DS:[EAX 8], ECX //context的ecx=1

009EBDFE MOV DWORD PTR DS:[EAX 10], ECX //flag的cf=1

009EBE01 MOV DWORD PTR DS:[EAX 14], 4 //pf=1

009EBE08 MOV DWORD PTR DS:[EAX 18], 40 //zf=1

009EBE0F MOV DWORD PTR DS:[EAX 1C], 80 //sf=1

009EBE16 MOV DWORD PTR DS:[EAX 20], 800 //of=1

009EBE1D LEA EAX, DWORD PTR SS:[EBP-1464]

009EBE23 MOV ECX, DWORD PTR DS:[50000C]

009EBE29 MOV EDX, DWORD PTR DS:[ECX*4 500010]

009EBE31 CMP ECX, 1

009EBE34 JG SHORT BMP.009EBE3E

009EBE36 MOV DWORD PTR DS:[EAX AC], EDX

009EBE3C JMP SHORT BMP.009EBE44

009EBE3E MOV DWORD PTR DS:[EAX C0], EDX

009EBE44 NOP

××××××



009EBE46 NOP

009EBE47 MOV EAX, DWORD PTR SS:[EBP-1198]

009EBE4D MOV ECX, DWORD PTR DS:[EAX*4 A17714]

009EBE54 MOV EDX, DWORD PTR SS:[EBP-146C]

009EBE5A XOR EAX, EAX

009EBE5C MOV AL, BYTE PTR DS:[ECX EDX] ;

009EBE5F MOV DWORD PTR SS:[EBP-1488], EAX

009EBE65 MOV EAX, DWORD PTR SS:[EBP-1488]

009EBE6B CDQ

009EBE6C AND EDX, 0F

009EBE6F ADD EAX, EDX

009EBE71 SAR EAX, 4

009EBE74 MOV DWORD PTR SS:[EBP-1480], EAX

009EBE7A MOV ECX, DWORD PTR SS:[EBP-1488]

009EBE80 AND ECX, 8000000F

009EBE86 JNS SHORT BMP.009EBE8D

009EBE88 DEC ECX

009EBE89 OR ECX, FFFFFFF0

009EBE8C INC ECX

009EBE8D MOV DWORD PTR SS:[EBP-1484], ECX

009EBE93 MOV EDX, DWORD PTR SS:[EBP-1480]

009EBE99 CMP EDX, DWORD PTR SS:[EBP-1484]

009EBE9F JNZ SHORT BMP.009EBEBC

009EBEA1 MOV EAX, DWORD PTR SS:[EBP-1484]

009EBEA7 ADD EAX, 1

009EBEAA AND EAX, 8000000F

009EBEAF JNS SHORT BMP.009EBEB6

009EBEB1 DEC EAX

009EBEB2 OR EAX, FFFFFFF0

009EBEB5 INC EAX

009EBEB6 MOV DWORD PTR SS:[EBP-1484], EAX

009EBEBC MOV ECX, DWORD PTR SS:[EBP-1488]

009EBEC2 MOV EDX, DWORD PTR SS:[EBP-1480]

009EBEC8 MOV EAX, DWORD PTR DS:[ECX*4 A16ED0]

009EBECF XOR EAX, DWORD PTR DS:[EDX*4 A1125C]

009EBED6 MOV ECX, DWORD PTR SS:[EBP-1484]

009EBEDC XOR EAX, DWORD PTR DS:[ECX*4 A1125C]

009EBEE3 MOV DWORD PTR SS:[EBP-1478], EAX

009EBEE9 MOV EDX, DWORD PTR SS:[EBP-13A4] ;

009EBEEF AND EDX, 0FD7

009EBEF5 PUSH EDX

009EBEF6 MOV EAX, DWORD PTR SS:[EBP-1488] ;

009EBEFC MOVSX ECX, BYTE PTR DS:[EAX A15730]

009EBF03 CALL DWORD PTR DS:[ECX*4 A15838]

009EBF0A ADD ESP, 4

009EBF0D MOV DWORD PTR SS:[EBP-1474], EAX

009EBF13 MOV EDX, DWORD PTR SS:[EBP-13B8]

009EBF19 PUSH EDX

009EBF1A MOV EAX, DWORD PTR SS:[EBP-1474]

009EBF20 PUSH EAX

009EBF21 CALL DWORD PTR SS:[EBP-1478]

009EBF27 ADD ESP, 8

009EBF2A PUSH EAX

009EBF2B MOV ECX, DWORD PTR SS:[EBP-1488]

009EBF31 MOVSX EDX, BYTE PTR DS:[ECX A15730]

009EBF38 CALL DWORD PTR DS:[EDX*4 A15878]

009EBF3F ADD ESP, 4

009EBF42 MOV DWORD PTR SS:[EBP-147C], EAX

009EBF48 MOV EAX, DWORD PTR SS:[EBP-147C]

009EBF4E AND EAX, 1

009EBF51 NOP

009EBF52 NOP



×××××××

009EBF53 MOV ECX, DWORD PTR DS:[50000C]

009EBF59 MOV DWORD PTR DS:[ECX*4 500010], EAX //得到的eax从500010开始放。

009EBF61 INC ECX

009EBF62 MOV DWORD PTR DS:[50000C], ECX //计数器 1

009EBF68 CMP ECX, 7

009EBF6B JLE BMP.009EBE1D //循环8次

009EBF71 NOP

009EBF72 NOP

009EBF73 PUSHAD

009EBF74 PUSHFD

009EBF75 CALL BMP.009EC050 //我编的判断跳转类型的函数,后面有说明

009EBF7A POPFD

009EBF7B POPAD

009EBF7C NOP

××××××



009EBF7E NOP

009EBF7F MOV ECX, DWORD PTR SS:[EBP-1198]

009EBF85 MOV ECX, DWORD PTR DS:[ECX*4 A1764C]

009EBF8C MOV EAX, DWORD PTR SS:[EBP-146C]

009EBF92 XOR EDX, EDX

009EBF94 MOV ESI, 10

009EBF99 DIV ESI

009EBF9B MOV EAX, DWORD PTR SS:[EBP-146C]

009EBFA1 MOV ECX, DWORD PTR DS:[ECX EAX*4]

009EBFA4 XOR ECX, DWORD PTR SS:[EBP EDX*4-1170]

009EBFAB NOP

009EBFAC NOP

009EBFAD MOV EAX, DWORD PTR DS:[500004]

009EBFB2 MOV DWORD PTR DS:[EAX*4 40FD00], ECX ;跳转量从40FD00开始放

009EBFBA NOP

......



009EC011 NOP

009EC012 MOV EAX, DWORD PTR SS:[EBP-1198]

009EC018 MOV ECX, DWORD PTR DS:[EAX*4 A17758]

009EC01F MOV EDX, DWORD PTR SS:[EBP-146C]

009EC025 XOR EAX, EAX

009EC027 MOV AL, BYTE PTR DS:[ECX EDX]

009EC02A NOP

009EC02B NOP

009EC02C MOV ECX, DWORD PTR DS:[500004]

009EC032 MOV BYTE PTR DS:[ECX 414C00], AL ;不跳,下条指令偏移量从414C00开始放

009EC038 NOP

009EC039 NOP

009EC03A INC DWORD PTR DS:[500004]

009EC040 JMP BMP.009EBCA0

009EC045 NOP





说明:



×××××××之间的代码是我添加上去的。



其中call 009EC050是我自己编的判断跳转类型代码,需要8个输入量:yecx0,yecx1,yflag0,ycf1,ypf1,yzf1,ysf1,yof1。

yecx0是context中ecx=0,armadillo计算出的值(1或0,分别表示跳或不跳),yecx1是ecx=1对应的值,其它类似。





代码流程:



if(yecx0 XOR yecx1) -> JECXZ

else if(ypf0 XOR ypf1)

{

if(ypf0) ->JNP

else ->JP

}

else if(yzf0 XOR yzf1)

{

if(ycf0 XOR ycf1)

{

if(yzf0) ->JNBE

else ->JBE

}

else if(ysf0 XOR ysf1)

{

if(yzf0) ->JNLE

else ->JLE

}

else

{

if(yzf0) ->JNE

else ->JE

}

}

else if(ysf0 XOR ysf1)

{

if(yof0 XOR yof1)

{

if(yof0) ->JNL

else ->JL

}

else

{

if(ysf0) ->JNS

else ->JS

}

}

else if(yof0 XOR yof1)

{

if(yof0) ->JNO

else ->JO

}

else if(ycf0 XOR ycf1)

{

if(ycf0) ->JNB

else ->JB

}

else if(yzf0) ->JMP

else ->NOP



其中yzf0、ysf0、yof0...等于yflag0。





具体代码(中间的nop是预留的,以便增加代码):



009EC050 MOV EDI, DWORD PTR DS:[500004] //有效int3的计数器

009EC056 ADD EDI, BMP.0040AE00 //跳转类型从40AE00开始放

009EC05C MOV EDX, BMP.0050000C

009EC061 MOV EAX, DWORD PTR DS:[EDX 4]

009EC064 MOV EBX, DWORD PTR DS:[EDX 8]

009EC067 XOR EBX, EAX

009EC069 JE SHORT BMP.009EC07A

009EC06B NOP

009EC06C NOP

009EC06D MOV BYTE PTR DS:[EDI], 0E3

009EC070 JMP BMP.009EC195

009EC075 NOP

009EC076 NOP

009EC077 NOP

009EC078 NOP

009EC079 NOP

009EC07A MOV EAX, DWORD PTR DS:[EDX C]

009EC07D MOV EBX, DWORD PTR DS:[EDX 14]

009EC080 XOR EBX, EAX

009EC082 JE SHORT BMP.009EC0A1

009EC084 TEST EAX, EAX

009EC086 JE SHORT BMP.009EC094

009EC088 NOP

009EC089 NOP

009EC08A MOV BYTE PTR DS:[EDI], 7B

009EC08D JMP BMP.009EC195

009EC092 NOP

009EC093 NOP

009EC094 MOV BYTE PTR DS:[EDI], 7A

009EC097 JMP BMP.009EC195

009EC09C NOP

009EC09D NOP

009EC09E NOP

009EC09F NOP

009EC0A0 NOP

009EC0A1 MOV EBX, DWORD PTR DS:[EDX 18]

009EC0A4 XOR EBX, EAX

009EC0A6 JE SHORT BMP.009EC109

009EC0A8 NOP

009EC0A9 NOP

009EC0AA MOV EBX, DWORD PTR DS:[EDX 10]

009EC0AD XOR EBX, EAX

009EC0AF JE SHORT BMP.009EC0CB

009EC0B1 TEST EAX, EAX

009EC0B3 JE SHORT BMP.009EC0C1

009EC0B5 NOP

009EC0B6 NOP

009EC0B7 MOV BYTE PTR DS:[EDI], 77

009EC0BA JMP BMP.009EC195

009EC0BF NOP

009EC0C0 NOP

009EC0C1 MOV BYTE PTR DS:[EDI], 76

009EC0C4 JMP BMP.009EC195

009EC0C9 NOP

009EC0CA NOP

009EC0CB MOV EBX, DWORD PTR DS:[EDX 1C]

009EC0CE XOR EBX, EAX

009EC0D0 JE SHORT BMP.009EC0EC

009EC0D2 TEST EAX, EAX

009EC0D4 JE SHORT BMP.009E, C0E2

009EC0D6 NOP

009EC0D7 NOP

009EC0D8 MOV BYTE PTR DS:[EDI], 7F

009EC0DB JMP BMP.009EC195

009EC0E0 NOP

009EC0E1 NOP

009EC0E2 MOV BYTE PTR DS:[EDI], 7E

009EC0E5 JMP BMP.009EC195

009EC0EA NOP

009EC0EB NOP

009EC0EC TEST EAX, EAX

009EC0EE JE SHORT BMP.009EC0FC

009EC0F0 NOP

009EC0F1 NOP

009EC0F2 MOV BYTE PTR DS:[EDI], 75

009EC0F5 JMP BMP.009EC195

009EC0FA NOP

009EC0FB NOP

009EC0FC MOV BYTE PTR DS:[EDI], 74

009EC0FF JMP BMP.009EC195

009EC104 NOP

009EC105 NOP

009EC106 NOP

009EC107 NOP

009EC108 NOP

009EC109 MOV EBX, DWORD PTR DS:[EDX 1C]

009EC10C XOR EBX, EAX

009EC10E JE SHORT BMP.009EC144

009EC110 NOP

009EC111 NOP

009EC112 MOV EBX, DWORD PTR DS:[EDX 20]

009EC115 XOR EBX, EAX

009EC117 JE SHORT BMP.009EC12D

009EC119 TEST EAX, EAX

009EC11B JE SHORT BMP.009EC126

009EC11D NOP

009EC11E NOP

009EC11F MOV BYTE PTR DS:[EDI], 7D

009EC122 JMP SHORT BMP.009EC195

009EC124 NOP

009EC125 NOP

009EC126 MOV BYTE PTR DS:[EDI], 7C

009EC129 JMP SHORT BMP.009EC195

009EC12B NOP

009EC12C NOP

009EC12D TEST EAX, EAX

009EC12F JE SHORT BMP.009EC13A

009EC131 NOP

009EC132 NOP

009EC133 MOV BYTE PTR DS:[EDI], 79

009EC136 JMP SHORT BMP.009EC195

009EC138 NOP

009EC139 NOP

009EC13A MOV BYTE PTR DS:[EDI], 78

009EC13D JMP SHORT BMP.009EC195

009EC13F NOP

009EC140 NOP

009EC141 NOP

009EC142 NOP

009EC143 NOP

009EC144 MOV EBX, DWORD PTR DS:[EDX 20]

009EC147 XOR EBX, EAX

009EC149 JE SHORT BMP.009EC162

009EC14B TEST EAX, EAX

009EC14D JE SHORT BMP.009EC158

009EC14F NOP

009EC150 NOP

009EC151 MOV BYTE PTR DS:[EDI], 71

009EC154 JMP SHORT BMP.009EC195

009EC156 NOP

009EC157 NOP

009EC158 MOV BYTE PTR DS:[EDI], 70

009EC15B JMP SHORT BMP.009EC195

009EC15D NOP

009EC15E NOP

009EC15F NOP

009EC160 NOP

009EC161 NOP

009EC162 MOV EBX, DWORD PTR DS:[EDX 10]

009EC165 XOR EBX, EAX

009EC167 JE SHORT BMP.009EC180

009EC169 TEST EAX, EAX

009EC16B JE SHORT BMP.009EC176

009EC16D NOP

009EC16E NOP

009EC16F MOV BYTE PTR DS:[EDI], 73

009EC172 JMP SHORT BMP.009EC195

009EC174 NOP

009EC175 NOP

009EC176 MOV BYTE PTR DS:[EDI], 72

009EC179 JMP SHORT BMP.009EC195

009EC17B NOP

009EC17C NOP

009EC17D NOP

009EC17E NOP

009EC17F NOP

009EC180 TEST EAX, EAX

009EC182 JE SHORT BMP.009EC190

009EC184 NOP

009EC185 NOP

009EC186 MOV BYTE PTR DS:[EDI], 0EB

009EC189 JMP SHORT BMP.009EC195

009EC18B NOP

009EC18C NOP

009EC18D NOP

009EC18E NOP

009EC18F NOP

009EC190 MOV BYTE PTR DS:[EDI], 90

009EC193 NOP

009EC194 NOP

009EC195 RETN





在009EC045处下断,运行之前,记得把int3原始表拷贝到401000开始处。运行停住。从405f00到419b00有四个表:



405f00~40ae00 int3地址表

40ae00~40fd00 跳转类型表

40fd00~414c00 跳转量表

414c00~419b00 跳转命令长度表



把405f00~419b00拷贝下来保存好。接下来要用。



还没完,好痛苦。



pyzpyz




最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 23:26 , Processed in 0.129490 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部