飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 10365|回复: 38

[原创] Themida.V1.9.1.0 手脱XP记事本笔记

[复制链接]

该用户从未签到

发表于 2008-3-13 01:03:07 | 显示全部楼层 |阅读模式
【文章标题】: Themida.V1.9.1.0 手脱XP记事本笔记
【文章作者】: 笨虫虫
【作者邮箱】: dm_bcc@hotmail.com
【软件名称】: NOTEPAD.exe
【加壳方式】: Themida.V1.9.1.0
【保护方式】: 代码变形 iat加密  oep偷取
【编写语言】: Microsoft Visual C++ 7.0 Method2 [Debug]
【使用工具】: OllyICE(Hideod 0.17) LordPE ImportREC
【操作平台】: 盗版XP SP2
【作者声明】: Themida手脱教程太少,写来玩玩。失误之处敬请诸位大侠赐教!
【详细过程】:
1.首先查壳:Themida/WinLicense V1.8.X.X+-V1.9.X.X   -> Oreans Technologies   * Sign.By.dm_bcc *
好了,OD 载入 ,忽略所有异常,用Hideod 插件隐藏OD!
01014014 >  B8 00000000           mov eax,0 -> Themida/WinLicense V1.8.X.X+-V1.9.X.X 入口
01014019    60                    pushad
0101401A    0BC0                  or eax,eax
0101401C    74 68                 je short NOTEPAD.01014086
0101401E    E8 00000000           call NOTEPAD.01014023
01014023    58                    pop eax
01014024    05 53000000           add eax,53
01014029    8038 E9               cmp byte ptr ds:[eax],0E9
0101402C    75 13                 jnz short NOTEPAD.01014041
0101402E    61                    popad
0101402F    EB 45                 jmp short NOTEPAD.01014076
01014031    DB2D 37400101         fld tbyte ptr ds:[1014037]

我们在CODE段下内存写入断点
01119D6B    F3:A4                 rep movs byte ptr es:[edi],byte ptr ds:[esi]->在这里我们用F7+F8运行程序
01119D6D    C685 45217409 56      mov byte ptr ss:[ebp+9742145],56
01119D74    68 396D1FD4           push D41F6D39
01119D79    FFB5 DD257409         push dword ptr ss:[ebp+97425DD]
01119D7F    8D85 A1C67709         lea eax,dword ptr ss:[ebp+977C6A1]

然后用F9接着运行程序,我们会停到以下地址
011287F5    8913                  mov dword ptr ds:[ebx],edx      ; comdlg32.PageSetupDlgW ->停到这里
011287F7    5B                    pop ebx
011287F8    5A                    pop edx
011287F9    F9                    stc
011287FA    AD                    lods dword ptr ds:[esi]
011287FB    60                    pushad
011287FC    60                    pushad
011287FD    0FB7FB                movzx edi,bx
01128800    81D1 96A16064         adc ecx,6460A196
01128806    61                    popad
01128807    66:B9 3E29            mov cx,293E
0112880B    61                    popad

我们会看到011287F5把一个API地址存放到dword ptr ds:[ebx]数组里到底有什么用呢,我们取消内存断点,用F8往下走。走到以下代码
01128A90    803F 90               cmp byte ptr ds:[edi],90  ; 比较要写的CALL地址数据是不是NOP
01128A93    0F84 2B000000         je NOTEPAD.01128AC4
01128A99    F5                    cmc
01128A9A    50                    push eax
01128A9B    B8 05000000           mov eax,5
01128AA0    01C7                  add edi,eax
01128AA2    8B0424                mov eax,dword ptr ss:[esp]
01128AA5    83C4 04               add esp,4
01128AA8    FC                    cld
01128AA9    E9 E5010000           jmp NOTEPAD.01128C93
01128AAE    FC                    cld
01128AAF    E9 10000000           jmp NOTEPAD.01128AC4
01128AB4    D6                    salc
01128AB5    81C2 4EA6589A         add edx,9A58A64E

