首页
社区
课程
招聘
看看这汇编,转到那我都不知道~~~
发表于: 2004-9-11 10:07 6577

看看这汇编,转到那我都不知道~~~

2004-9-11 10:07
6577
:004A18D4 A1B0A05000              mov eax, dword ptr [0050A0B0]
:004A18D9 8D8050070000            lea eax, dword ptr [eax+00000750]
:004A18DF FFE0                    jmp eax     这里是什么意思呀?转到那个地址呀??汗,怎么算出它转到那?我试着用址接转到那个地址,没用~~
:004A18E1 85C0                    test eax, eax
:004A18E3 750F                    jne 004A18F4

还有下面这更汗了:
:0050A74F A074057503              mov al, byte ptr [03750574]
:0050A754 DD05908B159C            fld qword ptr [9C158B90]
:0050A75A A7                      cmpsd
:0050A75B 4E                      dec esi
:0050A75C 0083FA00750B            add byte ptr [ebx+0B7500FA], al
:0050A762 7401                    je 0050A765  转到这个0050A765地址?
:0050A764 DA8BD589159C            fimul dword ptr [ebx+9C1589D5]
:0050A76A A7                      cmpsd
:0050A76B 4E                      dec esi
:0050A76C 000F                    add byte ptr [edi], cl
:0050A76E 858171F9FF0F            test dword ptr [ecx+0FFFF971], eax
:0050A774 847B71                  test byte ptr [ebx+71], bh
:0050A777 F9                      stc
:0050A778 FFEB                    jmp far ebx   这是什么意思啊?汗
:0050A77A 02EB                    add ch, bl
:0050A77C FC                      cld

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0050A77F(U)
|
:0050A77D EB00                    jmp 0050A77F  汗,怎么转来转去?这样不就是个死循环了吗?

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0050A77D(U)
|
:0050A77F EBFC                    jmp 0050A77D 汗,怎么转来转去?这样不就是个死循环了吗?
:0050A781 7503                    jne 0050A786
:0050A783 7401                    je 0050A786
:0050A785 DC8945D88B55            fmul qword ptr [ecx+558BD845]
:0050A78B AC                      lodsb
:0050A78C 8B4204                  mov eax, dword ptr [edx+04]
:0050A78F 50                      push eax

那位帮忙解释一下上面所有的汇编代码的意思呀,感谢呀~
还有电脑里启动好多的程序的时候,怎么才能用TRW2000动态查看我想查看的那个程序的动态代码呀?谢谢~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (18)
雪    币: 241
活跃值: (21)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
里面有花指令.
2004-9-11 11:47
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这算是成人级代码了。一般未成年不要看。
2004-9-11 11:50
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
4
建议温习一下指令,很简单的几个跳转,非线行运算指令!
2004-9-11 11:56
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 qiweixue 发布
建议温习一下指令,很简单的几个跳转,非线行运算指令!


你眼光独到,就看到几个跳转。
2004-9-11 12:02
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
呵呵~~有花指令,楼主的静态反汇编的结果已经不正确了。
2004-9-11 12:17
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最初由 小虾 发布
呵呵~~有花指令,楼主的静态反汇编的结果已经不正确了。


谢谢大虾们回答呀~~
有没有学习花指令的文章呀?静态反汇编的结果已经不正确了?那应该用什么软件来看它转到那里去?谢谢!!
2004-9-11 14:16
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
这篇文章对你或许有些帮助:
[转载]矛与盾的较量(1)――花指令

矛与盾的较量(1)――花指令
有矛就有盾。
所以我们要讨论加密技术。

我们知道,所有的编译型语言,例如VC、BCB、Delphi和Win32ASM……最终都会把源代码编译成机器能识别的0和1――因此也能够反过来把这些0和1反编译成汇编代码。反编译有什么用呢?试想想,你辛辛苦苦写了一个perfect的软件出来,正准备把它卖上100万份,忽然!在市面上出现了很多仿制你的东西……hoho,不知道你会怎么想呢?反正我是会欲哭无泪的。还有另外一种情况,你的软件是用注册码的形式来授权的,每份license要卖30个美刀。呵呵,正当你在考虑着一年后是去加利福尼亚还是夏威夷度假的时候,你的软件被Crack了――也就是说,你一分钱都不会得到……(啊!我想跳楼啦!!)

所以我们要讨论如何给自己的程序加密。这次就先说说最简单的花指令。

在解释这个“花指令”之前,不妨先做几个小小的实验。

