首页
社区
课程
招聘
IAT加密中遇到的诡异问题
发表于: 2009-12-2 11:21 8319

IAT加密中遇到的诡异问题

2009-12-2 11:21
8319
尝试写壳,IAT加密今天测出一个诡异的错误:
举例,比如原IAT表地址:
0040A04C   存放 AD 2F 81 7C 这个系统API地址
那么我改为
0040A04C   存放 5C 00  00 3A这个我用Virtualalloc函数申请的内存空间的一个地址。在003A005C为该系统API写入 重指向代码为
003A005C     DB           81h,35h,7Bh,00h,3Ah,00h, 8Dh,F3h,D8h,17h,     ;xor  dword ptr [003A007B],17D8F38D   
                          90h,90h,90h,90h,                              ;nop
                         0FFh,35h,7BH,00h,3Ah,00h                       ;push dword ptr [003A007B]
                                           DB                 81h,35h,7Bh,00h,3Ah,00h, 8Dh,F3h,D8h,17h,     ;xor  dword ptr [003A007B],17D8F38D
                                                       0C3h,                                          ;retn
                          20h,0DCh,59h,6Bh                              ;here is the size of "dword ptr [003A007B]"; Size=17D8F38Dh xor 7C812FADh
所以IAT加密都按上叙途径简单加密,在最近测试的cpuBBz_152.2000在运行会有10%的概率正确,10%的概率主程序启动尚未出现时出现系统错误警告(非软件本身的警告,unknow、not"read"之类),有80%的概率直接出现系统错误警告。其他软件都正常。
采用另外一种简单方法3一直不会出错(只贴下原始数据,很容易明白):
Data_3_for_IAT      DB    68h,0B3h,60h,27h,10h,                        ;push  102760B3  ;( push word [xxxxxxxx],xxxxxxxx should not be 00h-7Fh)
                          81h,34h,24h,83h,03h,42h,00h,                 ;xor   dword ptr [esp],00420383  ;( xor dword ptr [esp],xxxxxxxx; xxxxxxxx should not be 0FFFFFF80h-0000007Fh)
                                                             0C3h,                                         ;retn
补充说明:
1.、xor dword ptr[003A007B],1234h与xor dword ptr[003A007B],12h前面的机器码不同类似问题我已考虑到,并做了处理。(后来发现其实没影响。确保12h等单字节情况不会出现,不需要)
2、Virtualalloc函数调用代码为:
    push        PAGE_READWRITE
    push        MEM_COMMIT
    push        eax  (值为17530h,足够大了)
    push        0
    call        dword ptr [ebp+(S_VirtualallocADDR-ShellStart)]           ;Virtualalloc for New IAT Table
3、我还有一种IAT简单加密方案,该软件也会出错,但是出错几率为40%左右,而且往往第一次会正确显示出程序界面,如果有人有兴趣我也可以贴出来---->见12楼。
4、如果我把17D8F38D改为00000000。这样的话异或等同与无操作。在003A007B处就存放系统API的真实地址7C812FAD。这种情况是不会出错的。这个应该是关键,忘了说。
求助
IAT简单加密方法1为什么会出错,为什么有正确的几率,大家猜测下,给个思路。
另,往往是有图形界面的程序加壳容易出错,有没有人能随意指点下原因吗。

问题描述不清,请见谅,有什么要补充的请随意提问。

请尽量下载3个附件

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (34)
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看不太明白...
比如:
81h,35h,5Ch,00h,3Ah,00h, 8Dh,F3h,D8h,17h, ;xor dword ptr [003A007B],17D8F38D

81h,35h,5Ch,00h,3Ah,00h, 8Dh,F3h,D8h,17h, 对应的汇编指令应该是 xor  dword ptr [003A005C],17D8F38D 才对,不知道你的003A007B是从哪里来的...可能是我out了
你的错误大概是由Virtualalloc函数引起的吧?你的dwSize参数最好按页的整数倍来申请,防止发生意料;另外,对于
往往第一次会正确显示出程序界面
这种情况大概是你用Virtualalloc申请的内存空间(地址003A005C)被改写 或者 被free掉了吧?
上面只是我随意猜测的,具体情况不知道...实在太深奥了!看不懂...
2009-12-2 13:11
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
回2楼,是我搞错了,我只拿一个IAT来举例,改的有点多,改错了个地方。
这个不复杂,IAT加密相当简单,会手动脱壳的都能看懂。。。。。

