首页
社区
课程
招聘
对[FCG]KeyGen2.0按钮特效的分析[1].txt
发表于: 2006-10-25 15:23 7015

对[FCG]KeyGen2.0按钮特效的分析[1].txt

2006-10-25 15:23
7015

  首先,注意一个比较特别的现象。原始版本在某些Windows上会崩溃,而崩溃后的Runtime Error对话框的OK按钮居然也是特效。说明什么?一定是钩子。
  用IDA反汇编正常的KG2,注意到和KG1的不同点,可以发现多了一个WM_SHOWWINDOW。其处理程序如下:

CODE:00408482 loc_408482:
CODE:00408482                 push    0
CODE:00408484                 call    sub_406984
CODE:00408489                 jmp     loc_4088E0

  可以看到,这是个stdcall/pascal类型的过程。至于到底是哪种,无关紧要。这里的参数只有一个,所以不必担心顺序。

CODE:00406984 sub_406984      proc near
CODE:00406984
CODE:00406984 arg_0           = dword ptr  8
CODE:00406984
CODE:00406984                 push    ebp
CODE:00406985                 mov     ebp, esp
//这里是典型的pascal/stdcall调用的开头。但是因为只有1个参数,无法肯定是哪个类型。
//值得注意的是,这是个VC的obj。所以不能因为是VC编译的obj就一概使用cdecl。
CODE:00406987                 push    ebx
CODE:00406988                 mov     ebx, [ebp+arg_0]
CODE:0040698B                 xor     eax, eax
CODE:0040698D                 test    ebx, ebx
CODE:0040698F                 jnz     short loc_4069CC
CODE:00406991                 cmp     ds:hhk, 0
CODE:00406998                 jnz     short loc_4069D2
CODE:0040699A                 push    1               ; lParam
CODE:0040699C                 push    offset fn       ; lpfn
CODE:004069A1                 call    GetCurrentThreadId_0
CODE:004069A6                 push    eax             ; dwThreadId
CODE:004069A7                 call    EnumThreadWindows
CODE:004069AC                 call    GetCurrentThreadId_0
CODE:004069B1                 push    eax             ; dwThreadId
CODE:004069B2                 push    0               ; hmod
CODE:004069B4                 push    offset sub_406D4A ; lpfn
CODE:004069B9                 push    4               ; idHook
CODE:004069BB                 call    SetWindowsHookExA
CODE:004069C0                 mov     ds:hhk, eax
CODE:004069C5                 mov     eax, ds:hhk
CODE:004069CA                 jmp     short loc_4069D2
CODE:004069CC
CODE:004069CC loc_4069CC:
CODE:004069CC                 push    ebx
CODE:004069CD                 call    sub_406A1F
CODE:004069D2
CODE:004069D2 loc_4069D2:
CODE:004069D2                 pop     ebx
CODE:004069D3                 pop     ebp
CODE:004069D4                 retn    4
CODE:004069D4 sub_406984      endp

  这个初始化过程(实际是个函数)的流程还是非常清楚的。但是这个参数到底是什么?从上面来看,如果参数为0,那么就枚举当前线程的窗口。看来应该是某窗口的句柄。通过查看sub_406A1F,发现00406A53处有对GetWindowLong的调用,而且传过去的ebx作为首个参数。这样,可以判断它是个窗口句柄。这里给出该过程的Pascal形式

Var
  CurrentHook:HHOOK;

Function Init(Window:HWND):HHOOK;
Begin
  Result:=0;
  If Window=0 Then
    Begin
      If CurrentHook=0 Then
        Begin
          EnumThreadWindows(GetCurrentThreadId,,1);
          CurrentHook:=SetWindowsHookEx(WH_CALLWNDPROC,sub_406D4A,0,GetCurrentThreadId);
          Result:=CurrentHook;
        End;
    End
  Else
    Begin
      sub_406A1F(Window);
    End;
End;
Const
  CurrentHook:HHOOK=0;

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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
文章不错。
不知firstrose周末到苏州的旅游路线定好了没有。;)
2006-10-25 16:12
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
3
学习下 HOOK.txt

旅游线路 苏州-杭州-上海-马来西亚-泰国-新加坡-柏林-温哥华-巴西 一日游
2006-10-25 18:56
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
4
第1篇是去年2月份写的。第2篇开始写的时间是今年3月,今天刚刚写完,打算明天写完第3篇。
跟索耶学学,写完3再发2,手里总归要握一篇。
顺便打个广告,第2篇比第一篇好不少。

最初由 kanxue 发布
不知firstrose周末到苏州的旅游路线定好了没有。;)


路线已经定了,上午拙政园,中午观前街,下午虎丘。时间充裕的话再去寒山寺。
2006-10-25 20:18
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
5
旅游路线不错啊,哈哈
2006-10-28 11:39
0
游客
登录 | 注册 方可回帖
返回
//