我们先来写一个程序,命名为hua.asm,内容如下:
;***************************************************************
;花指令实验1
;作者:罗聪
;日期:2002-8-21
;***************************************************************
.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
szText        db    "嘿嘿,这是一个花指令程序……", 0
szCaption    db    "花指令演示 by LC 2002-8-21", 0

.code
main:
    jmp Do_It
Do_It:
    invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK
    invoke ExitProcess, 0
end main 


然后用W32Dasm v10来反编译它,得到的结果如下:(由于篇幅所限,这里只列出关键部分)

+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (hua.exe File Offset:00001600)



//******************** Program Entry Point ********
:00401000 EB00                    jmp 00401002

* Referenced by a (U)nconditional or ?onditional Jump at Address:
|:00401000(U)
|
:00401002 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"花指令演示 by LC 2002-8-21"
                                  |
:00401004 681F304000              push 0040301F

* Possible StringData Ref from Data Obj ->"嘿嘿,这是一个花指令程序……"
                                  |
:00401009 6800304000              push 00403000
:0040100E 6A00                    push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:00401010 E80D000000              Call 00401022
:00401015 6A00                    push 00000000

* Reference To: KERNEL32.ExitProcess, Ord:0075h
                                  |
:00401017 E800000000              Call 0040101C
 


哇,好夸张啊!你可能会说。反编译出来的代码几乎是跟源代码一一对应的,这样一来?我们的程序还有什么秘密可言呢?完全可以从反编译的结果中理解程序的功能。

而且我们还可以在W32Dasm的“String Data References”中得到:
"嘿嘿,这个是一个花指令程序……"
"花指令演示 by LC 2002-8-21"

把刚才的源程序稍做修改,来做第二个实验:

;***************************************************************
;花指令实验2
;作者:罗聪
;日期:2002-8-21
;***************************************************************
.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
szText        db    "嘿嘿,这是一个花指令程序……", 0
szCaption    db    "花指令演示 by LC 2002-8-21", 0

.code
main:
    jz Do_It    ;注意这里和第一个实验中的源程序的区别
    jnz Do_It    ;注意这里和第一个实验中的源程序的区别
Do_It:
    invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK
end main


用W32Dasm反编译一下:
+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (hua.exe File Offset:00001600)



//******************** Program Entry Point ********
:00401000 7402                    je 00401004
:00401002 7500                    jne 00401004

* Referenced by a (U)nconditional or ?onditional Jump at Addresses:
|:00401000?, :00401002?
|
:00401004 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"花指令演示 by LC 2002-8-21"
                                  |
:00401006 681F304000              push 0040301F

* Possible StringData Ref from Data Obj ->"嘿嘿,这是一个花指令程序……"
                                  |
:0040100B 6800304000              push 00403000
:00401010 6A00                    push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:00401012 E801000000              Call 00401018
 


可以看出,这时的W32Dasm反编译出来的汇编指令还是正确的。但是W32Dasm其实已经逐渐落入我们设下的“陷阱”了。

下面我们来做第三个实验,把源程序改成:
;***************************************************************
;花指令实验3
;作者:罗聪
;日期:2002-8-21
;***************************************************************
.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
szText        db    "嘿嘿,这是一个花指令程序……", 0
szCaption    db    "花指令演示 by LC 2002-8-21", 0

.code
main:
    jz Do_It    ;注意这里和第一个实验中的源程序的区别
    jnz Do_It    ;注意这里和第一个实验中的源程序的区别
    db 0E8h        ;注意这里和第二个实验中的源程序的区别
Do_It:
    invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK
    invoke ExitProcess, 0
end main


我们来看看W32Dasm中反编译出来的东西:
+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (hua.exe File Offset:00001600)



//******************** Program Entry Point ********
:00401000 7403                    je 00401005
:00401002 7501                    jne 00401005
:00401004 E86A00681D              call 1DA81073
:00401009 304000                  xor byte ptr [eax+00], al

* Possible StringData Ref from Data Obj ->"嘿嘿,这是一个花指令程序……"
                                  |
:0040100C 6800304000              push 00403000
:00401011 6A00                    push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:00401013 E80E000000              Call 00401026
:00401018 6A00                    push 00000000

* Reference To: KERNEL32.ExitProcess, Ord:0075h
                                  |
:0040101A E801000000              Call 00401020


呵呵,很明显了,这时的 00401004 到 00401009 行出错了,而且这时查看“String Data References”,也只剩下了:
"嘿嘿,这是一个花指令程序……"