另,我本来也怀疑Virtualalloc函数有问题,但是我第三种IAT加密方法不会出错,Virtualalloc函数申请内存空间 在这两条路径前面就调用了。问题核心其实在于:
1、第三种方法为什么不出错,第一种方法为什么大多数错但又必定有正确的几率。第三种比第一种少了把 程序所申请内存地址 的值压入堆栈的操作。
2、“如果我把17D8F38D改为00000000。这样的话异或等同与无操作。在003A007B处就存放系统API的真实地址7C812FAD。这种情况是不会出错的。”的本质就是程序申请的内存空间本身如果有数据被修改,很可能出错;而其他程序没这样的问题。
2009-12-2 14:04
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

3、我还有一种IAT简单加密方案,该软件也会出错,但是出错几率为40%左右,而且往往第一次会正确显示出程序界面,如果有人有兴趣我也可以贴出来。

但是我第三种IAT加密方法不会出错

到底第三种方案会不会出错?
我平常主要工作是编程,没怎么玩过破解,所以脱壳这方面还不是很熟悉...
不过,我很有兴趣,楼主还是把第三种方案的代码贴出来吧
2009-12-2 14:18
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
等下我贴第二种,就是我弄的比较复杂了,一时不好说清楚,郁闷。先请教下如何引用回复里某一句话,半天没弄出来。汗

说明下:我的第一种加密方法正确率10%,第二种是40%-50%,第三种是100%。我贴的是第一种和第三种。
2009-12-2 14:29
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
把你要引用的话放在 (QUOTE) 与 (/QUOTE)  之间   注:小括号换成中括号
2009-12-2 14:33
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
【QUOTE】你的错误大概是由Virtualalloc函数引起的吧?你的dwSize参数最好按页的整数倍来申请,防止发生意料;【/QUOTE)】
按照你的办法,我发现正确率提高到15%-20%,出界面同时出错误警告的的情况也提高到15%-20%。真的有效果,我多次统计过。但是这个貌似不是主要原因。

这个还是没引用到啊
2009-12-2 14:37
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你那是全角的中括号,,,换成英文半角的
2009-12-2 14:47
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
中文半角【】中文全角【】
英文半角[] 英文全角[]
2009-12-2 14:49
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
,防止发生意料;【/QUOTE)】

QUOTE后面多了个 )
2009-12-2 14:51
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
把dwSize改成 10000h 试试?10000h正好是64KB
2009-12-2 14:54
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
IAT加密简单方法二(更正):
Data_2_for_IAT      DB    53h,                                         ;push ebx
                         0E8h,00h,00h,00h,00h,                         ;call $+4h
                          5Bh,                                         ;pop ebx
                                                              83h,0EBh,06h,                                ;sub ebx,6h
                                                              31h,5Bh,10h                                  ;xor dword ptr[ebx+10h],ebx
                    DB   0ebh,001h,0e8h,                               ;***花指令
                          84h,ADh,15h,81h,7Fh,                        ;(mov  eax,7C812FAD) 前4个字节经XOR加密后形成的乱码
                                                              31h,5Bh,10h                                  ;xor dword ptr[ebx+10h],ebx
                                                  DB          5Bh,                                         ;pop  ebx                     
                         0FFh,0E0h,                                    ;jmp  eax
                         0E8h                                          ;***花指令

假设Data_2_for_IAT在内存地址为003A005C
其中xor dword ptr[ebx+10h],ebx
    mov  eax,7CBB2FF1h
    xor dword ptr[ebx+10h],ebx
    jmp  eax
就是有用的代码,ebp寄存器只是用来存放本重指向代码内存首地址003A005C 。还原用(84h,ADh,15h,81h) XOR (5Ch,00h,3Ah,00h)加上后面的字节7Fh,形成指令mov  eax,7C812FAD,赋值給eax,然后重新加密成乱码,然后跳转到eax继续执行.
方法二与方法一的主要区别在于它虽然修改所申请内存空间的代码,但是它并不读取数据(就是没有mov eax,dword ptr[xxxxxxxx]这样的代码)。另外它其实修改了eax的值,关于修改eax值导致的一系列问题,我们暂时不关心,这个程序修改eax值是不会出错的。