01128A90这句里发现地址ds:[0100643D]数据为什么要跟90比较呢,用Ctrl+G跑到0100643D去看看
01006428 833D ACA40001 00 cmp dword ptr ds:[100A4AC],0
0100642F 75 40 jnz short NOTEPAD.01006471
01006431 800D B1A40001 04 or byte ptr ds:[100A4B1],4
01006438 68 A0A40001 push NOTEPAD.0100A4A0
0100643D 90 nop
0100643E 90 nop
0100643F 90 nop
01006440 90 nop
01006441 90 nop
01006442 90 nop

看到这里很眼熟,有点像是未加壳的程序。我们打开原版的来看看,是否有联系?
原版
01006428 /$ 833D ACA40001 00 cmp dword ptr ds:[100A4AC],0
0100642F |. 75 40 jnz short NOTEPAD?01006471
01006431 |. 800D B1A40001 04 or byte ptr ds:[100A4B1],4
01006438 |. 68 A0A40001 push NOTEPAD?0100A4A0
0100643D |. FF15 C4120001 call dword ptr ds:[<&comdlg32.PageSetupDlgW>] ; comdlg32.PageSetupDlgW

看到0100643D,这里很明显的调用PageSetupDlgW API的地方。Themida是在做准备写入call PageSetupDlgW的准备。往下走
01128B77 AA stos byte ptr es:[edi] ; 把E8也就是CALL放入程序地址
01128B78 60 pushad
01128B79 BE 37D29C76 mov esi,769CD237
01128B7E 0F81 02000000 jno NOTEPAD.01128B86
01128B84 8BF1 mov esi,ecx
01128B86 61 popad
01128B87 E9 11000000 jmp NOTEPAD.01128B9D

走到01128B77 al=E8 es:[edi]=[0100643D]=90 呵呵,E8是CALL十六进制哦。这句就是把CALL写入0100643D
01128C8D AB stos dword ptr es:[edi] ; 把API的地址写入到程序中
01128C8E 60 pushad
01128C8F 0FB7C0 movzx eax,ax
01128C92 61 popad
01128C93 AD lods dword ptr ds:[esi]
01128C94 60 pushad
01128C95 0F83 06000000 jnb NOTEPAD.01128CA1
01128C9B 0F84 00000000 je NOTEPAD.01128CA1

以上这两段程序,也就在0100643D上写入call PageSetupDlgW,Themida的花指令还有一堆的跳转,看得我眼都花了。
我们接着F8慢慢让程序走,经过一堆的长跳短跳还有花指令我们来到下面代码
01125CD3 FC cld
01125CD4 FF85 2D327409 inc dword ptr ss:[ebp+974322D]
01125CDA 60 pushad
01125CDB 52 push edx
01125CDC E8 0F000000 call NOTEPAD.01125CF0;
01125CE1 43 inc ebx
01125CE2 D222 shl byte ptr ds:[edx],cl
01125CE4 3F aas
01125CE5 0C B7 or al,0B7

01125CDC 这个CALL,有什么用呢?我们先按F7进去看看。
0112647F 89E6 mov esi,esp
01126481 81C6 04000000 add esi,4
01126487 83C6 04 add esi,4
0112648A 873424 xchg dword ptr ss:[esp],esi
0112648D 5C pop esp
0112648E 60 pushad
0112648F E8 11000000 call NOTEPAD.011264A5 ->杀进
01126494 CE into
01126495 AF scas dword ptr es:[edi]
01126496 CF iretd

0112648F地方又一个CALL,杀进。
011265E9 50 push eax
011265EA 60 pushad
011265EB 66:81F3 D915 xor bx,15D9
011265F0 60 pushad
011265F1 E8 0F000000 call NOTEPAD.01126605 ; <-这个CALL好毒哦
011265F6 4A dec edx
011265F7 D8E1 fsub st,st(1)
011265F9 49 dec ecx
011265FA BD 9AB2FFC2 mov ebp,C2FFB29A
011265FF 6C ins byte ptr es:[edi],dx
01126600 A7 cmps dword ptr ds:[esi],dword ptr es:[edi]