让我们进一步隐藏信息,做第四个实验:
;***************************************************************
;花指令实验4
;作者:罗聪
;日期:2002-8-21
;***************************************************************
.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
szText        db    "嘿嘿,这是一个花指令程序……", 0
szCaption    db    "花指令演示 by LC 2002-8-21", 0

.code
main:
    jz Do_It    ;注意这里和第一个实验中的源程序的区别
    jnz Do_It    ;注意这里和第一个实验中的源程序的区别
    db 0E8h        ;注意这里和第二个实验中的源程序的区别
Do_It:
    lea eax, szText        ;注意这里和第三个实验中的源程序的区别
    lea ebx, szCaption    ;注意这里和第三个实验中的源程序的区别
    invoke MessageBox, NULL, eax, ebx, MB_OK    ;注意这里和第三个实验中的源程序的区别
    invoke ExitProcess, 0
end main


编译,再用W32Dasm反编译,得到的是:
+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (hua.exe File Offset:00001600)



//******************** Program Entry Point ********
:00401000 7403                    je 00401005
:00401002 7501                    jne 00401005
:00401004 E88D050030              call 30401596
:00401009 40                      inc eax
:0040100A 008D1D1D3040            add byte ptr [ebp+40301D1D], cl
:00401010 006A00                  add byte ptr [edx+00], ch
:00401013 53                      push ebx
:00401014 50                      push eax
:00401015 6A00                    push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:00401017 E80E000000              Call 0040102A
:0040101C 6A00                    push 00000000

* Reference To: KERNEL32.ExitProcess, Ord:0075h
                                  |
:0040101E E801000000              Call 00401024


呵呵,这次不但面目全非了,而且“String Data References”按钮已经变成了灰色。什么蛛丝马迹都没有了。

各位看官看到这里明白了吗?其实花指令就是人为地构造一些“陷阱”和一些无用的字节。例如第二个实验中的:
jz Do_It
jnz Do_It

其实这个跟 jmp Do_It 还不是一样吗?(呵呵,如果在大学的期末考试里这样写,一定会被判不及格……)

是的,其实程序原有的功能和逻辑还是一样的,我们只不过是换了一种表现形式而已。然而,反编译工具是没有人脑那么智能的,它们往往就会把这些指令理解错,从而错误地确定了指令的起始位置。

要实现这种绝对跳转的功能,还可以用很多的方法,例如:
Push Do_It
ret


花指令是很容易理解的,不过大家要注意适时而用,不要滥用啊,能起到迷惑破解者和隐藏信息的作用就行了,不然将来要维护代码时,我怕被迷惑的反而是你自己哦,呵呵……

老罗
2002-8-21

--------------------------------------------------------------------------------
版权所有 转载请注明出处  Home / Index  罗聪
2004-9-11 14:54
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢!
我用花指令清除器1。2清除了上面的花指令,花指令清除器说共找到上面的二个花指令,已清除,清除后的代码如下:
:004A18D4 A1B0A05000              mov eax, dword ptr [0050A0B0]
:004A18D9 8D8050070000            lea eax, dword ptr [eax+00000750]
:004A18DF FFE0                    jmp eax   这里是怎么搞的?我现在就是想知道它转到那里去?
:004A18E1 85C0                    test eax, eax
:004A18E3 750F                    jne 004A18F4

:0050A74F A090909090              mov al, byte ptr [90909090]
:0050A754 90                      nop
:0050A755 05908B159C              add eax, 9C158B90
:0050A75A A7                      cmpsd
:0050A75B 4E                      dec esi
:0050A75C 0083FA00750B            add byte ptr [ebx+0B7500FA], al
:0050A762 7401                    je 0050A765
:0050A764 DA8BD589159C            fimul dword ptr [ebx+9C1589D5]
:0050A76A A7                      cmpsd
:0050A76B 4E                      dec esi
:0050A76C 000F                    add byte ptr [edi], cl
:0050A76E 858171F9FF0F            test dword ptr [ecx+0FFFF971], eax
:0050A774 847B71                  test byte ptr [ebx+71], bh
:0050A777 F9                      stc
:0050A778 FFEB                    jmp far ebx  还有,大家看这里,我就是不明白这里是怎么回事?它转到那里去了呀?汗~
:0050A77A 02EB                    add ch, bl
:0050A77C FC                      cld

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0050A77F(U)
|
:0050A77D EB00                    jmp 0050A77F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0050A77D(U)
|
:0050A77F EBFC                    jmp 0050A77D
:0050A781 90                      nop    这里原来是花指令吧?
:0050A782 90                      nop
:0050A783 90                      nop
:0050A784 90                      nop
:0050A785 90                      nop
:0050A786 8945D8                  mov dword ptr [ebp-28], eax
:0050A789 8B55AC                  mov edx, dword ptr [ebp-54]
:0050A78C 8B4204                  mov eax, dword ptr [edx+04]
:0050A78F 50                      push eax
2004-9-11 15:04
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
还有花指令,没清除干净,花指令清除器对一般的花指可能可以清除,但对比较隐秘的花指令就无能为力了,而且效果也不佳。花指令主要是对付静态反汇编的,对付花指令最好的办法就是动态跟踪。
2004-9-11 15:14
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
小虾真是雷锋呀,谢谢你教我,下面这个是花指令吗?
:004A18D4 A1B0A05000              mov eax, dword ptr [0050A0B0]
:004A18D9 8D8050070000            lea eax, dword ptr [eax+00000750]
:004A18DF FFE0                    jmp eax   这里是怎么搞的?我现在就是想知道它转到那里去?
:004A18E1 85C0                    test eax, eax
:004A18E3 750F                    jne 004A18F4

