I have a great enthusiasm for researching technology, 18 this year. Since junior high school, the seeds of the desire to freely control the computer have been planted. It was the first year of high school that I saw the word programming in an information technology textbook for the first time, and the book took away a small example of drawing quadratic function graphs written in vb, but I didn't have a computer at home, and I didn't pay much attention to it. Since the summer vacation of the first year of high school, I have owned a computer. I want to learn programming, but the computer is not connected to the Internet, so I often download data software from other people's homes and go home to study.

Every time I download a bunch of things, including online tutorials, other people’s experiences, university courseware, and e-books in pdf format, and so on. At that time, I searched for programming information on the Internet, and the most was vc vb. I saw that people said that vb was the easiest, so I chose vb. I studied at home for a month. Since I have not been exposed to programming, I don’t understand some advanced terms, so The research process was bumpy and bumpy, and in the end it was just some basic sentences and some basic controls.

What makes me most proud and shameful is that I use vb to imitate the small game of Sokoban: drag three picture boxes on the form, one as a destination, one as a box for swimming, and one as being pushed box. The simulation of the game Sokoban was basically completed using only if else and assignment statements (what shame me was the concept of functions in my mind at the time, and I wrote a lot of repetitive code. The key is that I would not write a function in vb. Learning is rubbish).

I never call the api with vb. Although there are some source codes on the Internet that can be referred to, but I can’t understand it. Ten days before the start of the second year of high school, I downloaded Tan Haoqiang's C language course for home study.
在这里插入图片描述
Later, I found out that although I can't make window controls like vb in C language (because I use the console interface to learn at the beginning), I feel very concise, and I can figure out the ins and outs of the program in my mind, unlike vb. The language of the object, one method can handle everything, and I don’t know why. I fell in love with the C language at first sight. It took 3 days to read the more than 300 pages of Tan Haoqiang's ppt (I learned by skipping, most of them feel very easy to understand, and a small part of it is not understood), and then I read more Sample code, and write some simple small programs.

In the last semester of high school, I spent my spare time reading Wu Wenhu’s "Basics of Programming", which made me a little bit improved in algorithms and data structures (Since then, I have really stepped into the door of programming and learned to learn programming languages. The most basic thing is to understand its variable definition methods, various flow control statements, custom functions, program entry points, assignment statements are basically the same, as well as basic input and output functions, library functions, etc.).
在这里插入图片描述
In the last semester of high school, I also read "Principles of Computer Organization" (most of which did not understand), "Operating System" (most of them understood) and Charles Petzold's "Windows Programming" (preliminary step into Windows application programming) Gate), during the winter vacation of the second year of high school, I used vc to write a chat program using sdk (and only sdk programming) programming. The interface structure is very simple, one window, two edit boxes, and a send button. When the winter vacation was about to end, I came into contact with assembly language again.

One night before the start of the second semester of the second semester of high school, I occasionally opened the assembly language course of teacher Wang Shuang (why occasionally? I usually download a lot of materials. I built my own knowledge network between the jumps and complements of various materials). I didn’t want to learn compilation, but I understood part of it after reading it, so I became interested in it and bought one on Taobao. Ben Wang Shuang’s "Assembly Language", I went to school to study (I was still thinking that if I learned assembly language again, then I would be one step away from being a master). In school, I watch Wang Shuang’s "Assembly Language" whenever I have time. The more I look at it, the more exciting it gets. I deeply admire Wang Shuang’s detailed and thorough knowledge-shielding explanations, which I can understand by myself.
在这里插入图片描述
It’s just too shallow on paper, and writing programs that don’t use real guns and ammunition can’t lay a solid foundation. After returning home, I wrote the assembler in Notepad according to the example in the book, and then compiled and connected with tools such as masm. I used the debug that comes with Windows for debugging, although it was just a dark one running in protected mode. There is no output in a dos window, but I am really happy to see that my data runs correctly in the debug according to the results I want. (At that time, I also read some novels about programming, such as "Crazy Programmer" and "Rebirth Ace Hacker". The protagonist in the latter can directly use debug to write applications. From then on, I secretly told myself that in the future I will also To achieve such a goal. It seems that it is almost impossible now)
在这里插入图片描述
Later, I wrote a program that directly reads cmos to display the current time using a 16-bit assembly. The process of dealing with the underlying hardware is really cool, but there are still many things in the book that I have not practiced, such as direct reading Writing hard disk sectors, booting boot programs, installing interrupt programs, etc., because I was fascinated by two books: One is "Assembly Language Programming in Windows 32-bit Environment" by Luo Yunbin, and the other is written by me on the Internet. The e-book "Hackers Defense 2009: Hacker Programming vc Album".
在这里插入图片描述
在这里插入图片描述

