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

IAT加密中遇到的诡异问题

2009-12-2 11:21
8296
收藏
免费 0
支持
分享
最新回复 (34)
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
哎,第一次顶自己的贴,请加壳、脱壳高手看看。这种可能出错的情况一般是最简单最根本的错误。
不难,但是我想了几天都想不出来,应该是对操作系统执行程序的机制理解不全面。
2009-12-3 10:26
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
28
顶多 Thread 同步问题

xor [api],xxxxxxxx
nop
nop
nop
nop
push api
xor [api],xxxxxxxx
ret

中途被另一个 Thread 跑进来了

你先试着将 4 个 nop 拿掉, 成功率若升高很多, 就表示是同步问题.
2009-12-3 11:04
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
感谢S大,有Kx人啊!
Thread 同步问题,对这个我很是不懂(就在大学课本上了解点),我最开始写的时候,中间4个nop是没有的。执行时间相当短了。
如果是这个问题,那第三种方法为什么就不会
中途被另一个 Thread 跑进来了

再次感谢, “同步”确实比“Virtualalloc所申请内存出问题了”更有说服力。

PS:由于是新手,不追求加壳强度有多大,想先把所有出问题的地方弄明白,以后才不会更浪费时间来找这些BUG。
2009-12-3 11:15
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
30
第三种方法是什么?

这个?
;push  102760B3
;xor   dword ptr [esp],00420383
;retn

自己想想为什么吧
push to Stack
2009-12-3 11:38
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
万分感谢S大。明白了点,确实..........
怪不得多是图形界面的程序出现错误。
附带我程序中遇到的另一个问题也得到解答,S大果然强大。佩服!

附,我的解决思路----针对第一种方法:
原方案:
xor [api],xxxxxxxx
nop
nop
nop
nop
push api
xor [api],xxxxxxxx
ret
api <——存储地址

新的方案:
push ebx
xor  eax,eax
mov al,byte ptr [Nmuber]
inc byte ptr [Nmuber]
imul eax,4h
mov ebx,[api0]
mov [api0+eax],ebx
pop ebx
xor [api0+eax],xxxxxxxx
push [api0+eax]
xor [api0+eax],xxxxxxxx
cmp byte ptr[Number],8h
jnz   Over
mov byte ptr[Number],1h
Over:
ret
Number<----计数器,初值为 01
api0 <——存储地址api0 : yyyyyyyy
DB  20h   dup(?)   

这个方案有问题吗,请S大再次指教。
按照上面的,改写代码后,测试了下.上面的代码是可以解决关于CPUZ的IAT加密BUG的。

鞠躬,送分,结贴。
2009-12-3 12:39
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
32
以壳 Hook API 而言, 应该没人会这么执着于采用 [mem] 的方式
大家都用 Stack 的方式, 因为各Thread的Stack是独立的. 不会出错.
(亦即你讲的第3种方法)

你现在设 8 个糟, 你能保证够用吗? 很显然的这不是治本的方法.
再说...你有没有想过这二条指令也有可能刚好发生2个Thread用到同一糟

        mov al,byte ptr [Nmuber]
        inc byte ptr [Nmuber]

ThreadA: 执行完 mov al,byte ptr [Nmuber] 时
刚好切到 ThreadB 也执行(执行过去)这条 mov al,byte ptr [Nmuber]

虽然机率不高, 但是是可能的.

善用 Stack 吧, 能搞出很YD的 Code.
2009-12-3 18:14
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
晕  差距又拉大了
2009-12-3 18:30
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
34
养只小白鼠,跑轮子可装上马达变电力
接到一机械手臂, 适当的配置KeyBoard'Mouse即可成就
24小时自动刷屏机, 你每日都有 Kx 进帐
2009-12-3 18:40
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
发贴机容易  关键是发帖没kx啊
2009-12-3 18:44
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
回S大,写
     
mov al,byte ptr [Nmuber]
inc byte ptr [Nmuber]

的时候我已经考虑到你说的问题了,我最终版本的时候肯定是
只读取 内存数据 到寄存器或寄存器 操作,然后只对 寄存器和堆栈 操作而不再改变内存了。
我之所以在30楼没这样说,是不想改变我第一种方法的本意。呵呵,不过还是感谢提醒

补充:
ThreadA: 执行完 mov al,byte ptr [Nmuber] 时
刚好切到 ThreadB 也执行(执行过去)这条 mov al,byte ptr [Nmuber]
虽然机率不高, 但是是可能的.

仔细想下,如果这种几率发生了,那也不一定会出错;还要看那个[API]的内容是不是假值,万一再次撞上了,那就出错了。

另:我为什么不太想用堆栈方式也是因为我要弄个64位加壳软件版本,64位PE文件的运行过程中,改变堆栈 相对32位而言 是个相当容易出错的操作(特别是调用系统API的时候)---->64位程序调用系统API我还没有完全搞清楚,所以想详尽了解32位IAT加密的所有能引发BUG问题。
目前这些都是基本的IAT加密代码,更YD的方式我也会,可惜堆栈我要谨慎使用。真正有用的转换执行代码尽量用 寄存器赋值的方式搞。
2009-12-3 20:37
0
游客
登录 | 注册 方可回帖
返回
//