首页
社区
课程
招聘
[旧帖] [原创]stcmp 和strcat的逆向 0.00雪花
发表于: 2012-8-16 08:49 3858

[旧帖] [原创]stcmp 和strcat的逆向 0.00雪花

2012-8-16 08:49
3858

最近在学习钱老师的<<c++反汇编与逆向分析技术揭秘>>,于是就想着逆向一下strcmp和strcat来试一试,由于水平很菜,希望得到大家的帮助.
首先,本人绝对菜鸟, 这是第一次发帖,发帖的主要目的只有一个:一直都是一个人在学习这些,每次想找人讨论都没有人,希望通过发此贴能够得到大侠的指导,或者和我有共同问题而没有人讨论的菜鸟一起学习,共同进步,非常期待认识你.(我的邮箱是用户名@163.com)

源代码:
#include<stdio.h>
#include <string.h>
void main()
{
  char str1[30]="People's Republic of ";
  char str2[]="China";
  if(strcmp(str1,str2))
    printf("yes\n");
  printf(strcat(str1,str2));
}

.text:00401000 ; int __cdecl main(int argc, const char **argv, const char *envp)
.text:00401000 _main           proc near               ; CODE XREF: start+AF p
.text:00401000
.text:00401000 var_28          = dword ptr -28h
.text:00401000 var_24          = word ptr -24h
.text:00401000 var_20          = byte ptr -20h
.text:00401000 var_A           = dword ptr -0Ah
.text:00401000 var_6           = dword ptr -6
.text:00401000 argc            = dword ptr  4
.text:00401000 argv            = dword ptr  8
.text:00401000 envp            = dword ptr  0Ch
.text:00401000
.text:00401000                 sub     esp, 28h
.text:00401003                 push    ebx
.text:00401004                 push    esi
.text:00401005                 push    edi
.text:00401006                 mov     ecx, 5
.text:0040100B                 mov     esi, offset aPeopleSRepubli ; "People's Republic of "
.text:00401010                 lea     edi, [esp+34h+var_20]
.text:00401014                 rep movsd               ; 因为ecx=5,所以esi指向of后面的 ,(这里有个空格);edi指向偏移量Ch
.text:00401016                 mov     ecx, dword_407038 ; ecx=chin
.text:0040101C                 mov     dx, word_40703C ; dx=a\0
.text:00401023                 xor     eax, eax        ; eax=0
.text:00401025                 mov     [esp+34h+var_28], ecx ; 偏移量28h到25h为chin
.text:00401029                 movsw                   ; edi指向偏移量为Ah
.text:0040102B                 mov     [esp+34h+var_A], eax ; A到7h为0
.text:0040102F                 mov     [esp+34h+var_24], dx ; 24到23h为a\0
.text:00401034                 mov     [esp+34h+var_6], eax ; 6到3h为0
.text:00401038                 lea     esi, [esp+34h+var_28] ; esi指向china的开始;eax指向People的开始
.text:0040103C                 lea     eax, [esp+34h+var_20]
.text:00401040
.text:00401040 loc_401040:                             ; CODE XREF: _main+62 j
.text:00401040                 mov     dl, [eax]       ; dl=P
.text:00401042                 mov     bl, [esi]       ; bl=c
.text:00401044                 mov     cl, dl          ; cl=bl=p
.text:00401046                 cmp     dl, bl          ; dl和bl比较
.text:00401048                 jnz     short loc_401068 ; 不等于则跳转
.text:0040104A                 test    cl, cl          ; 如果等于,则看cl是否为空
.text:0040104C                 jz      short loc_401064 ; 为空则跳转
.text:0040104E                 mov     dl, [eax+1]     ; 将下一个字符给dl
.text:00401051                 mov     bl, [esi+1]     ; 同上
.text:00401054                 mov     cl, dl
.text:00401056                 cmp     dl, bl          ; 再次比较
.text:00401058                 jnz     short loc_401068 ; eax=0
.text:0040105A                 add     eax, 2          ; 如果上面相等则偏移量加2
.text:0040105D                 add     esi, 2          ; 同上
.text:00401060                 test    cl, cl          ; 看cl是否为空,不为空则继续比较
.text:00401062                 jnz     short loc_401040 ; dl=P
.text:00401064
.text:00401064 loc_401064:                             ; CODE XREF: _main+4C j
.text:00401064                 xor     eax, eax
.text:00401066                 jmp     short loc_40106D ; 相当于跳出strcat
.text:00401068 ; ---------------------------------------------------------------------------
.text:00401068
.text:00401068 loc_401068:                             ; CODE XREF: _main+48 j
.text:00401068                                         ; _main+58 j
.text:00401068                 sbb     eax, eax        ; eax=0
.text:0040106A                 sbb     eax, 0FFFFFFFFh ; eax=-1
.text:0040106D
.text:0040106D loc_40106D:                             ; CODE XREF: _main+66 j
.text:0040106D                 test    eax, eax        ; 看eax是否为0
.text:0040106F                 jz      short loc_40107E ; 为0则跳转
.text:00401071                 push    offset aYes     ; "yes\n"
.text:00401076                 call    sub_4010C0      ; 输出yes
.text:0040107B                 add     esp, 4
.text:0040107E;***********以上为strcmp部分,下面为strcat部分*****************
.text:0040107E loc_40107E:                             ; CODE XREF: _main+6F j
.text:0040107E                 lea     edi, [esp+34h+var_28] ; edi指向china的开始
.text:00401082                 or      ecx, 0FFFFFFFFh
.text:00401085                 xor     eax, eax        ; 清空eax
.text:00401087                 lea     edx, [esp+34h+var_20] ; edx指向20h处
.text:0040108B                 repne scasb
.text:0040108D                 not     ecx             ; ecx等于china 的长度
.text:0040108F                 sub     edi, ecx        ; ebx为china字符的个数
.text:00401091                 push    edx
.text:00401092                 mov     esi, edi        ; esi指向china的开始
.text:00401094                 mov     ebx, ecx        ; ebx为china字符的个数
.text:00401096                 mov     edi, edx        ; 让edi指向20h处
.text:00401098                 or      ecx, 0FFFFFFFFh
.text:0040109B                 repne scasb             ; 让edi指向People's Republic of 末尾
.text:0040109D                 mov     ecx, ebx        ; 将china的长度给ecx
.text:0040109F                 dec     edi             ; edi回退一个,因为scas在执行后,偏移量要马上加1或者减1,这里是加1
.text:004010A0                 shr     ecx, 2          ; 除以4
.text:004010A3                 rep movsd               ; 按双字移动
.text:004010A5                 mov     ecx, ebx        ; 再次将china的长度给ecx
.text:004010A7                 and     ecx, 3          ; china的长度对3取余
.text:004010AA                 rep movsb               ; 按字节移动
.text:004010AC                 call    sub_4010C0      ; 输出结果
.text:004010B1                 add     esp, 4
.text:004010B4                 pop     edi
.text:004010B5                 pop     esi
.text:004010B6                 pop     ebx
.text:004010B7                 add     esp, 28h
.text:004010BA                 retn
.text:004010BA _main           endp


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 6
支持
分享
最新回复 (7)
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
嗯,需要这种简单小程序的反汇编经验积累
2012-8-16 16:38
0
雪    币: 71
活跃值: (227)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
你好,哥们,可以留个联系方式吗?
2012-8-17 08:13
0
雪    币: 1895
活跃值: (1672)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
试一下memcpy和memove。逆完了再google。看是否google出来的和你认识的是否一致。
2012-8-17 09:43
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我也来支持支持
2012-8-17 22:37
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
以前逆向了atexit函数在linux/Windows下的区别
2012-8-18 10:36
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我也试着将你的程序在VC++6.0中编译,并OD载入反汇编了一下,发现里面完全不一样。。。
2014-10-16 20:21
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
从最简单的例子入手,循序渐进,支持
2014-10-16 21:15
0
游客
登录 | 注册 方可回帖
返回
//