|
.-= {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-}=-. Introduction to Assembly Programming by Moe1 .-= {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-} {-=+=-}=-. This will cover how to write your first program in assembly using DEBUG.COM as shipped with Windows 9x and MS-DOS... C:\party2k>debug - a100 0C1B:0100 jmp 125 (Jumps to direction 125H) 0C1B:0102 [Enter] - e 102 'Happy Birthday FK!!!' 0d 0a '$' [ In function 09 of Int 21, as with most functions of int 21, the string is terminated with a "$" character. - Ed] - a125 0C1B:0125 MOV DX,0102 (Copies string to DX register) [Actually the Segment:Offset address of where in memory the string is stored to DX:DS. Remember each register has a high and low order byte? - Ed] 0C1B:0128 MOV CX,000F (Amount of times the string will be displayed) 0C1B:012B MOV AH,09 (Copies 09 value to AH register) [09 is the function for MS-DOS to call - Ed] 0C1B:012D INT 21 (Displays string) [int 21h is the MS-DOS function call interrupt - Ed] 0C1B:012F DEC CX (Reduces in 1 CX) 0C1B:0130 JCXZ 0134 (If CX is equal to 0 jumps to 0134) 0C1B:0132 JMP 012D (Jumps to direction 012D) 0C1B:0134 INT 20 (Ends the program) 0C74:0136 [ENTER] (Now we start compiling our lil codey, awww how kewt;) - h 0136 0100 - n fkrulez.com - rcx CX 0000 : 0036 - w Writing 00036 bytes - q c:\party2k>fkrulez Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! Happy Birthday FK!!! So now as another practical example, let's look at how we would hide a program from Windoze using masm32. To do this we simply pass the program's process ID to the RegisterService() function thus registering the program as a service, which wont show up in the windows task list. .data ; first we define in our data section szKernel32 db "Kernel32.dll",0 szRSP db "RegisterServiceProcess",0 .code ; now we start the code start: push offset szKernel32 call GetModuleHandle ; get Kernel32.dll handle push offset szRSP push eax call GetProcAddress ; get function address mov ebx, eax ; save our pointer into ebx call GetCurrentProcessId ; get current process id push 1 ; 1 = Register Service, 0 = Unregister Serv. push eax ; process id call ebx ; call RegisterServiceProcess end start We could do this in any language which we can access the Win32 API from really, I just used assembly as an example because it's what we're playing with here. :) [ Some more additions from Wyzewun: And there you have it. If you're interested in getting involved with Assembly Programming, look around at the stuff available in the programming tutorials section of Packetstorm Security and particularly the tutorial available there made by the University of Guadalajara (don't ask me where that is) which is quite detailed. As you get better you will find other resources for ASM coding all over the place, so look around and you shouldn't have much trouble finding what you want. :) PacketStorm also has some great resources for other programming languages like C/C++, Pascal, JavaScript, Perl, Python - you name it. :) Mm, no TCL/TK yet, but I s'pose you can pick that up at other places. Also, try and see if you can get hold of the SAMS MS-DOS Bible - it's what I learnt what I know about assembly from and it's a great reference for DOS/Windoze ASM. Mmm, I'm still using the Second Edition (Covers MS-DOS 3.3) but I'm sure there are newer versions lying around. Well, I hope. Otherwise it won't be much use, now will it? :) ]