011265F1这个CALL必须要按F7运行,否则你的程序就会飞了。

0112664E 83BD 311E7409 01 cmp dword ptr ss:[ebp+9741E31],1 ;
01126655 0F84 B3000000 je NOTEPAD.0112670E ;
0112665B F8 clc
0112665C 3B8D F9017409 cmp ecx,dword ptr ss:[ebp+97401F9] ;
01126662 0F84 A6000000 je NOTEPAD.0112670E ;

在0112665C用F4运行程序,可以寄存器看到IAT的信息,当跳到0112670E时,我在Themida写入程序call的时候不是直接调用原API地址,而且是加密的地方.所以我们得找出所有的je 0112670E是跳往IAT加密的地方,我们得找出来改成NOP
01126655 /0F84 B3000000 je NOTEPAD.0112670E
01126662 /0F84 A6000000 je NOTEPAD.0112670E
01126682 /0F84 86000000 je NOTEPAD.0112670E
011266A3 /0F84 65000000 je NOTEPAD.0112670E

我们改动后,在程序运行到写WideCharToMultiByte时,程序会自动退出,看来他还有一个校验我们没有完成。重新装载程序,让程序跑到0112665C时按F4,让程序运行到写WideCharToMultiByte,加密看得眼花,我们偷点懒,在CODE下写入断点,让他又回到01128C8D清除内存断点然后按F8,慢慢走咯。走到这里
01125EBB 66:81EF A643 sub di,43A6
01125EC0 61 popad
01125EC1 3985 29237409 cmp dword ptr ss:[ebp+9742329],eax
01125EC7 0F84 70000000 je NOTEPAD.01125F3D ;

发现01125EC7改动过的程序,这里是不跳的,未改动过的程序里开跳。看来这里就程序的效验比较了,所以我们得把这里改成jmp NOTEPAD.01125F3D
修改好以上五个地方,在ZwFreeVirtualMemory下断,F9运行程序,断下后在他的retn下断
7C92DA48 > B8 53000000 mov eax,53
7C92DA4D BA 0003FE7F mov edx,7FFE0300
7C92DA52 FF12 call dword ptr ds:[edx]
7C92DA54 C2 1000 retn 10 ->这里下断

然后我们在Code段下断点。然后按F9在7C92DA54停下不要取消断点,再在Code段下断,重复此动作,直到程序运行到这里
01007568 68 BA750001 push NOTEPAD.010075BA
0100756D 64:A1 00000000 mov eax,dword ptr fs:[0]
01007573 50 push eax
01007574 8B4424 10 mov eax,dword ptr ss:[esp+10]
01007578 896C24 10 mov dword ptr ss:[esp+10],ebp
0100757C 8D6C24 10 lea ebp,dword ptr ss:[esp+10]
01007580 2BE0 sub esp,eax
01007582 53 push ebx
01007583 56 push esi
01007584 57 push edi
01007585 8B45 F8 mov eax,dword ptr ss:[ebp-8]
01007588 8965 E8 mov dword ptr ss:[ebp-18],esp
0100758B 50 push eax
0100758C 8B45 FC mov eax,dword ptr ss:[ebp-4]
0100758F C745 FC FFFFFFFF mov dword ptr ss:[ebp-4],-1
01007596 8945 F8 mov dword ptr ss:[ebp-8],eax
01007599 8D45 F0 lea eax,dword ptr ss:[ebp-10]
0100759C 64:A3 00000000 mov dword ptr fs:[0],eax
010075A2 C3 retn

01007568记得此地址,修复oep要用上 修复OEP(1)
然后Ctrl+F9执行到返回,再按F8。然后在CODE下断后。
010ADB90 FF32 push dword ptr ds:[edx] ; kernel32.GetModuleHandleA 修复OEP(2)