我的系统是WIN2000的,使用的是TRW2000,想用动态分析这个程序,不知道怎么下命令,因为有好多程序一起启动了~
2004-9-11 15:42
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
12
不知道,若那句不是被花指令干扰的指令的话。因为那个跳转是以EAX为指针,要想知道他跳到哪里去,必须先知道EAX的值多少。
2004-9-11 15:49
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
是呀,我现在就是想知道EAX的值是多少呀,可就是不知道怎么用TRW2000查看EAX的值,用PW32Dasm9b的那个功能也不行呀~看来搞这个程序的人有一定的汇编基础~~汗,小虾 ,真的谢谢你~不知道我要怎么找EAX的值了~0050A0B0+00000750=50A800这个地址不对吧?
2004-9-11 15:54
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
14
不对,mov eax,[0050A0B0] <=取得是0050A0B0的内存中的值,不是0050A0B0。然后再将这个值加上00000750的值送给EAX。要想知道EAX的值必须知道0050A0B0内存中保存的值是多少。
2004-9-11 17:00
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
:004A18D4 A1B0A05000              mov eax, dword ptr [0050A0B0]
:004A18D9 8D8050070000            lea eax, dword ptr [eax+00000750]
:004A18DF FFE0                    jmp eax   
:004A18E1 85C0                    test eax, eax
:004A18E3 750F                    jne 004A18F4

:0050A0B0 00                      BYTE 0

:0050A0B1 A050009058              mov al, byte ptr [58900050]
:0050A0B6 90                      nop
:0050A0B7 2B820C060000            sub eax, dword ptr [edx+0000060C]
:0050A0BD 3D30010000              cmp eax, 00000130
:0050A0C2 725A                    jb 0050A11E
:0050A0C4 3D9E020000              cmp eax, 0000029E
:0050A0C9 7328                    jnb 0050A0F3
:0050A0CB 8B45FC                  mov eax, dword ptr [ebp-04]
:0050A0CE 80B82006000000          cmp byte ptr [eax+00000620], 00
:0050A0D5 7E0B                    jle 0050A0E2
:0050A0D7 FE8820060000            dec byte ptr [eax+00000620]
:0050A0DD E94F12FCFF              jmp 004CB331

完整的,知道jmp eax转到那里去吗?谢谢~
2004-9-11 17:54
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
?
2004-9-12 17:34
0
雪    币: 212
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
TRW下 用 D eax就可以看到了!
2004-9-12 17:44
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
18
最初由 全华 发布
:004A18D4 A1B0A05000 mov eax, dword ptr [0050A0B0]
:004A18D9 8D8050070000 lea eax, dword ptr [eax+00000750]
:004A18DF FFE0 jmp eax
:004A18E1 85C0 test eax, eax
:004A18E3 750F jne 004A18F4
........

没用的,无法知道0050A0B0内存保存的值是多少是没办法计算出EAX的值的,也就无法知道jmp要跳到哪里去。
而这个值只有用动态跟踪才能得知,其实简单,只要用OllyDBG动态跟踪到那个地址就明白了。
2004-9-12 19:38
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
19
不好意思哈・上一回偶没有认真分析:

最初由 小虾 发布

没用的,无法知道0050A0B0内存保存的值是多少是没办法计算出EAX的值的,也就无法知道jmp要跳到哪里去。
而这个值只有用动态跟踪才能得知,其实简单,只要用OllyDBG动态跟踪到那个地址就明白了。
2004-9-13 12:39
0
游客
登录 | 注册 方可回帖
返回
//