PS:追风貌似很少查看别人再次编辑的内容,而我很喜欢重新编辑。。。悲剧,请看7楼。试过,有作用。
2009-12-2 14:55
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
把Virtualalloc函数的dwSize由17500h取整为20000h后。显示界面和显示错误警告同时出现的情况多了起来,出现了一次应该是错误报告的情况,如图:
上传的附件:
2009-12-2 15:25
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
14
[QUOTE=怀特迈恩;720719]xor dword ptr[ebx+10h],ebx[/QUOTE]

改成 +11h 试试
2009-12-2 15:45
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
晕,楼上... 我慢了一步



上图对应你的代码应该是:
003A005C      53            push    ebx
003A005D      E8 00000000   call    003A0062
003A0062      5B            pop     ebx
003A0063      83EB 06       sub     ebx, 6      ;此时ebx应该为003A005C
003A0066      315B 10       xor     dword ptr [ebx+10], ebx   ;ebx+10为003A006C
003A0069      EB            ;花指令
003A006A      01            ;花指令
003A006B      E8            ;花指令
003A006C      B8 F12FBB7C   mov     eax, 7CBB2FF1
003A0071      315B 10       xor     dword ptr [ebx+10], ebx 
                                    ;此处应该为[COLOR="Red"]xor dword ptr [ebx+11], ebx [/COLOR][ebx+10]取dword 为[COLOR="red"]B8 F1 2F BB[/COLOR]了
                                           
003A0074      5B            pop     ebx
003A0075      FFE0          jmp     eax


也不知道是否这个原因...
上传的附件:
2009-12-2 16:06
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
哦,14楼果然发现我说错了。这个代码写的比较早了,我刚又看了下处理代码。
我是用ebx与dword ptr[ebx+10h]异或的。而dword ptr[ebx+10h]是0B8h,F1h,2Fh,0BBh,加上后面一个字节7Ch形成一条汇编指令。 mov  eax,7CBB2FF1h 是5字节的指令,前4个字节被XOR加密了,我们还原出来指令,还原结果就是mov eax,7C812FADh.     有点乱,马上第二种方法的说明,抱歉,需要重起下机器,等下再贴。
简单说下,这里没有错的。如果需要,我可以给出加壳软件的源代码。以《加密与解密第三版》第16章的那个代码为蓝本,增加IAT加密功能。
2009-12-2 16:10
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17

不是这个原因...只能是VirtualAlloc了...
写入内存后,用VirtualProtect修改其属性为只读试试?
2009-12-2 16:21
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
写入内存后,用VirtualProtect修改其属性为只读试试?

这样肯定不行,因为我申请的内存空间里面有数据有代码还要修改自身(或读取自身),所以属性必须设置为可读可写可执行,就是READWRITE.
2009-12-2 16:29
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
  搞不懂了...
2009-12-2 16:31
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
20
我认为放出 已被加壳&会出错 的exe
帮助较大
2009-12-2 17:10
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
我在弄代码,马上放出壳源代码,加壳前的EXE文件。由于《解密与解密第三版》第16章的加壳源码有1个错误1个BUG,我已经把IAT加密代码添加完成,正在确认哪里出现问题,稍等。
2009-12-2 17:27
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
22
源代码应该没人会去看
加壳前'后(Error) 的东西好玩一点
2009-12-2 17:29
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
就一点点代码;源代码比较简单,跟OD里的汇编代码高度相似,因为主要就是写汇编代码。
我主要是怕我想当然了,写的代码跟我想的不一样。。。。。 改好了,见一楼。
2009-12-2 18:10
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
24
Path名称 及 Filename 皆全英文试试
(你之前的图显示你东西放在 日文路径 名下的CrackTest\)

cpuBBz_152.2000(加壳后).exe 我这里跑得好好的
2009-12-2 18:38
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
看看跟大哥的kx还差多少
2009-12-2 21:39
0
游客
登录 | 注册 方可回帖
返回
//