[PDF electronic HD version of the supporting books of this article]

In the second half of the second half of the second semester of high school, I have been fully engaged in technical learning. In a state of confusion. After reading these two books, I realized that although what I did before was done on Windows, it has nothing to do with the system. It was from then that I felt that I had stepped into the palace of Windows. It is precisely because of this that my grades dropped from 10th to more than 30th in the class I enrolled in the second year of high school. (For those who are engaged in technology, don't mention the results) Thank you very much for those two books, which gave me a preliminary understanding of the mysterious Windows and gave me some practical programming examples for reference. In the process of reading these two books, I have a more thorough understanding of the relationship between C language and assembly language, which allows me to imagine the compiled assembly code in the process of writing C code in the future. Use od to view it. It is indeed So what happened. When I first learned the hook API, I downloaded an example code on the Internet. It was hooked by modifying the input table. Apart from that, I compiled it and looked at it first, and it passed (a dll code). Then used the method introduced by Luo Yunbin to write a dll-injected program, and took it to the virtual machine for a try, and it really prevented the task manager from terminating the program (the TerminateProcess function of the hook). But it doesn't work on the physical machine. The initial suspect is a system problem (xp on the virtual machine, win7 on the physical machine). Later, I hung up the task manager of win7 with od, and found that there was no TerminateProcess item in its input table. I thought it would not call this function, so I interrupted TerminateProcess without any interruption. In the process of continuing to trace and debug, it turned out to be a direct call to the ZwTerminateProcess function in ntdll. Now that you know the principle, think about countermeasures. I learned later that my method is called inline hook. Modifying the machine code to hook the function is my own thought, but I don't know that it already exists in this world.

The summer vacation of the second year of high school has finally arrived. Since entering the palace of Windows, my interest has increased, such as packing and shelling, game plug-ins, kernel drivers, and so on. I watched Tulip’s tutorials and watched "Encryption and Decryption". I used od to manually take off some simple shells such as UPX and ASPack. I used IDA to analyze the encryption algorithms of several small programs in the forum. Game plug-ins, and I have written a few win32 assembly small programs, which are all things that can't be put on the table. In short, I have played everything, but I have not studied everything deeply, and I have always stayed at the beginner level. I have played with the kernel, and I haven't read the books that introduce kernel programming. In the end, I wrote a kernel program like hello world. Seeing that the school will start in half a month, it feels like I haven't learned anything. So I decided to do something. Then write a remote control, using C language, pure SDK programming. I didn't have a good structure of this thing, so I covered my head and started. The first thing I wrote is the image transmission, the technical content is not high, that is, the screen pixel data is intercepted, compressed, and transmitted. Later, it was determined to use a large dialog box as the main interface of the software, adding the functions of file management, file transfer, CMDShell and text dialog. Because there is no good architecture, every time I write a function, I have to track down a lot of bugs, and then eliminate them in turn. In fact, the coding time is not much, the key is that a lot of time is spent on debugging and improvement. Two days before the start of high school, the various functions were completed as scheduled. I copied the control terminal to the USB flash drive (pure SDK programming, only about 100k!), and went to the neighbor's house to test. (Because the technical content is not enough, it cannot penetrate the intranet. Moreover, the CableModem of the broadcasting and television used in my home cannot be used for port mapping, so it can only be used as a controlled terminal for testing). After testing, in addition to the image transmission is a bit crappy, other functions are available, because they have been tested on the virtual machine before. Because it is pure sdk programming, the interface is also ugly and looks very unpleasant. In any case, this actual development made me experience the feeling of being an engineer. It was also a consolidation of the C language, and it also added experience for future development.

The third year of high school started. Under the pressure of my parents, I decided to study the courses in the school and test a better university. It was okay for the first week after school started, and then I was always terrified of my incomplete technology. So I took time off on the grounds of illness and went home to get my mobile phone. From then on, I decided to use my spare time in my senior year to study kernel programming. At the beginning I read "Windows Kernel Security Programming from Entry to Practice". This book covers a wide range, but it is not detailed, but most of the places I don't understand are from Zhang Fan's "Windows Driver Development Detailed Explanation" And found the answer on the Internet. There is also a relatively good book, "Lone Fishing in the Hanjiang...", the filter driver examples in it are also very detailed. Of course, I can't always look at the kernel. I need to switch thinking. In the past, I always wrote programs in C language, and I didn't look at C++ seriously.

So I took a serious look at C++, and then I learned BCB at home for a while. I can easily use some basic controls. The main purpose of learning this is to quickly process the interface. Later, I felt that I could not imagine the assembly code with C++, and I saw the book "C++ Reverse and Disassembly Revealed" in the forum, so I downloaded an e-book in pdf format on the Internet and read it on my mobile phone. . After reading it carefully for a period of time, I finally have a basic understanding of C++ disassembly. I saw that MFC is used for programming on the Internet, so I also got a copy of MFC. After reading it for a while, I also got some superficial understanding of the mechanism of MFC. Later when I arrived at home, I found a vs2010 mfc tutorial in Baidu Library, which was much easier to understand than the book. After reading it for a while, I wrote a dialog-based addition calculator program, and the interface is much better than the previous programming with SDK.

Currently, I am writing a program that intercepts window creation. The kernel layer hooks the NtCreateWindowEx function in ShadowSSDT, and the application layer uses mfc to design a dialog-based interface that can customize the interception rules (based on the window name, class name, and window size). The original intention of writing this program is to block the advertisement windows of software such as Xunlei Kugou, and the purpose is to practice what you have learned. I think that only by making practical programs can I have mastered that knowledge. When I returned to school, I had written both the kernel layer code and the application layer code separately, and did a simple test. The communication code between the kernel layer and the application layer was left unwritten, so I will finish it next time I go home. it. (The next time I go home, I will have winter vacation. In our senior year of high school, we usually go home once a month. But in order to learn programming, I often take time off to go home.)

This winter vacation I also want to make a software to practice what I learned from the book. After thinking about it, I still want to do a remote control (except for this thing, I don’t seem to know what to do), but this time I want to use it. A lot of kernel programming. (To give you a brief introduction to this remote control:

  • Use mfc to make a dialog-based interface, and use the skin library to beautify the interface (I haven't used it before, now learn to use it).
  • In the kernel layer, there are hidden processes, function hooks that bypass anti-software, callback hooks, and keyloggers.
  • The main functions are file management, file transfer, execution of cmd commands, and screenshots.
  • The mail system is used for communication (this can be controlled by sending mail through a mobile phone), and the efficiency of real-time transmission is not required.

Also, this is just a preliminary idea. I haven't tried using the mail system to communicate. )

If there is enough time during the winter vacation, I will have to study how to avoid killing. In the future, I plan to make a few small game plug-ins, mainly to improve my reverse analysis and debugging ability, but the basis for doing this is still positive programming experience.

In order to learn programming, my grades dropped. Parents were disappointed because of this. Teachers often talked to me. The purpose of posting this post is to ask friends to help me advise. Should I continue to learn programming, or should I go to a good school to study in a good school? Some people say that you can't learn anything in college, but I always feel that the learning atmosphere in a good college may be better. I am very confused, and I have not been able to calm down and study the school curriculum recently. Where is the road ahead? Friends, give some advice.


代码熬夜敲
210 声望354 粉丝

李志宽、前百创作者、渗透测试专家、闷骚男一位、有自己的摇滚乐队