注册 登录
编程论坛 汇编论坛

汇编代码转换为高级语言伪代码,请前辈们看看有错不

ioriliao 发布于 2010-09-18 11:43, 2712 次点击
程序代码:
00432491  |> /FF37          /push    dword ptr [edi]                 ; /MutexName
00432493  |. |6A 00         |push    0                               ; |InitialOwner = FALSE
00432495  |. |6A 00         |push    0                               ; |pSecurity = NULL
00432497  |. |FF15 4C514D00 |call    dword ptr [<&KERNEL32.CreateMut>; \CreateMutexW
0043249D  |. |85C0          |test    eax, eax
0043249F  |. |8906          |mov     dword ptr [esi], eax
004324A1  |. |74 14         |je      short 004324B7
004324A3  |. |FF15 48514D00 |call    dword ptr [<&KERNEL32.GetLastEr>; [GetLastError
004324A9  |. |3D B7000000   |cmp     eax, 0B7
004324AE  |. |75 20         |jnz     short 004324D0
004324B0  |. |8BCE          |mov     ecx, esi
004324B2  |. |E8 A4010500   |call    0048265B
004324B7  |> |83C7 04       |add     edi, 4
004324BA  |. |3BFB          |cmp     edi, ebx
004324BC    ^\7C D3         jl      short 00432491                   ;  if edi<ebx then goto 432491


下面是高级语言伪代码。请前辈们看看小生转换得有错不?谢谢!
程序代码:
Label00432491:
eax=CreateMutexW(0,0,dword ptr[edi])
dword ptr[esi]=eax
if(eax and eax) then
    edi=edi+4
    if edi<ebx then goto Label00432491
else
    eax=GetLastError
    if eax<>0 then
       goto other
    else
       exc=esi
       call 0048265b
       edi=edi+4
       if edi<ebx then goto Label00432491
    end   
end



[ 本帖最后由 ioriliao 于 2010-9-18 11:45 编辑 ]
32 回复
#2
东海一鱼2010-09-18 13:12
程序代码:
eax=GetLastError
    if eax<>0 then  XXXX         if eax == 0xb7  (0xb7 ==ERROR_ALREADY_EXISTS)  就是判断互斥对象是否已存在

exc=esi
       call 0048265b            //这个跟进去看看就是CloseHandle,  如果已存在则关闭。

83C7 04       |add     edi, 4
004324BA  |. |3BFB          |cmp     edi, ebx                   //ebx,字符串数组尾部指针. edi == ebx 就表示处理完了
004324BC    ^\7C D3         jl      short 00432491


所以用pascl语言表示就是:
程序代码:
function CreateMutexObjAndCheck:HANDLE;stdcall
var
  strMutexArry: arry[0..2] of WString;
  hMutex: HANDLE;
  i: integer;
begin
   for i = 0 to 2 go
   begin
     hMutex:= CreateMutex(0,false,strMutexArry[i]);
     if hMutex = 0 then
       continue;                             //如果创建失败,直接跳转创建下一个              

     if hMutex = ERROR_ALREADY_EXISTS then
     begin
        CloseHandle(hMutex);                    //如果已存在?关闭
        hMutex:= 0;                           
     end
     else
       break;                                  //不存在,,成功,退出
   end

Restule:= hMutex;
end;


BTW:
以后别在C上喊我了,被学弟们看到都传成笑话了。我以后也不再上C了。



[ 本帖最后由 东海一鱼 于 2010-9-20 11:04 编辑 ]
#3
ioriliao2010-09-18 15:56
回复 2楼 东海一鱼
现在多开是没问题了,却仍然是会掉线,还不知道乍搞啊,头都快晕了
东海兄救救我也。。。
#4
ioriliao2010-09-18 19:30
求求东海大仙超渡下本妖吧。。。实在无法了。。。
#5
ioriliao2010-09-19 16:22
东海仙人快快出现吧。。。
#6
sll08072010-09-19 19:38
00432491  |> /FF37          /push    dword ptr [edi]                 ; /MutexName                    ; EDI为名称指针
00432493  |. |6A 00         |push    0                               ; |InitialOwner = FALSE         ; InitialOwner = FALSE
00432495  |. |6A 00         |push    0                               ; |pSecurity = NULL             ; MutexAttributes = null  参数进栈
00432497  |. |FF15 4C514D00 |call    dword ptr [<&KERNEL32.CreateMut>; \CreateMutexW                 ; 调用 CreateMutexW       调用API
---------------------------------------------------------------------------------------------------
0043249D  |. |85C0          |test    eax, eax                        ; 测试CreateMutex返回值,如果执行成功返回句柄,失败返回0
0043249F  |. |8906          |mov     dword ptr [esi], eax            ; 保存返回结果到ESI寄存器
004324A1  |. |74 14         |je      short 004324B7                  ; 如果CreateMutex返回值不等于0 则跳转 到 004324B7
---------------------------------------------------------------------------------------------------
004324A3  |. |FF15 48514D00 |call    dword ptr [<&KERNEL32.GetLastEr>; [GetLastError
                                                                     ; 调用 GetLastError
004324A9  |. |3D B7000000   |cmp     eax, 0B7                        ; 比较 GetLastError 返回值是否等于  ERROR_ALREADY_EXISTS
                                                                     ; 就是判断互斥体对象的名字是否作为唯一实例运行
004324AE  |. |75 20         |jnz     short 004324D0                  ; 当 GetLastError 的返回结果不等于  ERROR_ALREADY_EXISTS  的时候跳转到 004324D0
                                                                     ; 上面三句就是检测 互斥体对象是否是唯一的
----------------------------------------------------------------------------------------------------
                                                                     ; 从上面程序来看 在互斥体对象创建不成功的情况下会运行到这里
004324B0  |. |8BCE          |mov     ecx, esi                        ; 如果运行到这里 mov ecx,esi 以后 ecx的值应该 = 0
004324B2  |. |E8 A4010500   |call    0048265B                        ; 调用 子程序 ;子程序里执行什么不明确  ????
004324B7  |> |83C7 04       |add     edi, 4                          ; 给edi + 4
004324BA  |. |3BFB          |cmp     edi, ebx                        ; 将edi 和 ebx 做减法测试
004324BC    ^\7C D3         jl      short 00432491                   ; 当ebx > 4的时候跳转



反汇编以后的指令根本就没发全 根本不明确做什么

以上代码 大概描述情景就是 CreateMutex 不成功 后怎么处理



[ 本帖最后由 sll0807 于 2010-9-19 19:42 编辑 ]
#7
ioriliao2010-09-19 22:48
谢谢sll0807兄的热情帮助。
我的这个问题起源于下面的描述:
软件名称:yy语音聊天工具
官页:http://yy.
限制性:这个软件在一台电脑上只能开三个实例
       实验及分析:
                 实验工具:沙盘、Oracle VM VirtualBox虚拟机(2003系统)
                 实验过程1:
                         1.在真实的操作系统开启三个号
                         2.使用沙盘开启三个号
                         3.在虚拟机上开启三个号
                 结果:都没有掉线
                 实验过程2:
                         1.在真实的操作系统开启四个以上的号
                         2.使用沙盘开启四个以上的个号
                         3.在虚拟机上开启四个以上的个号
                 结果:1.在真实的操作系统多开的号会掉线
                      2.沙盘多开的号会掉线
                      3.在虚拟机多开的号会掉线

#8
东海一鱼2010-09-20 00:26
以下是引用ioriliao在2010-9-19 16:22:54的发言:

东海仙人快快出现吧。。。
   东海大仙腐败去了,刚回来得说。哈哈
#9
东海一鱼2010-09-20 00:30
还没搞定啊?挡在哪了?
#10
ioriliao2010-09-20 07:59
回复 8楼 东海一鱼
仙人终于回来了啊,现在是可以多开了,但会掉线,不知道问题在哪。
我就是把这句给改了
0043246A  |.  BB 94835100   mov     ebx, 00518394;这里的数字改大很多。
#11
东海一鱼2010-09-20 09:21
我晕,你就这点成果??
#12
ioriliao2010-09-20 09:43
回复 11楼 东海一鱼
...还改了很多乱七八的地方。。。我都快晕了。。。
#13
ioriliao2010-09-20 09:44
东海兄就指条明跳给偶走走吧。。。郁闷啊。。。想去跳楼了。。。。狂抓。。。
#14
东海一鱼2010-09-20 09:51
哈,
这两天除了没调通,还有什莫进步?我不想直接给你代码。只能给你思路。


[ 本帖最后由 东海一鱼 于 2010-9-20 09:53 编辑 ]
#15
东海一鱼2010-09-20 09:57
他除了在本机创建互斥对象以外,还偷偷给服务器发送你的硬件合成ID。这样服务器可以直接踢你下线。所以那天你跳过CloseSocket也没用。是服务器踢你的。
只有本站会员才能查看附件,请 登录



[ 本帖最后由 东海一鱼 于 2010-9-20 10:09 编辑 ]
#16
东海一鱼2010-09-20 11:02
嗯,我这里4开。已经2小时40分了。OK。
#17
ioriliao2010-09-20 11:40

我还在看东海兄给我指的路呢。。。汇编差着实麻烦。。。
#18
东海一鱼2010-09-20 11:54
程序代码:
#ifdef __cplusplus
extern "C"
{
#endif

#define CC_JMP  __declspec(naked)                     //裸跳声明,必需的

ENTRYYY_API HANDLE WINAPI MyCreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes,
                               BOOL bInitialOwner,
                               LPCTSTR lpName );      //HOOK CreateMutexW API

ENTRYYY_API HANDLE WINAPI MyOpenMutexW(  DWORD dwDesiredAccess,  // access
                                       BOOL bInheritHandle,    // inheritance option
                                       LPCTSTR lpName);   //HOOK OpenMutexW API

ENTRYYY_API VOID WINAPI MyGetGlobalMid();       //拦截全局标识生成

ENTRYYY_API VOID WINAPI MyGetMacInfo();         //拦截抽样MAC

ENTRYYY_API VOID WINAPI MyGetHDInfo();          //拦截抽样硬盘

ENTRYYY_API VOID WINAPI MyGetBiosInfo();        //拦截抽样BIOS

ENTRYYY_API VOID WINAPI MyGetCpuInfo();         //拦截获得CPU标识

ENTRYYY_API VOID WINAPI MyGetMid();             //拦截根据WMI生成的标识

#ifdef __cplusplus
}
#endif
呵呵。
#19
sll08072010-09-20 13:05

HOOKAPI 、、、、、太奢侈了

[ 本帖最后由 sll0807 于 2010-9-20 13:16 编辑 ]
#20
东海一鱼2010-09-20 14:53
以下是引用sll0807在2010-9-20 13:05:06的发言:


HOOKAPI 、、、、、太奢侈了
   哦?0807兄有何高见?

#21
ioriliao2010-09-20 14:58
看得快晕了,都不知道那些获取硬件信息的函数与主程序的关联怎么样的,那些信息返回到哪了....唉。。。
#22
东海一鱼2010-09-20 15:05
只有本站会员才能查看附件,请 登录

看看信息


[ 本帖最后由 东海一鱼 于 2010-9-20 15:13 编辑 ]
#23
东海一鱼2010-09-20 15:18
以下是引用ioriliao在2010-9-20 14:58:25的发言:

看得快晕了,都不知道那些获取硬件信息的函数与主程序的关联怎么样的,那些信息返回到哪了....唉。。。
   不知道也行。一句话,你只要知道修改(欺骗)它的返回信息就行了。
#24
ioriliao2010-09-20 15:36
回复 23楼 东海一鱼
返回信息是不是返回到eax的?
还是ecx?
就下面段而言
程序代码:
1000D4F0 >/$  B8 36D90110   mov     eax, 1001D936
1000D4F5  |.  E8 D6D50000   call    1001AAD0
1000D4FA  |.  83EC 30       sub     esp, 30
1000D4FD  |.  A1 48E50210   mov     eax, dword ptr [1002E548]
1000D502  |.  53            push    ebx
1000D503  |.  8945 EC       mov     dword ptr [ebp-14], eax
1000D506  |.  33C0          xor     eax, eax
1000D508  |.  56            push    esi
1000D509  |.  57            push    edi
1000D50A  |.  8945 C8       mov     dword ptr [ebp-38], eax
1000D50D  |.  8965 F0       mov     dword ptr [ebp-10], esp
1000D510  |.  8945 C8       mov     dword ptr [ebp-38], eax
1000D513  |.  8945 C4       mov     dword ptr [ebp-3C], eax
1000D516  |.  8945 FC       mov     dword ptr [ebp-4], eax
1000D519  |.  E8 54F0FFFF   call    1000C572
1000D51E  |.  8945 C8       mov     dword ptr [ebp-38], eax
1000D521  |.  C745 FC 02000>mov     dword ptr [ebp-4], 2
1000D528  |.  E8 F0EDFFFF   call    1000C31D
1000D52D  |.  8945 C4       mov     dword ptr [ebp-3C], eax
1000D530  |.  FF75 C4       push    dword ptr [ebp-3C]               ; /<%.8x>
1000D533  |.  0FB745 C8     movzx   eax, word ptr [ebp-38]           ; |
1000D537  |.  834D FC FF    or      dword ptr [ebp-4], FFFFFFFF      ; |
1000D53B  |.  50            push    eax                              ; |<%.4x>
1000D53C  |.  8D45 CC       lea     eax, dword ptr [ebp-34]          ; |
1000D53F  |.  68 BC100210   push    100210BC                         ; |format = "%.4x%.8x"
1000D544  |.  50            push    eax                              ; |s
1000D545  |.  FF15 44F30110 call    dword ptr [<&MSVCR71.sprintf>]   ; \sprintf
1000D54B  |.  8B4D 08       mov     ecx, dword ptr [ebp+8]
1000D54E  |.  83C4 10       add     esp, 10
1000D551  |.  8D45 CC       lea     eax, dword ptr [ebp-34]
1000D554  |.  50            push    eax
1000D555  |.  FF15 E0F20110 call    dword ptr [<&MSVCP71.std::basic_>;  MSVCP71.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >
1000D55B      8B4D FB       mov     ecx, dword ptr [ebp-5]
1000D55E  |.  8B45 08       mov     eax, dword ptr [ebp+8]
1000D561  |.  64:890D 00000>mov     dword ptr fs:[0], ecx
1000D568      8B4D EC       mov     ecx, dword ptr [ebp-14]
1000D56B  |.  E8 0FD60000   call    1001AB7F
1000D570  |.  5F            pop     edi
1000D571  |.  5E            pop     esi
1000D572  |.  5B            pop     ebx
1000D573  |.  C9            leave
1000D574  \.  C3            retn




#25
东海一鱼2010-09-20 16:03
即不在eax,也不在ecx中。
在[ebp+8]这个参数中。实际上这些函数都只有这一个参数。是一个结构指针。或者说是一个类的对象指针。

程序代码:
1000D54B  |.  8B4D 08       mov     ecx, dword ptr [ebp+8]
1000D54E  |.  83C4 10       add     esp, 10
1000D551  |.  8D45 CC       lea     eax, dword ptr [ebp-34]
1000D554  |.  50            push    eax
1000D555  |.  FF15 E0F20110 call    dword ptr [<&MSVCP71.std::basic_>;  MSVCP71.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >
1000D55B      8B4D FB       mov     ecx, dword ptr [ebp-5]
1000D55E  |.  8B45 08       mov     eax, dword ptr [ebp+8]            //这里就看到了。
1000D561  |.  64:890D 00000>mov     dword ptr fs:[0], ecx
1000D568      8B4D EC       mov     ecx, dword ptr [ebp-14]
1000D56B  |.  E8 0FD60000   call    1001AB7F                         //但eax的值在这个函数返回后被破坏。
1000D570  |.  5F            pop     edi
1000D571  |.  5E            pop     esi
1000D572  |.  5B            pop     ebx
1000D573  |.  C9            leave

#26
sll08072010-09-20 16:08
YY挺变态 。。。挺变态 。。。
#27
sll08072010-09-20 16:21
直接PATCH不行吗
#28
ioriliao2010-09-20 16:36
回复 25楼 东海一鱼
如何修改才好呢?我修改了几次,程序运行时都崩溃了。。。郁闷啊。。。
#29
ioriliao2010-09-20 16:36
回复 27楼 sll0807
什么是patch呢?
#30
东海一鱼2010-09-20 21:10
以下是引用ioriliao在2010-9-20 16:36:22的发言:

如何修改才好呢?我修改了几次,程序运行时都崩溃了。。。郁闷啊。。。
   那是你功力太差了。

   BTW:
   PATCH就是对源文件打补丁。又分两种:文件补丁,和内存补丁(SMC)。其实从某种意义上说API HOOK就是内存补丁的一种特殊形式。
#31
ioriliao2010-09-20 21:26
回复 30楼 东海一鱼
我的功力是太差劲,东海兄啊给偶弄个文件补丁看看吧,好让偶过个快乐的中秋。。。
祝东海兄中秋节快乐!!!
#32
东海一鱼2010-09-20 21:49
注入你总会吧。我把注入DLL文件给你。你加载YY时注入进去就OK了。上YY,我的Y号: ytxz001. # 119651486


[ 本帖最后由 东海一鱼 于 2010-9-20 22:31 编辑 ]
#33
ioriliao2010-09-21 07:28
谢谢东海大仙的顶力帮助!
1