记得EDX的值,修复ope用得上。按两下F8,再到CODE段下断点就来到被改动OEP了
010073CC 3D 0B010000 cmp eax,10B ; <-OEP
010073D1 74 1F je short NOTEPAD.010073F2
010073D3 3D 0B020000 cmp eax,20B
010073D8 74 05 je short NOTEPAD.010073DF
010073DA 895D E4 mov dword ptr ss:[ebp-1C],ebx
010073DD EB 27 jmp short NOTEPAD.01007406
010073DF 83B9 84000000 0E cmp dword ptr ds:[ecx+84],0E
010073E6 ^ 76 F2 jbe short NOTEPAD.010073DA
010073E8 33C0 xor eax,eax
010073EA 3999 F8000000 cmp dword ptr ds:[ecx+F8],ebx
010073F0 EB 0E jmp short NOTEPAD.01007400
010073F2 8379 74 0E cmp dword ptr ds:[ecx+74],0E
010073F6 ^ 76 E2 jbe short NOTEPAD.010073DA
010073F8 33C0 xor eax,eax
010073FA 3999 E8000000 cmp dword ptr ds:[ecx+E8],ebx
01007400 0F95C0 setne al
01007403 8945 E4 mov dword ptr ss:[ebp-1C],eax
01007406 895D FC mov dword ptr ss:[ebp-4],ebx
01007409 6A 02 push 2
0100740B 90 nop

这时看到堆栈,往下拉
0007FF80 7DA0D12A SHELL32.7DA0D12A
0007FF84 0007FFE0 指针到下一个 SEH 记录
0007FF88 010075BA SE 句柄
0007FF8C 01001898 NOTEPAD.01001898 ->修复OEP(3)

我就偷点懒,修复OEP就不详细说了
原版的OEP
0100739D > $ 6A 70 push 70
0100739F . 68 98180001 push NOTEPAD?01001898 ->(3)
010073A4 . E8 BF010000 call NOTEPAD?01007568 ->(1)
010073A9 . 33DB xor ebx,ebx
010073AB . 53 push ebx ; /pModule => NULL
010073AC . 8B3D CC100001 mov edi,dword ptr ds:[<&KERNEL32.GetModuleHandleA>] ; |kernel32.GetModuleHandleA ->(2)
010073B2 . FFD7 call edi ; \GetModuleHandleA

修复好OEP dump。用Import REConstructor修复,输入OEP(1),IAT AutoSearch提示Could not find anything good at this OEP!
我们利用修复OEP(2)EDX的值来找到IAT
EDX的值是10010CC,D 10010CC,往上走,最高是1001000所以RVA就是1000,往下看到10001340结束 size  = 10001344 -1001000 =344
Get Imports ->Fix Dump 完成。运行还可以跑。:lol
好累哦,研究了两天,请大大们不要笑我用笨办法来做,还有什么失误之处,还有更好的方法。大家多指点些我。别跟我说用脚本就成了。:lol

评分

参与人数 1威望 +40 飘云币 +40 收起 理由
千里之外 + 40 + 40 PYG有你更精彩!

查看全部评分

PYG19周年生日快乐!
  • TA的每日心情

    2022-12-7 18:41
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2008-3-13 16:39:18 | 显示全部楼层
    别偷懒啊
    把修复的也写出来啊
    那样就完美了
    我看的也好明白啊
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-13 21:23:35 | 显示全部楼层
    呵呵,楼主连带壳的记事本一块发上来吧。那就完美了。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-13 22:13:35 | 显示全部楼层
    谢谢LZ恚??耙宦
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-14 04:04:56 | 显示全部楼层
    很强悍,手脱哦,我学习了。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-17 07:40:09 | 显示全部楼层
    很好,学习了。谢谢楼主。
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2022-11-11 18:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2008-3-23 22:43:22 | 显示全部楼层
    弄个详细点的呀。。。。这个看得有点迷
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-27 22:12:50 | 显示全部楼层
    学习学习.希望下次能提供记事本.嘿嘿
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-28 17:43:32 | 显示全部楼层
    谢谢,学习了。/:good
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2024-4-20 20:20
  • 签到天数: 973 天

    [LV.10]以坛为家III

    发表于 2008-4-10 12:47:58 | 显示全部楼层
    /:011 /:011 谢谢楼主,希望能有试炼品~~
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表